奇怪的Cudamemcpy执行时间

时间:2016-07-22 11:29:32

标签: cuda

我目前正在开发一个Cuda代码,它可以逐个像素地计算两个图像(大小:2560x1706像素)的简单差异,以便比较CPU和GPU的执行时间。

我意识到" for"我的内核1000次迭代的循环有一个更重要的执行时间,我在循环之后直接执行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

1 个答案:

答案 0 :(得分: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");
....

这个时间应该是正确的。