我应该池化 CUDA 流吗?

Ser*_*tch 4 c++ parallel-processing cuda pool stream

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

Edw*_*ang 5

NVIDIA 的指导意见是您应该池化 CUDA 流。下面是马嘴里的评论,https://github.com/pytorch/pytorch/issues/9646

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

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

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