【问题标题】:What is the relationship between NVIDIA MPS (Multi-Process Server) and CUDA Streams?NVIDIA MPS(多进程服务器)和 CUDA Streams 有什么关系?
【发布时间】:2018-03-07 23:35:16
【问题描述】:

从官方的 NVIDIA 多进程服务器 docs 一瞥,我不清楚它如何与 CUDA 流交互

这是一个例子:

App 0:向逻辑流 0 发布内核;

应用 1:向(它自己的)逻辑流 0 发布内核。

在这种情况下,

1) MPS 是否/如何“劫持”这些 CUDA 调用?它是否全面了解每个应用程序使用哪些流以及哪些流中包含哪些内核?

2) MPS 是否创建自己的 2 个流,并将各自的内核放入正确的流中?或者 MPS 是否有可能通过流以外的机制实现内核并发?

如果有帮助,我对 MPS 在 Volta 上的工作方式很感兴趣,但是关于旧架构的信息也很受欢迎。

【问题讨论】:

  • 从程序员的角度来看,没有关系。它们是正交的。您不太可能获得关于 MPS 如何在后台工作的准确描述,因为该信息未在任何地方发布,并且可能会发生变化。无论如何,这些并没有真正让我觉得是编程问题。
  • 感谢您的回复。可以说 NVIDIA 没有发布关于 (1) 和 (2) 的信息吗?
  • 是的,这是我的观点。如果您愿意,我可以提供答案,但它会包含很多“未发布或未指定”
  • 罗伯特,任何事情都会有所帮助。正如我们所说,我发现NVIDIA deck 中的第 21 张及以后的幻灯片确实暗示了使用多个流。

标签: cuda gpu nvidia cuda-streams


【解决方案1】:

考虑 MPS 的一种方式是,它充当来自多个进程的 CUDA 活动的漏斗,在 GPU 上发生,就好像它们来自单个进程一样。 MPS 的具体好处之一是,即使内核来自不同的进程,理论上内核并发也是可能的。 “普通”的 CUDA 多进程执行模型会序列化此类内核执行。

由于单个进程中的内核并发意味着所讨论的内核被发布到单独的流中,因此从概念上讲,MPS 将来自各个客户端进程的流视为完全独立的。自然,如果您分析这样的 MPS 设置,流将显示为彼此分离,无论它们是与单个客户端进程关联的单独流,还是跨多个客户端进程的流。

在 Volta 之前的情况下,MPS 不保证内核活动与不同进程之间的进程隔离。在这方面,它非常像一个漏斗,从多个进程中获取活动并将其发布到 GPU,就好像它是从单个进程中发出的一样。

在 Volta 案例中,来自不同进程的活动从执行的角度(例如并发性等)表现得就像来自单个进程一样,但来自不同进程的活动仍然带有进程隔离(例如独立的地址空间)。

1) MPS 是否/如何“劫持”这些 CUDA 调用?它是否全面了解每个应用程序使用了哪些流以及哪些流中包含哪些内核?

是的,CUDA MPS 可以理解来自给定进程的单独流,以及向每个流发出的活动,并在向 GPU 发出工作时保持这种流语义。据我所知,MPS 如何处理 CUDA 调用的具体细节尚未公布。

2) MPS 是否创建自己的 2 个流,并将各自的内核放入正确的流中?或者 MPS 是否有可能通过流以外的机制实现内核并发?

MPS 维护所有客户端的所有流活动以及 CUDA 流语义。发布到特定 CUDA 流的活动将被序列化。发布给独立流的活动可能会同时运行。无论相关流的来源如何,无论是来自一个进程还是多个进程,这都是正确的。

【讨论】:

  • 感谢您的回答!
猜你喜欢
  • 2016-04-15
  • 1970-01-01
  • 2017-12-30
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多