代码之家  ›  专栏  ›  技术社区  ›  tmlen

OpenCL死锁可能性

  •  2
  • tmlen  · 技术社区  · 6 年前

    我正在使用全球原子来同步OpenCL中的工作组。

    因此内核使用如下代码

    ... global volatile uint* counter;
    
    if(get_local_id(0) == 0) {
        while(*counter != expected_value);
    }
    barrier(0);
    

    等到 counter 成为 expected_value .

    在另一个地方

    if(get_local_id(0) == 0) atomic_inc(counter);
    

    从理论上讲,如果所有工作组都在并发运行,那么该算法应该始终有效。但是,如果一个工作组在另一个工作组完全完成后才开始,那么内核可能会死锁。

    在CPU和GPU(NVidia CUDA平台)上,它似乎总是工作的,有大量的工作组(超过8000个)。

    对于算法来说,这似乎是最有效的实现。(它对2D缓冲区中的每一行进行前缀求和。)

    OpenCL和/或NVidia的OpenCL实现是否保证了这一点?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Community Egal    4 年前

    OpenCL和/或NVidia的OpenCL实现是否保证 总是有效吗?

    就OpenCL标准而言,这是不能保证的(同样适用于CUDA)。现在 在实践中 ,由于您的特定OpenCL实现,它可能会很好地工作,但请记住 不保证 根据标准,请确保您了解实现的执行模型,以确保这是安全的,并且这样的代码不一定能够跨其他符合标准的实现进行移植。

    从理论上讲,如果所有工作组都在并发运行,那么该算法应该始终有效

    OpenCL指出,工作组可以以任何顺序运行,不一定是并行运行,甚至不一定是并发运行。CUDA也有类似的措辞,尽管CUDA 9确实支持一种形式的网格同步。

    OpenCL规范,3.2.2执行模型:内核实例的执行:

    一致性实现可以选择序列化工作组,以便正确的算法不能假定工作组将并行执行。没有安全且可移植的方法跨工作组的独立执行进行同步,因为一旦进入工作池,它们就可以按任何顺序执行。