奇怪的Cudamemcpy执行时间

奇怪的Cudamemcpy执行时间,cuda,Cuda,我目前正在编写一个Cuda代码,它计算两个图像(大小:2560x1706 px)的简单像素差,以便比较CPU和GPU的执行时间 我实现了内核1000次迭代的“for”循环,以获得更大的执行时间,并在循环之后直接执行cudaMemcpy(从设备到主机),以检索计算出的数据 然而,该cudaMemcpy的执行时间为2800毫秒,高于预期。我只是在问自己为什么我会得到这样的结果 以下是我的内核代码: __global__ void diff (unsigned char *data1 ,unsigne

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

我实现了内核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];
  }
}
\uuuuu全局\uuuuuu无效差异(无符号字符*数据1,无符号字符*数据2,整数*数据)
{
intv=threadIdx.x+blockIdx.x*blockDim.x;
if(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();
cudaprofilerst();
//Cuda分配
cudamaloc((void**)和dev_data1,N*sizeof(unsigned char));
cudamaloc((void**)和dev_data2,N*sizeof(unsigned char));
cudamaloc((void**)和dev_data_res,N*sizeof(int));
//Cuda内存拷贝
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);
//模拟nb_循环图像
对于(int m=0;m
以下是执行时间结果的屏幕截图:


CUDA内核启动是异步的,
cudaMemcpy
是阻塞调用。因此,您所谓的memcpy时间实际上是内核执行+memcpy时间。按如下方式更改代码:

...
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");
....
。。。
对于(int m=0;m

这个时间应该是正确的。

CUDA内核启动是异步的,而
cudaMemcpy
是一个阻塞调用。因此,您所谓的memcpy时间实际上是内核执行+memcpy时间。按如下方式更改代码:

...
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");
....
。。。
对于(int m=0;m

而且这个计时应该是正确的。

内核启动是异步的,所以你的计时是错误的。内核启动是异步的,所以你的计时是错误的。这实际上给了我正确的cudaMemcpy执行时间,在断言cudaDeviceSynchronize()之后。然而,我使用的是NVIDIA GT720,GPU的执行时间仅比CPU的执行时间快6倍。你觉得怎么样?不应该快100倍吗?这看起来一致吗?谢谢您的帮助。@Flow:您正在NVIDIA生产的最慢、接近当前GPU型号的计算机上运行代码。速度提高六倍似乎完全合理。数百次都没有。这实际上给了我正确的cudaMemcpy执行时间,在cudaDeviceSynchronize()断言之后。然而,我使用的是NVIDIA GT720,GPU的执行时间仅比CPU的执行时间快6倍。你觉得怎么样?不应该快100倍吗?这看起来一致吗?谢谢您的帮助。@Flow:您正在NVIDIA生产的最慢、接近当前GPU型号的计算机上运行代码。速度提高六倍似乎完全合理。几百次都没有。