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

10-04 12:56