「はじめてのCUDAプログラミング」の「8.1 1次元配列へのアクセス」について。
メモリアクセスの例として、1次元配列への足し算を挙げている。
挙げられているサンプルは、要素数Nの配列A、B、Cについて、
C[i] = A[i] + B[i]
を計算するというもの。
GPUで計算した場合とCPUで計算した場合とでどのような違いがあるかというと、CPUでこの計算をするとN回の計算となる一方、GPUで計算すると1スレッドにつき1回の計算をするだけで済むことになる。
処理のステップは、
- メモリ確保
ホストとGPUそれぞれにメモリ領域を確保する
- 初期値の用意
ホストメモリ上で配列A,B,Cを初期化
- GPUに初期値をコピー
GPUメモリにホストメモリから初期値をコピー
- カーネル関数をコール
カーネル関数をコールすることで計算を実行
- 解をGPUからホストにコピー
計算結果をGPUメモリからホストメモリにコピー
- 計算が正しく行われていることを確認
その後実行性能を求めているのだが、理論値の1/10の性能しかでていないという。また、式をより複雑なものに変えても性能が変わらない。このことから、実はグローバルメモリ転送が処理時間の大半を占めていることが説明されている。ここから、8.3 メモリアクセスの最適化へとつながる。
--