cudaMalloc と cudaFree が同期呼び出しかどうかをテストしたいので、CUDA SDK の「simpleMultiGPU.cu」サンプル コードにいくつかの変更を加えました。以下は私が変更した部分です(追加された行はインデントされていません):
float *dd[GPU_N];;
for (i = 0; i < GPU_N; i++){cudaSetDevice(i); cudaMalloc((void**)&dd[i], sizeof(float));}
//Start timing and compute on GPU(s)
printf("Computing with %d GPUs...\n", GPU_N);
StartTimer();
//Copy data to GPU, launch the kernel and copy data back. All asynchronously
for (i = 0; i < GPU_N; i++)
{
//Set device
checkCudaErrors(cudaSetDevice(i));
//Copy input data from CPU
checkCudaErrors(cudaMemcpyAsync(plan[i].d_Data, plan[i].h_Data, plan[i].dataN * sizeof(float), cudaMemcpyHostToDevice, plan[i].stream));
//Perform GPU computations
reduceKernel<<<BLOCK_N, THREAD_N, 0, plan[i].stream>>>(plan[i].d_Sum, plan[i].d_Data, plan[i].dataN);
getLastCudaError("reduceKernel() execution failed.\n");
//Read back GPU results
checkCudaErrors(cudaMemcpyAsync(plan[i].h_Sum_from_device, plan[i].d_Sum, ACCUM_N *sizeof(float), cudaMemcpyDeviceToHost, plan[i].stream));
cudaMalloc((void**)&dd[i],sizeof(float));
cudaFree(dd[i]);
//cudaStreamSynchronize(plan[i].stream);
}
大きなループの cudaMalloc 行と cudaFree 行をそれぞれコメント アウトすると、2 GPU システムの場合、GPU の処理時間はそれぞれ 30 ミリ秒と 20 ミリ秒であることがわかり、cudaMalloc は非同期呼び出しであり、cudaFree は同期呼び出し。これが正しいかどうかはわかりません。また、CUDA アーキテクチャの設計上の問題が何であるかもわかりません。私の計算能力は 2.0 で、cuda4.0 と cuda5.0 の両方を試しました。