在OpenCL中,我的理解是您可以使用barrier()
函数来同步工作组中的线程。我确实(通常)了解它们的用途以及何时使用它们。我也知道工作组中的所有线程都必须克服障碍,否则会出现问题。但是,到目前为止,每次我尝试使用障碍时,似乎都会导致我的视频驱动程序崩溃,或者出现有关访问某种无效内存的错误消息。到目前为止,我已经在2种不同的视频卡上看到了这一点(1个ATI,1个NVIDIA)。
因此,我的问题是:
barrier(CLK_LOCAL_MEM_FENCE)
和barrier(CLK_GLOBAL_MEM_FENCE)
有什么区别?我阅读了文档,但是对我来说还不清楚。 barrier(CLK_LOCAL_MEM_FENCE)
和barrier(CLK_GLOBAL_MEM_FENCE)
是否有一般规则? barrier()
会导致错误? 最佳答案
如您所述,障碍只能同步同一工作组中的线程。没有办法在内核中同步不同的工作组。
现在回答您的问题,规范对我也不清楚,但是在我看来,6.11.9节包含了答案:
因此,据我所知,在写入和读取__local
存储空间时应使用CLK_LOCAL_MEM_FENCE,而在写入和读取__global
存储空间时应使用CLK_GLOBAL_MEM_FENCE。
我没有测试这是否会慢一些,但是在大多数情况下,当我需要一个屏障并且怀疑哪个内存空间受到影响时,我只是将两者结合使用,即:
这样,您就不会有任何内存读/写排序问题(只要您确定组中的每个线程都经过了障碍,但是您已经意识到了这一点)。barrier(CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE);
希望能帮助到你。