【发布时间】:2016-01-20 23:25:53
【问题描述】:
我想在 openCL 中实现一个算法,该算法需要对 3D 灰度图像多次应用某种变换。我的内核有一个输入和一个输出图像。现在我想简单地交换输入和输出图像并再次应用内核。但是,一个图像是使用 read_only 创建的,而另一个图像是使用 write_only 创建的。这是否意味着我必须使用传统的缓冲区,或者是否有一些技巧,如何翻转两个图像,而无需先将它们从设备复制回主机并再次复制回设备?
【问题讨论】:
标签: opencl
我想在 openCL 中实现一个算法,该算法需要对 3D 灰度图像多次应用某种变换。我的内核有一个输入和一个输出图像。现在我想简单地交换输入和输出图像并再次应用内核。但是,一个图像是使用 read_only 创建的,而另一个图像是使用 write_only 创建的。这是否意味着我必须使用传统的缓冲区,或者是否有一些技巧,如何翻转两个图像,而无需先将它们从设备复制回主机并再次复制回设备?
【问题讨论】:
标签: opencl
您说:“但是,一个图像是使用 read_only 创建的,而另一个图像是使用 write_only 创建的”。显而易见的答案是:不要那样做,你会没事的。
不太明显的潜台词是:使用 writeonly/readonly 标志创建图像(通过 clCreateImage(...,CL_MEM_WRITE_ONLY/CL_MEM_READ_ONLY) 在主机端完成)和特定内部的访问类型之间存在差异内核(使用内核参数定义中的__read_only/__write_only 限定符指定)。
除非我完全弄错了,否则您可以毫无限制地安全地创建映像(即CL_MEM_READ_WRITE),然后将其用作内核的输入参数,并在下一次内核运行时将其用作输出参数。您只是不能在单个内核运行期间混合读/写访问。
【讨论】: