我为这个问题搜索了一个月。我无法同步 CUDA 中的块。
我读过很多关于atomicAdd、合作组等的文章。我决定使用一个全局数组,这样一个块就可以在全局数组的一个元素上写入。写入之后,块的线程将等待(即陷入 while 循环),直到所有块都写入全局数组。
当我使用 3 个块时,我的同步效果很好(因为我有 3 个 SM)。但使用 3 个街区可以让我获得 12% 的入住率。所以我需要使用更多的块,但它们无法同步。
问题是:SM 上的一个块等待其他块,因此 SM 无法获取另一个块。
我能做些什么?当区块数量超过SM数量时,如何同步区块?
CUDA-GPU 规范:CC。 6.1、3 SM、Windows 10、VS2015、GeForce MX150 显卡。
请帮助我解决这个问题。我使用了很多代码,但没有一个起作用。
进行块间同步的 CUDA 编程模型方法是
(隐式)使用内核启动本身。在内核启动之前或完成之后,所有块(在启动的内核中)都会同步到已知状态。无论内核是从主机代码启动还是作为 CUDA 动态并行启动的一部分,这在概念上都是正确的。
(显式)使用网格同步CUDA合作团体 https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#cooperative-groups。这对支持有多种要求,您正在开始探索其他问题 https://stackoverflow.com/questions/53780815/how-can-using-cooperative-groups-feature-of-cuda-in-windows。支持最简单的定义是如果适当的财产 https://docs.nvidia.com/cuda/cuda-runtime-api/structcudaDeviceProp.html#structcudaDeviceProp_13c26ab51c96f39b115d7826337541914已设置 (cooperativeLaunch
)。您可以使用编程方式查询属性cudaGetDeviceProperties() https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE.html#group__CUDART__DEVICE_1g1bf9d625a931d657e08db2b4391170f0.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)