4

从官方 NVIDIA Multi-Process Server文档看,我不清楚它是如何与 CUDA 流交互的

这是一个例子:

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

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

在这种情况下,

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

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

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

4

1 回答 1

7

考虑 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 流的活动将被序列化。发布给独立流的活动可能会同时运行。无论所讨论的流的来源如何,无论它们来自一个进程还是多个进程,这都是正确的。

于 2018-03-08T03:54:49.980 回答