作为我的问题的快速背景,对于 x86,可以保证对于 32 位字对齐的 4 字节或对于 64 位字对齐的 8 字节的单个内存访问将是原子的。因此,您可以创建“良性数据竞争”,其中至少一个线程写入内存地址,而另一个线程从同一地址读取,并且读者不会看到不完整写入的结果。读取线程将看到写入的整个效果,或者不会。
CUDA 编程模型中创建这些“良性”数据竞争条件的要求是什么?例如,如果两个独立的线程从两个不同的 SM 上的两个独立但同时运行的块将 64 位值写入相同的全局内存地址,则每个线程都会原子地写入它们的整个 64 位值,而第三个观察者只读回完全更新的 64 位内存块?或者写入会以更小的粒度进行,因此如果第三个观察者在两个线程同时写入后尝试从内存地址读回,则只会看到部分写入?
我知道竞争条件通常是要避免的,但是如果放宽内存排序的要求,则无需显式使用原子读/写函数。话虽如此,这取决于单个读/写的原子性是什么(即,多少位以及对齐方式)。有谁知道我在哪里可以找到这些信息?