opencl中原子添加的行为
我正在使用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
__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
的访问限制为一次访问一个工作项。