我有几个 block ,每个 block 在大小为 512 的共享内存数组中都有一些整数。如何检查每个 block 中的数组是否包含零作为元素?
我正在做的是创建一个驻留在全局内存中的数组。该数组的大小取决于 block 的数量,它被初始化为 0。因此,如果共享内存数组包含零,则每个 block 都会写入 a[blockid] = 1
。
我的问题是当我在一个 block 中同时写入多个线程时。也就是说,如果共享内存中的数组包含多个零,那么几个线程将写入a[blockid] = 1
。这会产生任何问题吗?
也就是说,如果2个线程将完全相同的值写入全局内存中完全相同的数组元素会不会有问题?
最佳答案
对于一个 CUDA 程序,如果一个 warp 中的多个线程写入同一个位置,那么位置 将更新,但它是 未定义 多少次 位置已更新(即有多少实际写入连续发生),未定义 哪个线程将最后写入(即哪个线程将赢得比赛)。
对于计算能力为 2.x 的设备,如果一个 warp 中的多个线程写入同一个地址,那么实际上只有一个线程会执行写入,哪个线程未定义。
来自 CUDA C Programming Guide F.4.2 节:
If a non-atomic instruction executed by a warp writes to the same location in global memory for more than one of the threads of the warp, only one thread performs a write and which thread does it is undefined.
有关详细信息,另请参阅指南的第 4.1 节。
换句话说,如果写入给定位置的所有线程都写入相同的值,那么它是安全的。
关于c++ - 在同一全局内存位置并发写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5953955/