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