【发布时间】:2012-10-23 20:08:57
【问题描述】:
短版:如何在 CUDA 中实现高效的过滤操作?
长版: 我有一个遵循队列过滤语义的 CUDA 代码。 我在队列中有大约 500 万个初始元素,代码使用“昂贵的”分阶段计算过滤它们。 最终结果预计将保留约 1000 个元素,并且每个阶段移除的元素数量遵循指数衰减曲线(即第一阶段移除很多,最后阶段移除很少)。
由于在 GPU 中每个元素都是并行处理的(通过线程块),简单地运行“所有元素的所有阶段”是非常浪费的。在给定阶段,一个元素可能会被保留,所有其他元素可能已经被移除,但计算会在所有剩余阶段继续进行,即使对于已经“准备好被移除”的元素也是如此。
更有效的方法是分别运行每个阶段,读取输入列表并将结果存储到中间输出列表;然后让事情以乒乓模式运行。 然而,这样做会产生大量的全局内存读写,更重要的是会对在输出列表上同步并发写入的 atomicInc 施加压力。
您建议如何进行这种逐级过滤?
感谢您的回答和建议。
【问题讨论】:
标签: filter cuda queue gpu gpgpu