CUDA 中的块间同步

Inter-block synchronization in CUDA

我已经为这个问题搜索了一个月。我无法在 CUDA 中同步块。

我已经阅读了很多关于 atomicAdd、协作组等的文章。我决定使用一个全局数组,这样一个块就可以写入全局数组的一个元素。写完之后,一个block的线程等待(即陷入while循环)直到所有的block都写入全局数组。

当我使用 3 个块时,我的同步效果很好(因为我有 3 个 SM)。但是使用 3 个街区给我 12% 的入住率。所以我需要使用更多的块,但它们不能同步。 问题是:SM 上的一个块等待其他块,所以 SM 无法获得另一个块。

我能做什么?当区块超过SM数量时如何同步区块?

CUDA-GPU 规范:CC。 6.1, 3 SM, windows 10, VS2015, GeForce MX150 显卡。 请帮我解决这个问题。我使用了很多代码,但其中 none 有效。

进行块间同步的 CUDA 编程模型方法是

  1. (隐式)使用内核启动本身。在内核启动之前或完成之后,所有块(在启动的内核中)都同步到一个已知状态。无论内核是从主机代码启动还是作为 CUDA 动态并行启动的一部分,这在概念上都是正确的。

  2. (显式)在 CUDA Cooperative groups. This has a variety of requirements for support, which you are starting to explore in your . The simplest definition of support is if the appropriate property is set (cooperativeLaunch). You can query the property programmatically, using cudaGetDeviceProperties() 中使用网格同步。