为什么数据下载比使用OpenCL上传GPU要慢得多?

时间:2013-12-30 05:57:18

标签: c++ opencv opencl gpu

我是OpenCL图像处理的初学者,我使用的是Win7 + VS2010 + OpenCL2.0 + OpenCV247。 我的PC平台是intel i7 CPU + NvidIA GTX760。

这是我的工作:

  1. 我用opencv从视频中读取图像(1920 * 1080),然后复制图像数据并获取数据指针。

    uchar* input_data=(uchar*)(gray_image->imageData);
    
  2. 然后我想在GPU上进行卷积和其他图像处理工作,所以我使用OpenCL将此数据(input_data)上传到之前创建的设备内存(cl_input_data)。上传步骤大约需要 0.2ms ,速度很快。

    clEnqueueWriteBuffer(queue, cl_input_data, 1,
        0, ROI_size*sizeof(cl_uchar), (void*)input_data, 0, 0, NULL);
    
  3. 主要处理工作在几个内核上,每个内核都需要不到0.1毫秒,这些内核都非常正常。

    clEnqueueNDRangeKernel( queue,kernel_box,2,NULL,global_work_size,local_work_size, 0,NULL, NULL);
    
  4. 完成所有处理后,我想将GPU内存(cl_output_data)下载到主机(output_data),这一步接管 5.5ms !这比数据上传步骤快了近27倍!

    clEnqueueReadBuffer( queue,cl_output_data,CL_TRUE,0,ROI_size * sizeof(char),(void*) output_data,0, NULL, NULL );
    
  5. 所以,我只是想知道,因为我使用相同的设备并且数据大小完全相同,为什么上传和下载数据的时间如此不同?

    哦,顺便说一句,我使用的时间测试工具就像QueryPerformanceFrequency(& m_Frequency);

    谢谢!

1 个答案:

答案 0 :(得分:5)

我记得,clEnqueueNDRangeKernel是异步调用。它将在不与设备同步的情况下返回控制。因此,当您测量clEnqueueNDRangeKernel的时间时,它只是启动时,而不是处理时间。 clEnqueueReadBuffer强制设备同步,并等待所有先前的内核调用完成。因此, 5.5 ms 包括内核执行时间。