OpenCL浮点数组简化为单布尔

OpenCL浮点数组简化为单布尔,opencl,Opencl,我有一个大的浮点数组,可能有数百万个单元格,还有一个算法,将对这些数据进行操作,直到它达到无法再做任何工作的状态。如果其中一个浮点值大于零,则应将布尔值设置为true,然后将其传递给主机,这意味着应再次安排内核执行。进行计算的每个单元格都有一个工作项。到目前为止,我已经考虑在整个数组上使用两级|=缩减,这似乎是正确的方法。另一个非常慢的方法是使用原子操作 由于我只想在某个工作项执行某些工作时设置一个特定的值,否则就不处理它,因此我是否可以传递一个全局布尔值,该值可以由每个工作组中的每个工作项修改

我有一个大的浮点数组,可能有数百万个单元格,还有一个算法,将对这些数据进行操作,直到它达到无法再做任何工作的状态。如果其中一个浮点值大于零,则应将布尔值设置为true,然后将其传递给主机,这意味着应再次安排内核执行。进行计算的每个单元格都有一个工作项。到目前为止,我已经考虑在整个数组上使用两级|=缩减,这似乎是正确的方法。另一个非常慢的方法是使用原子操作

由于我只想在某个工作项执行某些工作时设置一个特定的值,否则就不处理它,因此我是否可以传递一个全局布尔值,该值可以由每个工作组中的每个工作项修改,而无需使用原子,并且仍能达到预期效果?假设这个布尔值被初始化为false,并且只能由工作项设置为true,我会得到错误的结果吗?这是个坏主意吗?如果是,为什么

有趣的问题

由于我只想在某个工作项执行某些工作时设置一个特定的值,否则就不处理它,因此我是否可以传递一个全局布尔值,该值可以由每个工作组中的每个工作项修改,而无需使用原子,并且仍能达到预期效果

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

  • 请记住,如果(条件)shouldContinue=1,内核应该包含类似于
    的内容,而不是
    shouldContinue=condition
    ——即使后者具有更好的性能,也必须防止将0存储到内存中,因为您无法控制顺序

  • 因为您希望显式重写内存,所以我不会使用
    bool
    ,因为我希望确保系统不必在存储之前加载整个单词。事实上,我会选择一些足够大的类型,允许编译器在这里使用a,假设硬件和编译器支持这种类型-例如,使用占用整个缓存线的类型,例如
    int16
    ,并将其设置为某个值


它工作正常。不过我还没有试过非临时商店。谢谢!我现在使用相同的技术来减少bool:)找不到任何其他参考!