【问题标题】:Why the data downloading is much slower than the uploading on GPU by using OpenCL?为什么使用 OpenCL 下载数据比在 GPU 上上传慢很多?
【发布时间】:2014-01-17 00:30:03
【问题描述】:

我是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.1ms,都很正常。

    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 );
    

所以,我就是想知道,既然我用的是同一个设备,数据大小也完全一样,为什么上传和下载数据的时间差这么多?

对了,我用的时间测试工具是QueryPerformanceFrequency(&m_Frequency);

谢谢!

【问题讨论】:

  • 简短的回答是,GPU 的设计假设数据从计算机的其余部分传输到 GPU,然后再传输到显示器。虽然显然可能将数据从 GPU 传回计算机的其余部分,但这并不是它的真正设计方式,因此速度要慢得多。
  • 感谢您的回答!!!所以你的意思是这不是异常情况,对吧?但是,我记得上传和下载的带宽几乎是一样的。我也很纳闷……
  • 副手,我不记得确切的数字,所以我不确定这是否完全正常,但作为一个总体思路:是的,从 GPU 读回的速度比写信给它。

标签: c++ opencv opencl gpu


【解决方案1】:

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

【讨论】:

  • 哇~!非常感谢!应该是这个问题!并且由于内核执行时间和数据下载时间混合在一起,我如何才能一一检测时间?
  • @DavidDing 你可以试试 clFinish(),然后启动你的计时器,然后下载缓冲区吗?
  • @DavidDing 你也可以使用 OpenCL 事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 2014-10-16
  • 2023-04-10
  • 2021-02-09
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多