级联图像在opencl中过滤而不使用纹理内存

时间:2015-01-12 10:27:19

标签: image-processing opencl imagefilter

我正在开发支持OpenCL 1.2嵌入式配置文件的自定义设备,并且没有图像支持或纹理内存。我必须通过Sobel滤波器然后通过中值滤波器传递图像。这可能是最好(最快)的方式吗?我可以避免在Sobel滤波器之后将图像发送回主机,然后在设备上将其读回中间滤波器吗?在哪里存储中间图像,全局内存,本地内存或其他地方?

1 个答案:

答案 0 :(得分:0)

您可以在内核调用之间将缓冲区保留在设备的全局内存中,以避免额外的副本。创建缓冲区时,请确保使用标记“CL_MEM_READ_WRITE”,这将允许Sobel内核写入它,然后使用Median内核从中读取。你可以使用两个缓冲区,但如果内存不是限制,我会使用三个缓冲区。

  1. 创建3个缓冲区。不管你喜欢什么,都可以打电话(originalBuff,middleBuff,finalBuff)
  2. 将图像数据复制到originalBuff
  3. 可选地将其他缓冲区设置为全零状态(可以由写入这些缓冲区的内核在设备上完成)
  4. 用params(originalBuff,middleBuff)
  5. 调用sobel过滤器内核
  6. 用params调用中值内核(middleBuff,finalBuff)
  7. 将finalBuff读回主持人
  8. 我省略了其他步骤,例如创建上下文/程序/队列等等,以便专注于你的问题的答案。

    Read about clCreateBuffer here.

    编辑: 我之前没有尝试过标志'CL_MEM_HOST_NO_ACCESS',但我认为值得一试。在我的例子中,middleBuff可能会从这个标志中受益。与大多数opencl功能一样,任何可能的好处都将取决于实现。

相关问题