【问题标题】:Shall I pool CUDA streams?我应该汇集 CUDA 流吗?
【发布时间】:2018-11-26 11:45:43
【问题描述】:

创建和销毁 CUDA 流的操作有多轻量级?例如。对于 CPU 线程,这些操作很繁重,因此它们通常会池 CPU 线程。我也应该汇集 CUDA 流吗?或者每次我需要它时创建一个流然后销毁它是否很快?

【问题讨论】:

    标签: c++ parallel-processing cuda stream pool


    【解决方案1】:

    来自 NVIDIA 的指导是您应该汇集 CUDA 流。这是马口中的评论,https://github.com/pytorch/pytorch/issues/9646

    创建、保留和销毁 CUDA 流是有成本的 PyTorch 大师。特别是:

    • 跟踪 CUDA 流需要原子引用计数
    • 销毁 CUDA 流可以(很少)导致隐式设备同步
    • 该 refcounting 问题已被提出作为扩展流的关注点 例如,跟踪以允许向后流式传输,这很明显 最好避免隐式设备同步,因为它经常导致 意外的性能下降。

    对于静态框架,推荐的最佳做法是创建所有 预先需要的流,并在工作完成后销毁它们。 这种模式并不立即适用于 PyTorch,而是一个 per 设备流池会达到类似的效果。

    【讨论】:

      【解决方案2】:

      创建流是否快速可能并不重要。创建一次然后重用它们总是比不断地创建和销毁它们更快。

      分摊延迟是否真正重要取决于您的应用程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-31
        • 2013-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 2010-12-22
        相关资源
        最近更新 更多