2016-08-12 9 views
1

OpenCLにグローバルカウンタを追加したいと思っています。これはすべてのワークグループのすべてのワークアイテムで増やすことができます。私のカーネルでOpenCLでグローバルカウンタをアトミックインクリメントする方法

私は:

#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable 

void increase(volatile __global int* counter) 
{ 
    atomic_inc(counter); 
} 

__kernel void test() 
{ 
    volatile __global int* counter = 0; 
    increase(counter); 
    printf("Counter: %i",&counter); 
} 

私Hostcodeは、カーネルをエンキューするための最小pyopenclです:

import pyopencl as cl 

platform = cl.get_platforms()[0] 
devs = platform.get_devices() 
device = devs[0] 
ctx = cl.Context([device]) 
queue = cl.CommandQueue(ctx) 
mf = cl.mem_flags 

f = open('Minimal.cl', 'r') 
fstr = "".join(f.readlines()) 
prg = cl.Program(ctx, fstr).build() 
test_knl = prg.test 

def f(): 
    cl.enqueue_nd_range_kernel(queue,test_knl,(1,1,2),None) 
f() 

は、私は、出力が"Counter: i"の(おそらくランダム命じた)外観を表示することを期待、ここで、iは(私の場合2の)合計作業項目の数です。 代わりに私はプリントアウトを取得しません。私はプログラムの開発を再実行すると、それは完全に私のIDE(スパイダー)を殺害

pyopencl.cffi_cl.LogicError: clcreatecontext failed: <unknown error -9999> 

で失敗します。

答えて

3
volatile __global int* counter = 0; 

グローバルメモリへのポインタを作成するだけでは不十分です。その背後にはいくつかのグローバルメモリが必要です。

少なくとも2つのオプションがあります。

1)あなたはOpenCLの2.0の実装使用する場合は、プログラムのスコープの変数を作成することができます。

void increase(volatile __global int* counter) 
{ 
    atomic_inc(counter); 
} 

__global int counter = 0; 

__kernel void test() 
{ 
    volatile __global int* counterPtr = &counter; 
    increase(counterPtr); // or increase(&counter); 
    printf("Counter: %i",*counterPtr); 
} 

2)OpenCLのバッファを作成し、カーネルによってそれを渡します引数:

void increase(volatile __global int* counter) 
{ 
    atomic_inc(counter); 
} 

__kernel void test(__global int *counterArg) 
{ 
    volatile __global int* counterPtr = counterArg; 
    increase(counterPtr); // or increase(counterArg); 
    printf("Counter: %i",*counterPtr); 
} 
+0

がよさそうだが、私はOpenCLの2ではないよと2)__kernel機能に私にポインタ引数のポインタの指示のためのエラー」無効なアドレス空間を与えるので、1)私のために動作しません。__kernel void test(int * counterArg) " および "アドレス空間 "private"からアドレス空間 "global"への暗黙の変換は、初期化式ではサポートされていません。 volatile __global int * counterPtr = counterArg; " – Dschoni

+0

__kernel void test(__ global int * counterArg)に変更すると、このトリックを行うようです。 – Dschoni

関連する問題