私はCudaの学習者です。カーネル関数の実行時間を最適化したいと思います。その結果、私は2つの写真の違いを計算する短いプログラムを実現しました。だから私はCで古典的なCPUの実行、およびクーダC.Cudaカーネルの時間実行を最適化する
におけるGPUの実行間の実行時間を比較してここでは、私が話しているコードを見つけることができます。
int *imgresult_data = (int *) malloc(width*height*sizeof(int));
int size = width*height;
switch(computing_type)
{
case GPU:
HANDLE_ERROR(cudaMalloc((void**)&dev_data1, size*sizeof(unsigned char)));
HANDLE_ERROR(cudaMalloc((void**)&dev_data2, size*sizeof(unsigned char)));
HANDLE_ERROR(cudaMalloc((void**)&dev_data_res, size*sizeof(int)));
HANDLE_ERROR(cudaMemcpy(dev_data1, img1_data, size*sizeof(unsigned char), cudaMemcpyHostToDevice));
HANDLE_ERROR(cudaMemcpy(dev_data2, img2_data, size*sizeof(unsigned char), cudaMemcpyHostToDevice));
HANDLE_ERROR(cudaMemcpy(dev_data_res, imgresult_data, size*sizeof(int), cudaMemcpyHostToDevice));
float time;
cudaEvent_t start, stop;
HANDLE_ERROR(cudaEventCreate(&start));
HANDLE_ERROR(cudaEventCreate(&stop));
HANDLE_ERROR(cudaEventRecord(start, 0));
for(int m = 0; m < nb_loops ; m++)
{
diff<<<height, width>>>(dev_data1, dev_data2, dev_data_res);
}
HANDLE_ERROR(cudaEventRecord(stop, 0));
HANDLE_ERROR(cudaEventSynchronize(stop));
HANDLE_ERROR(cudaEventElapsedTime(&time, start, stop));
HANDLE_ERROR(cudaMemcpy(imgresult_data, dev_data_res, size*sizeof(int), cudaMemcpyDeviceToHost));
printf("Time to generate: %4.4f ms \n", time/nb_loops);
break;
case CPU:
clock_t begin = clock(), diff;
for (int z=0; z<nb_loops; z++)
{
// Apply the difference between 2 images
for (int i = 0; i < height; i++)
{
tmp = i*imgresult_pitch;
for (int j = 0; j < width; j++)
{
imgresult_data[j + tmp] = (int) img2_data[j + tmp] - (int) img1_data[j + tmp];
}
}
}
diff = clock() - begin;
float msec = diff*1000/CLOCKS_PER_SEC;
msec = msec/nb_loops;
printf("Time taken %4.4f milliseconds", msec);
break;
}
そして、ここでは私のカーネルです機能:私は各1
- CPUのためにこれらの実行時間を得
:1,3210ms__global__ void diff(unsigned char *data1 ,unsigned char *data2, int *data_res) { int row = blockIdx.x; int col = threadIdx.x; int v = col + row*blockDim.x; if (row < MAX_H && col < MAX_W) { data_res[v] = (int) data2[v] - (int) data1[v]; } }
- GPU:GPUの結果は、それがあるべきように、下のようにできない理由0,3229ms
私は疑問に思います。私はCudaの初心者ですので、いくつかの古典的なエラーがある場合包括してください。
EDIT1: フィードバックいただきありがとうございます。私はカーネルから 'if'条件を削除しようとしましたが、プログラムの実行時間はそれほど変わっていませんでした。
しかし、Cudaプロファイラをインストールした後、スレッドは同時に実行されていないと言いました。なぜ私はこのようなメッセージを持っているのか理解できませんが、CPUよりもGPUの方が5倍または6倍高速です。この比率は、各スレッドが1つのピクセルを他のすべてのスレッドと同時に処理することになっているため、より大きくなければなりません。私が間違っていることを知っていれば、それはひどいでしょう...
フロー。
CUDAはCではなくC++ベースです。 – Olaf
GPUの結果は、CPUの結果より4倍高速ですか?何を期待していたのですか? –
実行中のループはいくつですか? GPUとの間でコピーを行う場合、かなりのオーバーヘッドがあります。 –