全局内存写入在 CUDA 中是否被视为原子写入

Is global memory write considered atomic in CUDA?

本文关键字:内存 CUDA 全局 是否      更新时间:2023-10-16

全局内存写入在 CUDA 中是否被视为原子?

考虑以下 CUDA 内核代码:

int idx = blockIdx.x*blockDim.x+threadIdx.x;
int gidx = idx%1000;
globalStorage[gidx] = somefunction(idx);

全局内存写入globalStorage原子的吗?,例如,没有竞争条件,使得并发内核线程写入存储在globalStorage中的同一变量的字节,这可能会弄乱结果(例如parial写入)

请注意,我在这里谈论的不是像添加/子/位等原子操作,只是直接全局写入。

已编辑:重写示例代码以避免混淆。

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