__opencl中的局部原子

__opencl中的局部原子,opencl,atomic,increment,Opencl,Atomic,Increment,关于u_局部变量的原子访问: 我知道,与本地运营相比,全球运营的速度很慢。从这个意义上说,我想对一些变量进行原子访问 我知道我可以在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(glo

关于u_局部变量的原子访问:

我知道,与本地运营相比,全球运营的速度很慢。从这个意义上说,我想对一些变量进行原子访问

我知道我可以在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]);
}
如何在给定工作组内的工作ITEN之间共享原子数据

例如:我想这样做:

// 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);
    }
}
//程序B:(它不起作用,只是为了说明我希望它是怎样的)
#pragma OPENCL扩展cl_khr_global_int32_base_atomics:启用
#pragma OPENCL扩展cl_khr_local_int32_base_atomics:启用
__内核无效测试(全局int*num,常量int num操作)
{
__局部整数;
if(获取全局id(0)
最后num值应该返回:numperations-1


这不可能吗?如果没有,我怎么做呢?

通常,您有一个线程初始化共享(本地)原子,然后是一些屏障。也就是说,您的内核是这样启动的:

__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);
}

它没有什么神奇之处——工作组中的所有项目都可以看到相同的局部变量,因此您可以像往常一样访问它。

您需要
atom_inc(&sharedNum,1)--详细信息请参见手册页:我刚刚写错了,正确的是:atom_inc(&sharedNum,1);顺便说一句,这不起作用,我把#pragma OPENCL EXTENSION cl#u khr#u int64#u base#u atomics:启用如果它是int,你不需要64位原子?您收到的错误消息是什么?“它不工作”没有帮助。错误如下:错误:调用“atom_inc”atom_inc没有匹配函数(&sharedNum,1);使用手册页:对于32位,它是atomic_inc: