【发布时间】:2018-11-26 11:45:43
【问题描述】:
创建和销毁 CUDA 流的操作有多轻量级?例如。对于 CPU 线程,这些操作很繁重,因此它们通常会池 CPU 线程。我也应该汇集 CUDA 流吗?或者每次我需要它时创建一个流然后销毁它是否很快?
【问题讨论】:
标签: c++ parallel-processing cuda stream pool
创建和销毁 CUDA 流的操作有多轻量级?例如。对于 CPU 线程,这些操作很繁重,因此它们通常会池 CPU 线程。我也应该汇集 CUDA 流吗?或者每次我需要它时创建一个流然后销毁它是否很快?
【问题讨论】:
标签: c++ parallel-processing cuda stream pool
来自 NVIDIA 的指导是您应该汇集 CUDA 流。这是马口中的评论,https://github.com/pytorch/pytorch/issues/9646:
创建、保留和销毁 CUDA 流是有成本的 PyTorch 大师。特别是:
- 跟踪 CUDA 流需要原子引用计数
- 销毁 CUDA 流可以(很少)导致隐式设备同步
- 该 refcounting 问题已被提出作为扩展流的关注点 例如,跟踪以允许向后流式传输,这很明显 最好避免隐式设备同步,因为它经常导致 意外的性能下降。
对于静态框架,推荐的最佳做法是创建所有 预先需要的流,并在工作完成后销毁它们。 这种模式并不立即适用于 PyTorch,而是一个 per 设备流池会达到类似的效果。
【讨论】:
创建流是否快速可能并不重要。创建一次然后重用它们总是比不断地创建和销毁它们更快。
分摊延迟是否真正重要取决于您的应用程序。
【讨论】: