在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);
    
    这样,您就不会有任何内存读/写排序问题(只要您确定组中的每个线程都经过了障碍,但是您已经意识到了这一点)。
    希望能帮助到你。

    10-01 13:19