NVIDIA MPS(多进程服务器)和 CUDA Streams 之间有什么关系?
What is the relationship between NVIDIA MPS (Multi-Process Server) and CUDA Streams?
从官方 NVIDIA 多进程服务器 docs 看了一下,我不清楚 它如何与 CUDA 流交互。
这是一个例子:
应用程序 0:向逻辑流 0 发布内核;
应用程序 1:将内核发布到(它自己的)逻辑流 0。
在这种情况下,
1) MPS "hijack" 是否/如何调用这些 CUDA?它是否完全了解每个应用程序使用了哪些流以及哪些内核在哪些流中?
2) MPS 是否创建自己的 2 个流,并将相应的内核放入正确的流中?或者 MPS 是否可能通过流以外的机制启用内核并发?
如果有帮助,我对 MPS 如何在 Volta 上工作很感兴趣,但也非常感谢有关旧架构的信息。
考虑 MPS 的一种方式是,它充当 CUDA activity 的漏斗,源自多个进程,在 GPU 上发生,就好像它们源自单个进程一样。 MPS 的具体好处之一是,即使内核来自不同的进程,理论上也可以实现内核并发。 "ordinary" CUDA multi-process 执行模型将序列化此类内核执行。
由于单个进程中的内核并发意味着所讨论的内核被发布到单独的流,因此从概念上讲,MPS 将来自各种客户端进程的流视为完全独立的。自然地,如果您分析这样的 MPS 设置,流将显示为彼此分离,无论它们是与单个客户端进程关联的单独流,还是跨多个客户端进程的流。
在 pre-Volta 案例中,MPS 不保证内核 activity 与不同进程之间的进程隔离。在这方面,它非常像一个漏斗,从多个进程中获取 activity 并将其发布到 GPU,就好像它是从单个进程中发布的一样。
在 Volta 案例中,来自不同进程的 activity 从执行的角度(例如并发性等)表现得就像来自单个进程一样,但是来自不同进程的 activity 仍然携带进程隔离(例如独立的地址空间)。
1) Does / how does MPS "hijack" these CUDA calls? Does it have full knowledge of , for each application, what streams are used and what kernels are in which streams?
是的,CUDA MPS 理解来自给定进程的单独流,以及向每个进程发出的 activity,并在向 GPU 发出工作时维护此类流语义。据我所知,MPS 如何处理 CUDA 调用的具体细节尚未公布。
2) Does MPS create its own 2 streams, and place the respective kernels into the right streams? Or does MPS potentially enable kernel concurrency via mechanisms other than streams?
MPS 跨所有客户端维护所有流 activity,以及 CUDA 流语义。 Activity 发布到特定的 CUDA 流中将被序列化。 Activity 发布到独立流可能 运行 同时。无论所讨论的流的来源如何,无论它们来自一个进程还是多个进程,都是如此。
从官方 NVIDIA 多进程服务器 docs 看了一下,我不清楚 它如何与 CUDA 流交互。
这是一个例子:
应用程序 0:向逻辑流 0 发布内核;
应用程序 1:将内核发布到(它自己的)逻辑流 0。
在这种情况下,
1) MPS "hijack" 是否/如何调用这些 CUDA?它是否完全了解每个应用程序使用了哪些流以及哪些内核在哪些流中?
2) MPS 是否创建自己的 2 个流,并将相应的内核放入正确的流中?或者 MPS 是否可能通过流以外的机制启用内核并发?
如果有帮助,我对 MPS 如何在 Volta 上工作很感兴趣,但也非常感谢有关旧架构的信息。
考虑 MPS 的一种方式是,它充当 CUDA activity 的漏斗,源自多个进程,在 GPU 上发生,就好像它们源自单个进程一样。 MPS 的具体好处之一是,即使内核来自不同的进程,理论上也可以实现内核并发。 "ordinary" CUDA multi-process 执行模型将序列化此类内核执行。
由于单个进程中的内核并发意味着所讨论的内核被发布到单独的流,因此从概念上讲,MPS 将来自各种客户端进程的流视为完全独立的。自然地,如果您分析这样的 MPS 设置,流将显示为彼此分离,无论它们是与单个客户端进程关联的单独流,还是跨多个客户端进程的流。
在 pre-Volta 案例中,MPS 不保证内核 activity 与不同进程之间的进程隔离。在这方面,它非常像一个漏斗,从多个进程中获取 activity 并将其发布到 GPU,就好像它是从单个进程中发布的一样。
在 Volta 案例中,来自不同进程的 activity 从执行的角度(例如并发性等)表现得就像来自单个进程一样,但是来自不同进程的 activity 仍然携带进程隔离(例如独立的地址空间)。
1) Does / how does MPS "hijack" these CUDA calls? Does it have full knowledge of , for each application, what streams are used and what kernels are in which streams?
是的,CUDA MPS 理解来自给定进程的单独流,以及向每个进程发出的 activity,并在向 GPU 发出工作时维护此类流语义。据我所知,MPS 如何处理 CUDA 调用的具体细节尚未公布。
2) Does MPS create its own 2 streams, and place the respective kernels into the right streams? Or does MPS potentially enable kernel concurrency via mechanisms other than streams?
MPS 跨所有客户端维护所有流 activity,以及 CUDA 流语义。 Activity 发布到特定的 CUDA 流中将被序列化。 Activity 发布到独立流可能 运行 同时。无论所讨论的流的来源如何,无论它们来自一个进程还是多个进程,都是如此。