首页 > 解决方案 > 我应该汇集 CUDA 流吗?

问题描述

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

标签: c++parallel-processingcudastreampool

解决方案


来自 NVIDIA 的指导是您应该汇集 CUDA 流。下面是马嘴里的一句话,https ://github.com/pytorch/pytorch/issues/9646 :

在 PyTorch master 中创建、保留和销毁 CUDA 流是有成本的。尤其是:

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

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


推荐阅读