OpenCL Float数组减少到单个bool

时间:2013-06-06 11:14:19

标签: opencl

我有大量的浮点数,可能有数百万个单元格和一个算法,它将对这些数据进行操作,直到达到无法完成更多工作的状态。如果这些浮点数大于零,则应将布尔值设置为true,然后传递给主机,这意味着应该再次安排内核执行。每个单元都有一个工作项进行计算。到目前为止,我已经考虑过对整个阵列使用两级|减少,这似乎是正确的做事方式。另一种非常缓慢的方法是使用原子操作。

因为我只想设置一个特定的值,如果一个工作项做了一些工作而不管它,否则我可以传递一个全局布尔值,它可以被每个工作组中的每个工作项修改而不使用原子和静止达到预期的效果?假设这个布尔值被初始化为false并且只能被工作项设置为true,我是否会得到错误的结果?这是一个坏主意,如果是这样,为什么?

1 个答案:

答案 0 :(得分:3)

有趣的问题。

  

因为我只想设置一个特定的值,如果一个工作项做了一些工作而不管它,否则我可以传递一个全局布尔值,可以被每个工作组中的每个工作项修改而不使用原子和仍然达到预期的效果?

我认为这个提案可行,而且它可能是最有效的解决方案。但需要注意两点:

  • 请记住,你的内核应该包含类似if (condition) shouldContinue = 1而不是shouldContinue = condition的内容 - 即使后者具有更好的性能,你必须防止将任何0存储到内存中,因为你没有控制订单。

  • 因为你想明确覆盖内存,我不会选择bool,因为我想确保系统不必在商店之前加载整个单词。事实上,我会选择一些足够大的类型,允许编译器在这里使用non-temporal store,假设硬件和编译器支持 - 例如使用占用整个缓存行的类型,例如int16,并将其设置为某个值。