在不使用纹理内存的情况下在 opencl 中级联图像过滤器
Cascading Image filters in opencl without using Texture Memory
我正在开发支持 OpenCL 1.2 嵌入式配置文件但不支持图像或纹理内存的自定义设备。我必须先让图像通过 Sobel 过滤器,然后再通过中值过滤器。最好(最快)的方法是什么?我是否可以避免在 Sobel 过滤器之后将图像发送回主机,然后在设备上将其读回以进行中值过滤器?在哪里存储中间图像,全局内存,本地内存或其他地方?
您可以在内核调用之间将缓冲区保留在设备的全局内存中,以避免额外的副本。创建缓冲区时,确保使用标志 'CL_MEM_READ_WRITE',这将允许 Sobel 内核写入它,然后 Median 内核从中读取。您可以使用两个缓冲区,但如果内存不受限制,我会使用三个。
- 创建 3 个缓冲区。随心所欲地称呼他们。 (originalBuff, middleBuff, finalBuff)
- 复制图片数据到originalBuff
- 可选择将其他缓冲区设置为全零状态(可以由写入这些缓冲区的内核在设备上完成)
- 调用带有参数(originalBuff, middleBuff)的sobel滤波器内核
- 使用参数调用中值内核 (middleBuff, finalBuff)
- 将 finalBuff 读回主机
我省略了其他步骤,例如创建 context/program/queue/etc.. 以便专注于回答您的问题。
Read about clCreateBuffer here.
编辑:
我以前没有尝试过标志 'CL_MEM_HOST_NO_ACCESS',但我认为值得一试。在我的示例中,middleBuff 可能会受益于此标志。与大多数 opencl 功能一样,任何可能的好处都取决于实现。
我正在开发支持 OpenCL 1.2 嵌入式配置文件但不支持图像或纹理内存的自定义设备。我必须先让图像通过 Sobel 过滤器,然后再通过中值过滤器。最好(最快)的方法是什么?我是否可以避免在 Sobel 过滤器之后将图像发送回主机,然后在设备上将其读回以进行中值过滤器?在哪里存储中间图像,全局内存,本地内存或其他地方?
您可以在内核调用之间将缓冲区保留在设备的全局内存中,以避免额外的副本。创建缓冲区时,确保使用标志 'CL_MEM_READ_WRITE',这将允许 Sobel 内核写入它,然后 Median 内核从中读取。您可以使用两个缓冲区,但如果内存不受限制,我会使用三个。
- 创建 3 个缓冲区。随心所欲地称呼他们。 (originalBuff, middleBuff, finalBuff)
- 复制图片数据到originalBuff
- 可选择将其他缓冲区设置为全零状态(可以由写入这些缓冲区的内核在设备上完成)
- 调用带有参数(originalBuff, middleBuff)的sobel滤波器内核
- 使用参数调用中值内核 (middleBuff, finalBuff)
- 将 finalBuff 读回主机
我省略了其他步骤,例如创建 context/program/queue/etc.. 以便专注于回答您的问题。
Read about clCreateBuffer here.
编辑: 我以前没有尝试过标志 'CL_MEM_HOST_NO_ACCESS',但我认为值得一试。在我的示例中,middleBuff 可能会受益于此标志。与大多数 opencl 功能一样,任何可能的好处都取决于实现。