CUDA 中的块间同步
Posted
技术标签:
【中文标题】CUDA 中的块间同步【英文标题】:Inter-block synchronization in CUDA 【发布时间】:2019-05-15 13:47:57 【问题描述】:我已经为这个问题搜索了一个月。我无法在 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 显卡。 请帮我解决这个问题。我用了很多代码,但没有一个有效。
【问题讨论】:
你是对的 - 你不能在 CUDA 中同步块。 我可以,但是当 SM 的数量和块的数量相等时。没有办法是没有意义的。我需要它。 这很有意义。架构和编程模型基本上无法实现这种同步。如果这对您不起作用,那么您要么需要不同的算法,要么需要使用不同类型的并行硬件。仅仅因为你需要某样东西或认为它没有意义并不会自动使它成为可能 动态并行呢? 怎么样? 【参考方案1】:进行块间同步的CUDA编程模型方法是
(隐式)使用内核启动本身。在内核启动之前或完成之后,所有块(在启动的内核中)都会同步到一个已知状态。无论内核是从主机代码启动还是作为 CUDA 动态并行启动的一部分启动,这在概念上都是正确的。
(显式)在CUDA Cooperative groups 中使用网格同步。这有各种支持要求,您开始在other question 中探索这些要求。最简单的支持定义是如果设置了appropriate property (cooperativeLaunch
)。您可以使用cudaGetDeviceProperties()
以编程方式查询属性。
【讨论】:
感谢您的回复。但是哪种方式在性能上更好呢? 1)再次启动内核 2)使用动态并行 性能问题通常无法凭空回答。用另一种方式说“这取决于”。在许多情况下,在协作组中精心设计的启动可能比使用多个内核启动来实现同步更好。但是,这可能取决于确切的算法和您的编码技能。在使用动态并行性启动多个主机或启动多个设备之间,我认为没有什么值得推荐的。它们应该是相当的。以上是关于CUDA 中的块间同步的主要内容,如果未能解决你的问题,请参考以下文章