我想知道GPU缓存是如何工作的,以及原子操作如何处理全局数据(例如在新的Nvidia Maxwell架构上)。 假设我有以下代码片段(假设多个线程正在读取和写入包含D [u]和D [v]的缓存行):
__global float* D
(*(float*)a = D[u];
(*(float*)b = D[v] + c; //where c is some arbitrary value
while ((readback = atomic_cmpxchg((__global uint*)D[u], a, b)) != a)
{
a = readback; //read both again on a failue
(*(float*)b = D[v] + c;
}
现在如果某个其他线程写入D [u],则compare和swap将失败,我们必须通过读取D [u]的更新值来重试。但是,在传统的CPU多核中,我们知道如果其他一些线程写入D [v],底层高速缓存一致性会将D [v]的新值带到该线程。
然而,GPU不会遵循这种类型的一致性,如果他们想要阅读,那么这些写入必须对所有线程都是可见的。关于如何在GPU中工作的任何想法(如果其他线程写入D [v]并且我们没有在atomic_cmpxchg中失败)?
由于