opencl中原子添加的行为

opencl中原子添加的行为,opencl,Opencl,我正在使用opencl上的一个示例: __kernel void atomic(__global int* x) { __local int a, b; a = 0; b = 0; a++; atomic_inc(&b); x[0] = a; x[1] = b; x[2]++; atomic_inc(x+3); } 以global\u size=1024和workgroup\u size=8运行此代码,这是以下输出: [1 8 1

我正在使用opencl上的一个示例:

__kernel void atomic(__global int* x) {
   __local int a, b;
   a = 0; b = 0;
   a++;
   atomic_inc(&b);

   x[0] = a;
   x[1] = b;
   x[2]++;
   atomic_inc(x+3);
  }
global\u size=1024
workgroup\u size=8
运行此代码,这是以下输出:

[1 8 1 1024]

除了为
x[1]
给定的值外,我可以理解所有情况下发生的情况。为什么
x[1]
的值不是1024而是8?

x[1]
下是
b
的存储值,这是一个驻留在
\u local
地址空间中的变量,意味着该变量由工作组中的所有工作项共享。每个工作组都将
b
初始化为0,并自动递增为8,因为工作组大小为8(每个工作项递增1)。

x[1]
下是
b
的存储值,这是驻留在
\uu local
地址空间中的变量,意味着该变量由工作组中的所有工作项共享。每个工作组都将
b
初始化为0,并自动递增为8,因为工作组大小为8(每个工作项递增1)。

当在函数中声明
\u local int b
时,工作项如何知道它是同一个变量?另外,最初,b被设置为0。这是实现细节。在您的测试中,所有工作项(竞争条件)都可以访问
b
,您只是看不到这一点,因为每个工作项都写入了相同的值。通常情况下,您会使用大小为工作组大小的本地缓冲区,或者将对
b
的访问限制为一次访问一个工作项。当在函数中声明
\u local int b
时,工作项如何知道它是同一个变量?另外,最初,b被设置为0。这是实现细节。在您的测试中,所有工作项(竞争条件)都可以访问
b
,您只是看不到这一点,因为每个工作项都写入了相同的值。通常,您将使用大小为工作组大小的本地缓冲区,或者将对
b
的访问限制为一次访问一个工作项。