全局内存写入在 CUDA 中是否被视为原子写入
Is global memory write considered atomic in CUDA?
全局内存写入在 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
中的同一条目。在这种情况下,没有原子保护或序列化机制可以产生可预测的结果。
相关文章:
- CUDA:统一内存和指针地址的更改
- CUDA 使用共享内存平铺 3D 卷积实现
- 在统一内存 CUDA C/C++ 中分配 2D 向量
- CUDA非法访问内核内存
- 在尝试使用CUDA分配内存时,我遇到了访问冲突写入位置错误
- CUDA 数组如何存储在 GPU 内存中?它们在物理上是线性的吗?
- 越界访问 CUDA 共享内存
- 矩阵矢量产品 CUDA 通过平铺和共享内存提高性能
- CUDA - 统一内存(至少是帕斯卡)
- CUDA 中的递归返回非法内存访问
- CUDA:来自不同翘曲但相同块的 2 个线程尝试写入相同的共享内存位置:危险?
- GPU 内存访问和使用 (CUDA)
- CUDA我的共享内存代码不起作用,我缺少什么
- 支持 CUDA 统一内存的系统分配器的操作系统版本
- 降低CUDA内核运行时:内核中矩阵的动态内存分配
- 在类中声明 CUDA __constant__内存
- CUDA:共享内存的超载以用多个数组实现还原方法
- 为什么CUDA共享内存比瓷砖矩阵乘法中的全局内存慢
- Mvapich在内核运行时在CUDA内存上僵局
- 我可以在CUDA设备上为包含浮点数数组的对象分配内存吗