NVIDIA MPS(多进程服务器)和CUDA Streams之间有什么关系?

5
从官方的NVIDIA多进程服务器docs中浏览,我不清楚它如何与CUDA流交互。
这里有一个例子:
应用程序0:将内核发送到逻辑流0;
应用程序1:将内核发送到(自己的)逻辑流0。
在这种情况下,
1)MPS如何“劫持”这些CUDA调用?对于每个应用程序,它是否完全了解使用的流以及哪些内核位于哪些流中?
2)MPS是否创建自己的2个流,并将相应的内核放入正确的流中?还是MPS通过其他机制实现内核并发性而不是流?
如果有帮助的话,我对MPS在Volta上的工作方式感兴趣,但是关于旧架构的信息也会受到赞赏。

2
从程序员的角度来看,这两者之间没有任何关系。它们是正交的。你不太可能获得MPS如何在幕后工作的精确描述,因为这些信息没有发布在任何地方,而且很可能会改变。总的来说,这些问题并不真正让我想到编程。 - Robert Crovella
谢谢您的回复。可以说NVIDIA既没有公布关于(1)的信息,也没有公布关于(2)的信息吗? - Covi
是的,那是我的观点。如果您想要,我可以提供一个答案,但它会包含很多“这没有被发布或指定”的内容。 - Robert Crovella
任何帮助都会很有用,Robert。就在我们说话的时候,我发现这个NVIDIA演示文稿中的21页及以后的幻灯片确实暗示了使用多个流的可能性。 - Covi
1个回答

9
MPS的一种思考方式是,它充当一个漏斗,将来自多个进程的CUDA活动汇聚到GPU上,就好像它们来自单个进程一样。 MPS的一个具体好处是,即使内核来自不同的进程,也有理论上的可能性进行内核并发。 "普通" CUDA多进程执行模型会对这样的内核执行进行序列化。
由于单个进程中内核并发意味着相关内核被下发到不同的流(stream)中,因此从概念上讲,MPS将来自各个客户端进程的流视为完全独立的。因此,如果您分析此类MPS设置,则流将显示为互相独立的,无论它们是与单个客户端进程关联的单个流还是跨多个客户端进程的流。
在Volta之前,MPS不能保证来自不同进程的内核活动之间的进程隔离性。在这方面,它非常类似于一个漏斗,从几个进程中获取活动并将其作为单个进程下发到GPU上。
在Volta的情况下,来自不同进程的活动在执行角度(例如并发等)上表现得好像它来自单个进程,但来自不同进程的活动仍然具有进程隔离(例如独立地址空间)。
1)MPS如何“劫持”这些CUDA调用?它是否完全了解每个应用程序使用的流以及哪些内核位于哪个流中?
是的,CUDA MPS理解给定进程的不同流以及发出到每个流的活动,并在向GPU下发工作时维护这样的流语义。据我所知,有关CUDA调用如何由MPS处理的确切细节尚未公开。
2)MPS是否创建自己的2个流,并将相应的内核放入正确的流中?或者MPS是否通过其他机制实现内核并发,而不是流?
MPS在所有客户端中保持所有流活动和CUDA流语义。下发到特定CUDA流中的活动将被序列化。下发到独立流中的活动可能会并发运行。这适用于涉及流的来源的所有情况,无论其来自一个进程还是多个进程。

谢谢你的回答! - Covi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接