全局内存写在CUDA中被认为是原子的吗?

时间:2013-12-21 02:44:22

标签: c++ cuda nvidia atomic

在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等原子操作,只是直接全局写。

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

1 个答案:

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