【问题标题】:OpenCL: Page flipping / ping-pong buffer with image3D?OpenCL:带有image3D的页面翻转/乒乓缓冲区?
【发布时间】:2016-01-20 23:25:53
【问题描述】:

我想在 openCL 中实现一个算法,该算法需要对 3D 灰度图像多次应用某种变换。我的内核有一个输入和一个输出图像。现在我想简单地交换输入和输出图像并再次应用内核。但是,一个图像是使用 read_only 创建的,而另一个图像是使用 write_only 创建的。这是否意味着我必须使用传统的缓冲区,或者是否有一些技巧,如何翻转两个图像,而无需先将它们从设备复制回主机并再次复制回设备?

【问题讨论】:

    标签: opencl


    【解决方案1】:

    您说:“但是,一个图像是使用 read_only 创建的,而另一个图像是使用 write_only 创建的”。显而易见的答案是:不要那样做,你会没事的

    不太明显的潜台词是:使用 writeonly/readonly 标志创建图像(通过 clCreateImage(...,CL_MEM_WRITE_ONLY/CL_MEM_READ_ONLY) 在主机端完成)和特定内部的访问类型之间存在差异内核(使用内核参数定义中的__read_only/__write_only 限定符指定)。

    除非我完全弄错了,否则您可以毫无限制地安全地创建映像(即CL_MEM_READ_WRITE),然后将其用作内核的输入参数,并在下一次内核运行时将其用作输出参数。您只是不能在单个内核运行期间混合读/写访问

    【讨论】:

    • 插件:主机端标志用于计划。如果您有 2 个 GPU 运行 2 个使用相同参数的内核,则它不会阻塞其中一个内核,因为图像是只读的(因此可以安全地并行化)。对于内核方面,它类似于“const”,以确保用户不会意外写入它们。正如您所说,这里更简单的解决方案是不强制执行任何主机端标志,您就完成了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多