安培、霍珀架构下多线程写入全局内存同一int地址的结果疑问
安培(Ampere)与霍珀架构下多线程写全局内存int地址的原子性问题
结论
在安培和霍珀架构中,多个线程向全局内存同一地址写入32位int类型值时,最终存储的必然是某一个线程写入的完整int值,绝不会出现像[byte1, byte2, byte7, byte8]这样的混合字节情况。
原理
这两种NVIDIA架构对32位对齐的全局内存写操作提供硬件级的原子性保障:每个32位写操作是不可分割的原子操作,要么完整写入某一线程的int值,要么完全不生效。在多线程竞态写的场景下,最终只会有一个线程的写操作完整覆盖目标地址,不会出现部分字节被不同线程写入的情况。
注意事项
- 上述保障仅针对对齐的32位访问:如果int数据未对齐,或者写入的是更大宽度的类型(比如64位long long),则必须使用CUDA原子操作函数(如
atomicExch)来确保操作原子性,否则可能出现部分字节覆盖的问题。 - 原子性不保证写操作的顺序:最终哪个线程的值被保留是不确定的,完全由硬件调度的竞态结果决定,但可以确定的是结果一定是完整的单个int值。
内容的提问来源于stack exchange,提问作者lei hu
相关产品推荐
相关产品推荐

