我正在玩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_size = 1024
和workgroup_size = 8
运行此代码,这是以下输出:
[1 8 1 1024]
我可以理解除x[1]
给出的值之外的所有情况。为什么x[1]
的值不是1024而是8?
答案 0 :(得分:3)
x[1]
下的b
存储值是__local
地址空间中的变量,表示该变量由工作组中的所有工作项共享。每个工作组都将b
初始化为0并原子递增为8,因为工作组大小为8(每个工作项增加1)。