【问题标题】:CUDA filtering a queueCUDA 过滤队列
【发布时间】:2012-10-23 20:08:57
【问题描述】:

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

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

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

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

您建议如何进行这种逐级过滤?

感谢您的回答和建议。

【问题讨论】:

    标签: filter cuda queue gpu gpgpu


    【解决方案1】:

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

    这是简单的伪代码:

    1. 初始化内存等
    2. foreach 阶段做
    3. 对所有元素运行过滤
    4. 对所有元素使用 compact/remove_if
    5. 重写元素或做其他事情(取决于使用的库)
    6. 如果最后阶段中断,则转到 4

    【讨论】:

    • 另请查看thrust::copy_if。我认为remove_if 是一种,在您的情况下可能会更贵。还可以查看 ArrayFire 库,它对单个 GPU 是免费的。如果你想实现自己的算法,请阅读Optimizing Parallel Reduction in CUDA
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2021-06-23
    • 2011-12-12
    相关资源
    最近更新 更多