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