OpenCL:带 image3D 的页面翻转/乒乓缓冲区?
OpenCL: Page flipping / ping-pong buffer with image3D?
我想在 openCL 中实现一个算法,需要对 3D 灰度图像多次应用某种变换。我的内核有一个输入图像和一个输出图像。现在我想简单地交换输入和输出图像并再次应用内核。但是,一张图片是用 read_only 创建的,另一张是用 write_only 创建的。这是否意味着我必须使用传统缓冲区,或者是否有一些技巧,如何翻转两个图像,而无需先将它们从设备复制回主机并再次复制回设备?
你说:"However, one image was created with read_only and the other one with write_only"。显而易见的答案是:不要那样做,你会没事的。
不太明显的潜台词是:使用 writeonly/readonly 标志创建图像(这是在 host-side 上通过 clCreateImage(...,CL_MEM_WRITE_ONLY/CL_MEM_READ_ONLY)
) 和特定内核中的 access-type(在内核参数定义中用 __read_only
/__write_only
限定符指定)。
除非我完全弄错了,否则您可以毫无限制地安全地创建您的映像(即 CL_MEM_READ_WRITE
),然后将其用作内核的输入参数,对于下一个内核 运行,使用它作为输出参数。您不能在单个内核 运行.
期间混合 read/write 访问
我想在 openCL 中实现一个算法,需要对 3D 灰度图像多次应用某种变换。我的内核有一个输入图像和一个输出图像。现在我想简单地交换输入和输出图像并再次应用内核。但是,一张图片是用 read_only 创建的,另一张是用 write_only 创建的。这是否意味着我必须使用传统缓冲区,或者是否有一些技巧,如何翻转两个图像,而无需先将它们从设备复制回主机并再次复制回设备?
你说:"However, one image was created with read_only and the other one with write_only"。显而易见的答案是:不要那样做,你会没事的。
不太明显的潜台词是:使用 writeonly/readonly 标志创建图像(这是在 host-side 上通过 clCreateImage(...,CL_MEM_WRITE_ONLY/CL_MEM_READ_ONLY)
) 和特定内核中的 access-type(在内核参数定义中用 __read_only
/__write_only
限定符指定)。
除非我完全弄错了,否则您可以毫无限制地安全地创建您的映像(即 CL_MEM_READ_WRITE
),然后将其用作内核的输入参数,对于下一个内核 运行,使用它作为输出参数。您不能在单个内核 运行.