为什么使用OpenCL下载数据比在GPU上上传要慢得多
Why the data downloading is much slower than the uploading on GPU by using OpenCL?
我是OpenCL图像处理的初学者,我使用Win7+VS2010+OpenCL2.0+OpenCV247。我电脑中的平台是英特尔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!这比数据上传步骤慢了将近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毫秒包括内核执行时间。
相关文章:
- OpenCL 在 NVIDIA 和 Intel GPU 上启动内核时CL_INVALID_COMMAND_QUEUE
- 使用 NVIDIA GPU 在 Cygwin 中链接 OpenCL 库时遇到问题
- 我可以为nVIDIA GPU编写OpenCL-C++内核吗
- "CPU OpenCL Project"和"GPU OpenCL Project"的区别
- 在 GPU 上分配结构的 OpenCL 会导致垃圾
- 是否可以在多线程而不是 cuda/opencl C++运行 GPU?
- OPENCL发布GPU内存
- OpenCL - GPU 总和和 CPU 总和不同
- 使用OpenCL,如何获取GPU内存使用量
- OPENCL多重GPU积分 - SegFault将全局大小从32更改为64
- 在笔记本电脑上开发不支持 GPU 的 OpenCL 应用程序
- 为什么使用OpenCL下载数据比在GPU上上传要慢得多
- AMD GPU的OpenCL时间测量问题
- OpenCL 程序在使用 GPU 时冻结
- OpenCL for APU+GPU
- 如何使用OpenCL处理GPU内存中总大小过大的图像
- 如何使用NVidia GPU在Windows下逐步调试OpenCL GPU应用程序
- Linux下基于英特尔CPU/GPU的OpenCL开发
- 如何让 OpenCL 在我的 GPU 上运行
- 如何将字符串传递到GPU,并从内核获取字符串以显示它?(C++OpenCL)