2012-03-14 45 views
2

关于__local变量的原子访问原子:__local OpenCL中

我知道它的速度慢与当地的人相比,做全球业务。从这个意义上说,我想对一些变量进行原子访问。

我知道我可以做的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]); 
} 

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

为前:我想要做这样的事情:

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

到底NUM值应该返回:numOperations - 1;

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

回答

3

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

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

没有太多神奇的它 - 在工作组所有项目都可以看到同样的局部变量,所以你可以访问它像往常一样。

+0

您需要'atom_inc(&sharedNum,1);' - 请参阅手册页以了解详细信息:http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/atom_inc.html – Anteru 2012-03-15 15:35:22

+0

我只是写错了,正确的是:atom_inc(&sharedNum,1); 顺便说一句,这不起作用,我把#pragma OPENCL EXTENSION cl_khr_int64_base_atomics:enable – felipe 2012-03-15 17:07:44

+0

如果它是一个int,你不需要64位的原子?什么是你得到的错误信息? “它不工作”没有帮助。 – Anteru 2012-03-15 17:42:05