3

私のcudaコードが私のcpuコードよりも遅い理由を理解するのに苦労しています

私のデスクトップ構成は i7 2600S、geforce 560ti です。

私のコードは次のとおりです。

int** kernel_shiftSeam(int **MCEnergyMat, int **newE, int *seam, int width, int height,     int direction)
{
//time measurement
float elapsed_time_ms = 0;
cudaEvent_t start, stop; //threads per block

dim3 threads(16,16);
//blocks
dim3 blocks((width+threads.x-1)/threads.x, (height+threads.y-1)/threads.y);

int *device_Seam;

int *host_Seam;

int seamSize;
if(direction == 1)
{
    seamSize = height*sizeof(int);
    host_Seam = (int*)malloc(seamSize);
    for(int i=0;i<height;i++)
    host_Seam[i] = seam[i];
}
else
{
    seamSize = width*sizeof(int);
    host_Seam = (int*)malloc(seamSize);
    for(int i=0;i<width;i++)
        host_Seam[i] = seam[i];
}

cudaMalloc((void**)&device_Seam, seamSize);
cudaMemcpy(device_Seam, host_Seam, seamSize, cudaMemcpyHostToDevice);

global_host_MC = MCEnergyMat;
new_host_MC = newE;

//copy host array to device
cudaMemcpy(global_MC, global_MC2, sizeof(int*)*width, cudaMemcpyHostToDevice);
    for(int i=0;i<width;i++)
        cudaMemcpy(global_MC2[i], global_host_MC[i], sizeof(int)*height, cudaMemcpyHostToDevice);

cudaMemcpy(new_MC, new_MC2, sizeof(int*)*width, cudaMemcpyHostToDevice);
    for(int i=0;i<width;i++)
        cudaMemcpy(new_MC2[i], new_host_MC[i], sizeof(int)*height, cudaMemcpyHostToDevice);


cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, 0);

//do some operations on the 2d matrix
gpu_shiftSeam<<< blocks,threads >>>(global_MC, new_MC, device_Seam, width, height);

//measure end time for cpu calcuations
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&elapsed_time_ms, start, stop );

execTime += elapsed_time_ms;

//copy out the data back to host (RESULT)
for(int i=0;i<width;i++)
{
    cudaMemcpy(newE[i], new_MC2[i], sizeof(int)*height, cudaMemcpyDeviceToHost);
}

return newE;
}

800回ループしたところ、次の結果が得られました。

GPU 計算時間 (gpu_shiftseam 部分): 1176 ミリ秒 プログラムの合計実行時間: 22 秒

CPU 計算時間 (ホスト上の gpu_shiftseam と同じ操作): 12522 ミリ秒 合計プログラム実行時間: 12 秒

どうやら GPU の計算時間は CPU の計算時間よりもはるかに短いのですが、何らかの理由で GPU の合計プログラム実行時間はずっと長いのですが、その理由を知っている人はいますか? 割り当てているスレッド/ブロックの数が間違っているためですか? または、「遅さ」はデバイスにメモリを割り当てることから来ていますか?

どうもありがとう!

4

2 に答える 2

2

私の経験では、メモリアクセスが遅くなる一番の理由です。

アレイのコピーをプロファイリングして、費やされている時間を確認します。かなりの量である場合は、コードを最適化してみてください。for ループ内でコピーする代わりに、sizeof(int *) * height * width直接コピーできるかどうかを確認してください。memcpy を呼び出す回数を減らすと役立つはずです。

cudaMemcpy(global_MC, global_MC2, sizeof(int*)*width, cudaMemcpyHostToDevice);
cudaMemcpy(global_MC2, global_host_MC, sizeof(int)*height*width,cudaMemcpyHostToDevice);
于 2012-04-30T05:01:14.867 に答える
0

同様の経験があり、cudaMalloc がボトルネックであるのに対し、cudaMemcpy はボトルネックではないことがわかりました。私のデバイスでは、16 MB の割り当てに 160 ミリ秒かかったことを覚えています。ただし、CUDA メモリの割り当ては、実際の計算の前に、たとえば別の関数呼び出しによって行うことができます。したがって、メモリ割り当て時間は、スピードアップの計算に cudaMemcpy 操作を含めても、全体的なパフォーマンス測定 (スピードアップなど) から除外できます。

于 2014-09-30T18:05:45.863 に答える