C++ GPU缓存和原子OpenCL

C++ GPU缓存和原子OpenCL,c++,caching,opencl,gpu,nvidia,C++,Caching,Opencl,Gpu,Nvidia,我想知道GPU缓存是如何准确工作的,以及原子操作是如何处理全局数据的(例如,在新的Nvidia Maxwell体系结构上)。 假设我有以下代码片段(假设多个线程正在读写包含D[u]和D[v]的缓存线): 现在,如果其他线程写入D[u],那么比较和交换将失败,我们必须通过读取更新后的D[u]值重试。然而,在传统的CPU多核中,我们知道,如果其他线程写入D[v],底层缓存一致性将为该线程带来新的值D[v] 然而,GPU不遵循这种类型的一致性,因为写入必须对所有线程可见,如果它们想要读取。关于如何在G

我想知道GPU缓存是如何准确工作的,以及原子操作是如何处理全局数据的(例如,在新的Nvidia Maxwell体系结构上)。 假设我有以下代码片段(假设多个线程正在读写包含D[u]和D[v]的缓存线):

现在,如果其他线程写入D[u],那么比较和交换将失败,我们必须通过读取更新后的D[u]值重试。然而,在传统的CPU多核中,我们知道,如果其他线程写入D[v],底层缓存一致性将为该线程带来新的值D[v]

然而,GPU不遵循这种类型的一致性,因为写入必须对所有线程可见,如果它们想要读取。关于如何在GPU中实现这一点有什么想法吗(如果其他线程正在向D[v]写入数据,而我们在atomic_cmpxchg中没有失败)


谢谢首先计算,然后将结果分配给readback为true/false(可能为1/0)。你是说先赋值,然后比较吗?不是。所以你在做原子运算之前先读D[u]和D[v]。如果D[u]的值在读取和原子之间发生变化,则原子将失败。然而,在D[v]的情况下,这并没有实现,这也可能发生变化。在多核中,如果被线程更改,缓存一致性协议将为您提供最新的D[v]值。然而,GPU的情况并非如此。所以我想问,在这种情况下,GPU会读取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;
}