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
中的同一条目。在这种情况下,没有原子保护或序列化机制会产生可预测的结果。