2016-07-22 67 views
0

我目前正在研究計算兩個圖像(大小:2560x1706像素)的像素的簡單差異的Cuda代碼,以便比較CPU和GPU的執行時間。奇怪的Cudamemcpy執行時間

我意識到我的內核有1000次迭代的「for」循環有更重要的執行時間,並且我在循環之後直接執行cudaMemcpy(從設備到主機)以檢索計算的數據。

不過,這個cudaMemcpy的執行時間花了2800毫秒,比預期的要高。我只是在問自己爲什麼我會得到這樣的結果。

這是我的內核代碼:

__global__ void diff (unsigned char *data1 ,unsigned char *data2, int *data_res) 
{ 
    int v = threadIdx.x + blockIdx.x*blockDim.x; 

    if (v < N) 
    { 
    data_res[v] = (int) data2[v] - (int) data1[v]; 
    } 
} 

這裏是內核調用:

cudaProfilerStart(); 

    // Cuda allocation 
    cudaMalloc((void**)&dev_data1, N*sizeof(unsigned char)); 
    cudaMalloc((void**)&dev_data2, N*sizeof(unsigned char)); 
    cudaMalloc((void**)&dev_data_res, N*sizeof(int)); 

    // Cuda memory copy 
    cudaMemcpy(dev_data1, img1->data, N*sizeof(unsigned char), cudaMemcpyHostToDevice); 
    cudaMemcpy(dev_data2, img2->data, N*sizeof(unsigned char), cudaMemcpyHostToDevice); 
    cudaMemcpy(dev_data_res, imgresult->data, N*sizeof(int), cudaMemcpyHostToDevice); 

    //Simulate nb_loops images 
    for(int m = 0; m < nb_loops ; m++) 
    { 
     diff<<<blck_nb, thrd_nb>>>(dev_data1, dev_data2, dev_data_res); 
     //printf("%4d", m); 
    } 


    printf("WAITING FOR MEMCPY...\n"); 

    clock_t begin = clock(), diff; 

    cudaMemcpy(imgresult_data, dev_data_res, N*sizeof(int), cudaMemcpyDeviceToHost); 

    diff = clock() - begin; 
    float msec = diff*1000/CLOCKS_PER_SEC; 
    printf("\t \nTime of the MEMCPY : %2.3f ms\n", msec); 

    printf("MEMCPY DEVICE TO HOST OK!\n"); 

    cudaProfilerStop(); 

這裏是執行時間結果的截圖:

screenshot

+0

內核啓動是異步的,所以你的時間是錯誤的。 – talonmies

回答

2

CUDA內核啓動是異步的,cudaMemcpy是一個阻塞呼叫。所以你所調用的memcpy時間實際上是內核執行+ memcpy tiime。改變你的代碼是這樣的:

... 
for(int m = 0; m < nb_loops ; m++) 
{ 
    diff<<<blck_nb, thrd_nb>>>(dev_data1, dev_data2, dev_data_res); 
    //printf("%4d", m); 
} 

cudaDeviceSynchronize(); 
printf("WAITING FOR MEMCPY...\n"); 
.... 

這個時機應該是正確的。

+0

在斷言cudaDeviceSynchronize()之後,這實際上給了我正確的cudaMemcpy執行時間。 但是,我使用NVIDIA GT720,GPU執行時間僅比CPU執行時間快6倍。你對此有何看法?不應該快100倍?它看起來一致嗎? 感謝您的幫助。 – Flow

+0

@Flow:您正在NVIDIA產生的最慢的近GPU型號上運行您的代碼。六倍的加速似乎完全合理。數百次沒有。 – talonmies