CUDA入門 > 注意点

注意点


CPUとの同期
CPUとGPUは、非同期で処理が行われます。
そのため、GPUの関数を呼び出した直後は、
GPUでの処理が完了する前にCPUの処理が行われます。
ベンチマーク測定など、GPUの実行時間計測を行いたい場合は注意してください。

これを防ぐには、カーネル呼び出し直後に、以下の文を追加してください。

cudaThreadSynchronize()

※cudaMemcpyで転送する場合は、全スレッドの処理が完了してから転送するため、特に必要ありません。

使用例
#include <stdio.h> #include <cutil.h> #define N 10 __global__ void cudakernel(int *gpu){ gpu[threadIdx.x] += 1; } int main(){ int *gpu; int *x; x = (int *)calloc(sizeof(int), N); for( int i = 0; i < N; i++){ x[i] = 0; } CUDA_SAFE_CALL(cudaMalloc((void**)&gpu, sizeof(int)*N)); CUDA_SAFE_CALL(cudaMemcpy(gpu, x, sizeof(int)*N, cudaMemcpyHostToDevice)); dim3 blocks(1,1); dim3 threads(N,1); cudakernel<<< blocks, threads >>>(gpu); // 同期 CUDA_SAFE_CALL(cudaThreadSynchronize()); CUDA_SAFE_CALL(cudaMemcpy(x, gpu, sizeof(int)*N, cudaMemcpyDeviceToHost)); return 0; }