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

Why the data downloading is much slower than the uploading on GPU by using OpenCL?

本文关键字:GPU OpenCL 下载 数据 为什么      更新时间:2023-10-16

我是OpenCL图像处理的初学者,我使用Win7+VS2010+OpenCL2.0+OpenCV247。我电脑中的平台是英特尔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.1ms,这都很正常。

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

    clEnqueueReadBuffer( queue,cl_output_data,CL_TRUE,0,ROI_size * sizeof(char),(void*) output_data,0, NULL, NULL );
    

所以,我只是想知道,既然我使用了相同的设备,数据大小完全相同,为什么上传和下载数据的时间如此不同?

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

谢谢!

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