3

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

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

4

1 回答 1

3

有趣的问题。

因为我只想在工作项完成某些工作时设置一个特定值,否则我可以传递一个全局布尔值,每个工作组中的每个工作项都可以在不使用原子的情况下对其进行修改,并且仍然可以实现预期效果?

我认为这个提议会奏效,它可能是最有效的解决方案。不过有两个注意事项:

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

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

于 2013-06-06T11:58:20.100 回答