0

简短版:如何在 CUDA 中实现高效的过滤操作?

长版:我有一个遵循队列过滤语义的 CUDA 代码。我在队列中有大约 500 万个初始元素,代码使用“昂贵的”分阶段计算过滤它们。最终结果预计将保留约 1000 个元素,并且每个阶段移除的元素数量遵循指数衰减曲线(即第一阶段移除很多,最后阶段移除很少)。

由于在 GPU 中每个元素都是并行处理的(通过线程块),简单地运行“所有元素上的所有阶段”是非常浪费的。在给定阶段,一个元素可能会被保留,所有其他元素可能已经被移除,但计算会在所有剩余阶段继续进行,即使对于已经“准备好被移除”的元素也是如此。

更有效的方法是分别运行每个阶段,读取输入列表并将结果存储在中间输出列表中;然后让事情以乒乓模式运行。然而,这样做会产生显着的全局内存读写,更重要的是会对在输出列表上同步并发写入的 atomicInc 施加压力。

你会如何建议进行这种分阶段过滤?

感谢您的回答和建议。

4

1 回答 1

3

我建议你使用compactor remove_if。您可以使用CUDPP库或thrust. 除非您将计算所有元素的所有阶段,否则您无法避免在每个阶段之后写入全局内存。

这是简单的伪代码:

  1. 初始化内存等
  2. foreach 阶段做
  3. 对所有元素运行过滤
  4. 对所有元素使用 compact/remove_if
  5. 重写元素或做其他事情(取决于使用的库)
  6. If last stage break else goto 4
于 2012-10-23T12:08:57.173 回答