【发布时间】:2014-01-17 00:30:03
【问题描述】:
我是OpenCL图像处理的初学者,我使用Win7+VS2010+OpenCL2.0+OpenCV247。 我PC的平台是intel i7 CPU + NvidIA GTX760。
这是我的工作:
-
我使用opencv从视频中读取图像(1920*1080),然后复制图像数据并获取数据指针。
uchar* input_data=(uchar*)(gray_image->imageData); -
然后我想在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); -
主要的处理工作在几个内核上,每个内核耗时不到0.1ms,都很正常。
clEnqueueNDRangeKernel( queue,kernel_box,2,NULL,global_work_size,local_work_size, 0,NULL, NULL); -
完成所有处理后,我想将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 读回的速度比写信给它。