opencl原子操作不支持';总工作项较大时,无法工作

opencl原子操作不支持';总工作项较大时,无法工作,opencl,atomic,Opencl,Atomic,我最近一直在和openCL合作。我创建了一个基本上只接受一个全局变量的内核 由内核中的所有工作项共享。内核再简单不过了,每个工作项都会增加result的值,result是全局变量。代码如下所示 __kernel void accumulate(__global int* result) { *result = 0; atomic_add(result, 1); } 当工作项的总数很小时,一切都会顺利进行。在我的MAC pro视网膜上,当工作项大约为400时,结果是正确的 但是,

我最近一直在和openCL合作。我创建了一个基本上只接受一个全局变量的内核 由内核中的所有工作项共享。内核再简单不过了,每个工作项都会增加result的值,result是全局变量。代码如下所示

__kernel void accumulate(__global int* result) {
    *result = 0;
    atomic_add(result, 1);
}
当工作项的总数很小时,一切都会顺利进行。在我的MAC pro视网膜上,当工作项大约为400时,结果是正确的

但是,当我增加全局大小时,例如,10000。而不是当你拿到1万的时候 返回存储在result中的数字,该值约为900,这意味着多个工作项可能同时访问全局


我想知道这类问题的可能解决方案是什么?谢谢你的帮助

*结果=0看起来像是问题所在。对于较小的全局大小,每个工作项都会这样做,然后以原子方式递增,从而为您留下正确的计数。但是,当全局大小大于可以同时运行的数量(这意味着它们分批运行)时,随后的批将结果重置回0。这就是为什么你没有得到完整的计数。解决方案:改为从主机端初始化缓冲区,这样应该很好。或者,要在设备上进行初始化,您只能从global_id==0开始初始化它,执行一个屏障,然后执行原子增量。

加上我的opencl版本是1.2。您就是人,Dithemaster!很有效,非常感谢!现在我只需要找到另一种方法来初始化全局变量。;)