opencl中的__local atomic

fel*_*ipe 4 atomic increment opencl

关于__local变量的原子访问:

我知道与本地业务相比,全球业务运营缓慢.从这个意义上讲,我想对一些变量进行原子访问.

我知道我可以在OpenCL中进行原子操作:

// Program A:
#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable
__kernel void test(global int * num)
{
    atom_inc(&num[0]);
}
Run Code Online (Sandbox Code Playgroud)

如何在给定工作组内的工作 - 工作组之间共享原子数据?

对于前:我想做那样的事情:

// Program B: (it doesn't work, just to show how I'd like it to be)
#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable
__kernel void test(global int * num, const int numOperations)
{
    __local int num;
    if (get_global_id(0) < numOperations) {
        atom_inc(&num);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,num值应返回:numOperations - 1;

这不可能吗?如果不是我怎么能这样做?

Ant*_*eru 5

通常,您有一个线程可以初始化共享(本地)原子,然后是一些障碍.即你的内核是这样开始的:

__local int sharedNum;
if (get_local_id (0) == 0) {
    sharedNum = 0;
}
barrier (CLK_LOCAL_MEM_FENCE);

// Now, you can use sharedNum
while (is_work_left ()) {
    atomic_inc (&sharedNum);
}
Run Code Online (Sandbox Code Playgroud)

没有太大的魔力 - 工作组中的所有项目都可以看到相同的局部变量,因此您可以像往常一样访问它.