在CUDA 编程指南中指出,映射固定主机内存上的原子操作“从主机或其他设备的角度来看不是原子的”。我从这句话中得到的是,如果主机内存区域仅由一个 GPU 访问,则可以在映射的固定主机内存上执行原子操作(即使在多个同时内核中)。
另一方面,在Nicholas Wilt所著的《CUDA 手册》第 128 页中指出:
不要尝试在映射的固定主机内存上使用原子,无论是用于主机(锁定比较交换)还是设备(
atomicAdd()
)。在 CPU 方面,为锁定操作强制互斥的设施对于 PCI Express 总线上的外围设备是不可见的。相反,在 GPU 方面,原子操作仅适用于本地设备内存位置,因为它们是使用 GPU 的本地内存控制器实现的。
在映射的固定主机内存上从 CUDA 内核内部执行原子操作是否安全?我们能否依靠 PCI-e 总线来保持 atomics 的 read-modify-write 的原子性?