先程も述べたとおり、ホスト側のコードは基本的に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);
...
}
まず、カーネルでデバイスメモリを扱うためには、メモリを確保する必要がある。 そしてホストからカーネルを呼び出すことで実際にデバイス上のメモリを操作する。 もちろん操作後のデータをホスト側から見ることは出来ないので、デバイスからホストへ転送する処理も書く必要がある(逆もしかり)。 最後にデバイス側のメモリの解放も記載する必要がある。