cuda-tutorial

2.3 ホストコード

先程も述べたとおり、ホスト側のコードは基本的にC/C++と遜色ないが、GPUを扱う上で異なる部分がいくつかある。 上の例のうち、C/C++と異なる部分を抜き出してきた。

int main(){
  ...
  //デバイスメモリのポインタの宣言
  float *vec1_dev, *vec2_dev;
  ...
  //デバイスメモリの割当
  cudaMalloc((void**)vec1_dev, NB * NT * sizeof(float));
  ...
  //カーネルの呼び出し
  addVec<<<NB,NT>>>(vec1_dev, vec2_dev);
  ...
  //デバイスからホストへデータの転送
  cudaMemcpy(vec, vec1_dev, NB * NT * sizeof(float), cudaMemcpyDeviceToHost);
  ... 
  //デバイスメモリの解放
  cudaFree(vec1_dev);
  ...
}

まず、カーネルでデバイスメモリを扱うためには、メモリを確保する必要がある。 そしてホストからカーネルを呼び出すことで実際にデバイス上のメモリを操作する。 もちろん操作後のデータをホスト側から見ることは出来ないので、デバイスからホストへ転送する処理も書く必要がある(逆もしかり)。 最後にデバイス側のメモリの解放も記載する必要がある。