2012-03-14 42 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