gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:44:12 25 4
gpt4 key购买 nike

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

关于c++ - 全局内存写入在 CUDA 中被认为是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20714860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com