【发布时间】:2019-12-30 10:05:43
【问题描述】:
我已经仔细阅读了文档,但由于不同 CUDA 版本的大量信息,我仍然感到困惑。
整个设备上是否只有一个默认流或 在主机 CPU 上有一个默认流每个进程?如果答案取决于 CUDA 的版本,能否也列出不同 CUDA 版本的情况?
【问题讨论】:
-
这会有什么明显的不同?
标签: cuda
我已经仔细阅读了文档,但由于不同 CUDA 版本的大量信息,我仍然感到困惑。
整个设备上是否只有一个默认流或 在主机 CPU 上有一个默认流每个进程?如果答案取决于 CUDA 的版本,能否也列出不同 CUDA 版本的情况?
【问题讨论】:
标签: cuda
默认情况下,CUDA 有一个每个进程的默认流。有一个编译器标志 --default-stream per-thread 将行为更改为每个主机线程的默认流,请参阅 documentation。
请注意,流和主机线程是硬件细节的编程级抽象。即使使用单个进程,您可以同时使用的流数量也是有限的,具体取决于硬件。例如,在 Fermi 架构上,所有流都被多路复用到一个硬件队列中,但由于 Kepler 有 32 个独立的硬件队列(参见CUDA Streams: Best Practices and Common Pitfalls)。
由于编程指南在这部分没有讨论多进程,我相信这些抽象并没有定义多进程场景的行为。至于多进程,正确的术语是“CUDA 上下文”,它是为每个进程甚至每个主机线程创建的(使用运行时 API 时)。一个设备上可以同时激活多少个上下文的问题:指南在3.4 Compute modes 中说,在 default 模式下,“多个主机线程可以使用该设备”。由于以下 exclusive-process 模式改为讨论 CUDA 上下文,我假设这意味着默认模式的描述甚至涵盖了来自多个进程的多个主机线程。
有关多进程并发的更多信息,请参见例如How do I use Nvidia Multi-process Service (MPS) to run multiple non-MPI CUDA applications?、Unleash legacy MPI codes with Kepler's Hyper-Q 和 CUDA Streams: Best Practices and Common Pitfalls。
最后,请注意,自 Kepler 架构以来,多进程并发就以这种方式工作,这是当今最古老的受支持架构。由于 Pascal 架构支持计算抢占(详见3.4 Compute modes)。
【讨论】:
--default-stream per-thread 是在 v7.0 中引入的。请参阅CUDA 7.0 Release Notes,第 2.1 章,第一个要点。