我是一名學習Cuda的學生,我想優化內核函數的執行時間。結果,我意識到計算兩張圖片之間差異的簡短程序。所以,我比較在C經典的CPU執行,並在CUDA中C的GPU執行之間的執行時間優化Cuda內核時間執行
在這裏你可以找到我談論代碼:
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;
}
這裏是我的內核功能:
__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];
}
}
我獲得的這些執行時間爲每一個
- CPU:1,3210ms
- GPU:0,3229ms
我不知道爲什麼GPU結果不低,因爲它應該是。我是Cuda的初學者,所以如果有一些經典錯誤,請全面。編號1: 謝謝您的反饋。我試圖從內核中刪除'if'條件,但它並沒有改變我的程序執行時間。
但是,在安裝Cuda分析器後,它告訴我我的線程沒有併發運行。我不明白爲什麼我會有這種信息,但看起來確實如此,因爲我的GPU只比CPU有5到6倍的速度。這個比例應該更大,因爲每個線程都應該同時處理一個像素到所有其他線程。如果你對我做錯了什麼有所瞭解,那將是有益的...
流量。
CUDA不是C,而是基於C++的。 – Olaf
因此,您的GPU結果比CPU結果快四倍?你在期待什麼? –
您運行多少個循環?複製到/從GPU複製時會產生很大的開銷。 –