在 OpenCL 中,我的理解是你可以使用barrier()
同步工作组中线程的函数。我(通常)确实了解它们的用途以及何时使用它们。我还知道工作组中的所有线程都必须遇到障碍,否则会出现问题。然而,到目前为止,每次我尝试使用屏障时,似乎都会导致我的视频驱动程序崩溃,或者出现有关访问某种无效内存的错误消息。到目前为止,我已经在 2 个不同的显卡(1 个 ATI、1 个 NVIDIA)上看到了这一点。
所以,我的问题是:
- 知道为什么会发生这种情况吗?
- 有什么区别
barrier(CLK_LOCAL_MEM_FENCE)
and barrier(CLK_GLOBAL_MEM_FENCE)
?我阅读了文档,但我不清楚。
- 是否有关于何时使用的一般规则
barrier(CLK_LOCAL_MEM_FENCE)
vs. barrier(CLK_GLOBAL_MEM_FENCE)
?
- 是否有一个时刻在呼唤
barrier()
错误的参数类型会导致错误吗?
正如您所说,屏障只能同步线程在同一个工作组中。无法同步内核中的不同工作组。
现在回答你的问题,我也不清楚该规范,但在我看来,第 6.11.9 节包含了答案:
CLK_LOCAL_MEM_FENCE – 屏障函数将刷新任何
变量存储在本地内存中或在内存栅栏中排队以确保
对本地内存的内存操作的正确顺序。
CLK_GLOBAL_MEM_FENCE – 屏障函数将对内存栅栏进行排队
确保内存操作对全局内存的正确排序。
例如,当工作项写入缓冲区或
图像内存对象,然后要读取更新的数据。
因此,根据我的理解,在写入和读取时应该使用 CLK_LOCAL_MEM_FENCE__local
内存空间,以及写入和读取时的 CLK_GLOBAL_MEM_FENCE__global
内存空间。
我还没有测试这是否更慢,但大多数时候,当我需要屏障并且我怀疑哪个内存空间受到影响时,我只是使用两者的组合,即:
barrier(CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE);
这样,您就不应该遇到任何内存读取\写入顺序问题(只要您确定组中的每个线程都通过屏障,但您知道这一点)。
希望能帮助到你。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)