CUDA过滤队列

时间:2012-10-23 11:02:16

标签: filter cuda queue gpu gpgpu

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

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

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

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

  

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

感谢您的回答和建议。

1 个答案:

答案 0 :(得分:3)

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

这是一个简单的伪代码:

  1. Init memory等。
  2. foreach stage do
  3. 对所有元素运行过滤
  4. 对所有元素使用compact / remove_if
  5. 重写元素或执行其他操作(取决于使用过的库)
  6. 如果最后一个阶段打破其他goto 4