在CUDA中,全局内存写入是否为原子内存?
考虑以下CUDA内核代码:
int idx = blockIdx.x*blockDim.x+threadIdx.x;
int gidx = idx%1000;
globalStorage[gidx] = somefunction(idx);
全局内存是否写入globalStorage
atomic ?,例如没有竞争条件,以便并发内核线程写入存储在globalStorage中的同一变量的字节,这可能会导致结果混乱(例如,parial写入)?
请注意,我不是在谈论像add / sub / bit-wise等原子操作,只是直接全局写。
编辑:重写示例代码以避免混淆。
答案 0 :(得分:2)
CUDA中的内存攻击并非隐式原子。但是,只要idx
具有运行内核中每个线程的唯一值,您最初显示的代码本质上不是内存竞争。
所以你的原始代码:
int idx = blockIdx.x*blockDim.x+threadIdx.x;
globalStorage[idx] = somefunction(idx);
如果内核启动使用1D网格并且globalStorage
的大小合适,那么将是安全的,而第二个版本是
int idx = blockIdx.x*blockDim.x+threadIdx.x;
int gidx = idx%1000;
globalStorage[gidx] = somefunction(idx);
不会是因为多个线程可能会写入globalStorage
中的相同条目。没有原子保护或序列化机制可以在这种情况下产生可预测的结果。