【问题标题】:Do I need both a local and global memory barrier when writing form local memory to global将本地内存写入全局时,我是否需要本地和全局内存屏障
【发布时间】:2015-04-01 21:21:28
【问题描述】:

在我的内核中,每个线程写入本地内存中的一个区域,然后它们 从本地内存复制到全局内存。全局内存永远不会在内核中读取,只会写入。但是,本地内存缓冲区随后会在全局复制完成后写入。

在我的复制代码之后是否需要全局内存屏障和本地内存屏障,或者只是一个本地内存屏障:

【问题讨论】:

    标签: opencl


    【解决方案1】:

    在我的复制代码之后我需要一个全局内存屏障和一个本地内存屏障,还是只需要一个本地内存屏障?

    这取决于。没有代码,很难回答你的问题。

    在我的内核中,每个线程写入本地内存中的一个区域,然后从本地内存复制到全局内存。

    没有看到代码我无法回答你的具体情况,但基本上只有两种情况:

    1. 工作项从它们写入的同一内存中读取(数据在工作项之间共享):内存屏障不需要
    2. 从另一个工作项写入的内存中读取的工作项。 (数据在工作项之间共享):内存屏障是必需的

    内核中永远不会读取全局内存,只会写入。

    那么你就不需要全局内存屏障了。当您需要对读取器和写入器之间的操作进行排序时,需要使用屏障。如果没有读者(或没有作者),那么障碍就是多余的。

    【讨论】:

    • 谢谢。我做了一些研究,您在场景 #1 中所指的是“波同步”编程。不幸的是,这种方法似乎已被弃用,因为更新的硬件可以合并工作项,从而混合来自不同波前的工作项。请参阅此 AMD opencl 线程:devgurus.amd.com/thread/166895。但是您关于不需要全局内存屏障的观点非常有用:我已将其删除并替换为本地内存屏障。
    • 那么,如果你把关于波同步编程的部分去掉,只留下不需要全局内存屏障的部分,那么你确实回答了满分!
    • 我认为当来自不同波前的两个工作项在同一个硬件计算单元上处理时会出现问题。在这种情况下,需要一个内存屏障。我已经向 AMD OpenCL 用户组提交了一个问题......
    • 我已经改写了方案 1。但这与工作项合并无关。
    • 忘记硬件和波前。简单地遵循规则,如果内存没有被重用,那么就不需要屏障,如果它在不同的工作项中被重用,那么设置一个屏障以确保没有一个人在其他人读取之前写入。 OpenCL 与硬件无关(除非您想优化代码)
    猜你喜欢
    • 2016-04-02
    • 1970-01-01
    • 2022-09-23
    • 2014-06-05
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多