CUDA:单个设备上有多少个默认流?

Nya*_*uko 4 cuda

我已经仔细阅读了文档,但由于不同 CUDA 版本的大量信息,我仍然感到困惑。

整个设备上只有一个默认流还是主机 CPU 上每个进程都有一个默认流?如果答案取决于CUDA的版本,您能否也列出不同CUDA版本的情况?

Jak*_*ský 5

默认情况下,CUDA 有一个每个进程的默认流。有一个编译器标志--default-stream per-thread可将行为更改为每个主机线程默认流,请参阅文档

请注意,流和主机线程是硬件细节的编程级抽象。即使使用单个进程,您可以同时使用的流数量也是有限的,具体取决于硬件。例如,在 Fermi 架构上,所有流都被复用到单个硬件队列中,但自 Kepler 以来,有 32 个独立的硬件队列(请参阅CUDA 流:最佳实践和常见陷阱)。

由于编程指南在这一部分中没有讨论多进程,因此我相信这些抽象并没有定义多进程场景的行为。对于多进程,正确的术语是“CUDA 上下文”,它是为每个进程甚至每个主机线程(使用运行时 API 时)创建的。一个设备上可以同时激活多少个上下文的问题:指南在3.4 计算模式中说,在默认模式下,“多个主机线程可以使用该设备”。由于以下独占进程模式讨论的是 CUDA 上下文,因此我认为这意味着默认模式的描述甚至涵盖了来自多个进程的多个主机线程。

有关多进程并发的更多信息,请参阅如何使用 Nvidia 多进程服务 (MPS) 运行多个非 MPI CUDA 应用程序?利用 Kepler 的 Hyper-QCUDA Streams 释放旧版 MPI 代码:最佳实践和常见陷阱

最后,请注意,自开普勒架构以来,多进程并发就以这种方式工作,开普勒架构是当今最古老的支持架构。由于 Pascal 架构支持计算抢占(详细信息请参见3.4 计算模式)。

  • 旧版默认流是针对每个设备的。这可以通过多设备系统中的简单代码轻松证明。您的回答中的这一说法“请注意,它甚至不是针对每台设备的”是不正确的。 (3认同)