将数据从Mat/oclMat传输到cl_mem(OpenCV + OpenCL)

pon*_*ish 6 opencv opencl

我正在开发一个需要大量OpenCL代码的项目.我正在使用OpenCV的ocl模块来更快地开发我的项目,但有些功能没有实现,我将不得不编写自己的OpenCL代码.

我的问题是:将数据从Mat和/或oclMat传输到cl_mem数组的最快最便宜的方法是什么.重写一下,有没有一种很好的方法可以从oclMat或Mat中传输或排队(clEnqueueWriteBuffer)数据?

目前,我正在使用for循环从Mat读取数据(或从oclMat下载然后使用for循环),然后将其排队.结果证明这是昂贵的,因此我的问题.

感谢任何看到这个问题的人:)

Rom*_*yan 1

计算主机-设备互连中实现的内存带宽。

如果您获得约 60% 或更多的最大带宽,则您无需执行任何操作,内存传输将尽可能快。但是,如果您的带宽结果低于理论最大值的 55% - 60%,请尝试使用多个命令队列进行解锁操作(不要忘记最后同步)。另外,请注意平均图像大小。小数据传输通常具有较大的开销率。

如果您的设备使用共享内存,请使用内存映射而不是读/写,这可能会大大节省时间。如果设备有自己的内存,请应用固定内存技术,该技术在 NVIDIA OpenCL 最佳实践指南中有详细描述。