首页 > 解决方案 > CUDA 中的块间同步

问题描述

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

我已经阅读了很多关于 atomicAdd、合作组等的帖子。我决定使用全局数组,以便块可以写入全局数组的一个元素。在此写入之后,一个块线程等待(即陷入一个while循环),直到所有块都写入全局数组。

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

我能做些什么?块数多于 SM 数时,如何同步块?

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

标签: parallel-processingcudanvidiagpu

解决方案


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

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

  2. (显式)在CUDA 合作组中使用网格同步。这对支持有多种要求,您将在其他问题中开始探索这些要求。支持的最简单定义是是否设置了适当的属性( cooperativeLaunch)。您可以使用 以编程方式查询属性cudaGetDeviceProperties()


推荐阅读