如何在OpenCL中增加全局计数器

如何在OpenCL中增加全局计数器,opencl,global,atomic,pyopencl,Opencl,Global,Atomic,Pyopencl,我想在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* count

我想在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);
}
我的主机代码是使内核排队的最小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中)。 相反,我没有打印出来。当我重新运行程序时,它失败了

pyopencl.cffi_cl.LogicError: clcreatecontext failed: <unknown error -9999>
pyopencl.cffi_cl.LogicError:clcreatecontext失败:
完全杀死我的IDE(Spyder)

volatile __global int* counter = 0; 
创建指向全局内存的指针是不够的。它后面一定有一些全局内存存储

至少有两种选择:

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

看起来不错,但1)对我不起作用,因为我不在OpenCL 2上,2)给我错误“指向_内核函数_内核无效测试(int counterArg)的指针参数的指针对象的地址空间无效”和“从地址空间“私有”到地址空间的隐式转换”全局在初始化表达式volatile\uuu global int counterPtr=counterArg中不支持;“更改为uu内核无效测试(uu global int*counterag)似乎就可以做到这一点。