【问题标题】:opencl atomic operation doesn't work when total work-items is large当总工作项很大时,opencl 原子操作不起作用
【发布时间】:2014-03-10 09:55:44
【问题描述】:

我最近一直在使用 openCL。我创建了一个基本上采用一个全局变量的内核 由内核中的所有工作项共享。内核再简单不过了,每个工作项都会增加 result 的值,它是全局变量。代码已显示。

__kernel void accumulate(__global int* result) {
    *result = 0;
    atomic_add(result, 1);
}

当工作项的总数很少时,一切都很好。在我的 MAC pro Retina 上,当工作项在 400 左右时,结果是正确的。

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

我想知道此类问题的可能解决方案是什么?感谢您的帮助!

【问题讨论】:

  • 加上我的opencl版本是1.2。

标签: opencl atomic


【解决方案1】:

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

【讨论】:

  • 你就是男人,Dithemaster!它有效,非常感谢!现在我只需要找到另一种方法来初始化全局变量。;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 2020-06-14
  • 1970-01-01
相关资源
最近更新 更多