5

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 の両方を試しました。

4

1 に答える 1

7

両方の機能は同期的です。

于 2012-12-21T22:22:30.953 に答える