简短版:如何在CUDA中实现高效的过滤操作?
长版: 我有一个遵循队列过滤语义的CUDA代码。 我在队列中有大约500万个初始元素,代码使用“昂贵的”阶段计算过滤它们。 预期最终结果将保留~1000个元素,并且每个阶段移除的元素的数量遵循指数衰减曲线(即,第一阶段移除很多,最后阶段移除很少)。
因为在GPU中,每个元素都是并行处理的(通过线程块),所以简单地运行“所有元素的所有阶段”都是非常浪费的。在给定阶段,可以保留一个元素,所有其他元素可能已被删除,但即使对于已经“准备删除”的元素,计算仍在所有剩余阶段继续进行。
更有效的方法是分别运行每个阶段,读取输入列表并将结果存储为中间输出列表;然后让事情在乒乓模式中运行。 但是,这样做会产生大量的全局内存读写,更重要的是会对同步写入输出列表的atomicInc施加压力。
你会如何建议进行这种阶段式过滤?
感谢您的回答和建议。
答案 0 :(得分:3)
我建议您使用compact
或remove_if
。您可以使用CUDPP
库或thrust
。除非你计算所有元素的所有阶段,否则你无法避免在每个阶段之后写入全局内存。
这是一个简单的伪代码: