我最近在使用openCL。我创建一个基本上采用一个全局变量的内核 由内核中的所有工作项共享。内核不能简单,每个工作项增加result的值,这是全局变量。代码显示。
__kernel void accumulate(__global int* result) {
*result = 0;
atomic_add(result, 1);
}
当工作项总数很少时,每件事都可以。在我的MAC pro视网膜上,当工作项目大约为400时,结果是正确的。
但是,当我增加全局大小时,例如10000.而不是在获取时获得10000 返回存储在result中的数字,该值大约为900,这意味着多个工作项可能同时访问全局。
我想知道这类问题的可能解决方案是什么?谢谢你的帮助!
答案 0 :(得分:2)
*result = 0;
看起来像是问题所在。对于小的全局尺寸,每个工作项都会以原子方式递增,从而为您提供正确的计数。但是,当全局大小变得大于可以同时运行的数量(这意味着它们分批运行)时,后续批次会将结果重置为0.这就是为什么您没有获得完整计数。解决方案:从主机端初始化缓冲区,你应该很好。或者,要在设备上进行初始化,您只能从global_id == 0初始化它,做一个屏障,然后再进行原子增量。