全局内存写入在 CUDA 中是否被视为原子操作?
考虑以下 CUDA 内核代码:
int idx = blockIdx.x*blockDim.x+threadIdx.x;
int gidx = idx%1000;
globalStorage[gidx] = somefunction(idx);
全局内存是否写入globalStorage
原子?,例如不存在竞争条件,导致并发内核线程写入存储在 globalStorage 中的同一变量的字节,这可能会弄乱结果(例如部分写入)?
请注意,我在这里讨论的不是像加/减/按位等原子操作,而是直接全局写入。
编辑:重写示例代码以避免混淆。
CUDA 中的内存访问不是隐式原子的。但是,您最初显示的代码本质上并不是内存竞赛只要idx
正在运行的内核中的每个线程都有一个唯一的值.
所以你原来的代码:
int idx = blockIdx.x*blockDim.x+threadIdx.x;
globalStorage[idx] = somefunction(idx);
如果内核启动使用一维网格并且globalStorage
大小合适,而您的第二个版本:
int idx = blockIdx.x*blockDim.x+threadIdx.x;
int gidx = idx%1000;
globalStorage[gidx] = somefunction(idx);
不会是因为多个线程可能会写入相同的条目globalStorage
。在这种情况下,没有原子保护或序列化机制可以产生可预测的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)