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

Cov*_*ovi 3 cuda gpu nvidia cuda-streams

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

这是一个例子:

应用0:将内核发布到逻辑流0;

App 1:将内核发布到(自己的)逻辑流0。

在这种情况下,

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

2)MPS是否创建自己的2个流,并将相应的内核放入正确的流?还是MPS可能通过流以外的机制启用内核并发?

如果有帮助,我对MPS在Volta上的工作方式很感兴趣,但是也希望了解有关旧体系结构的信息。

Rob*_*lla 5

思考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流中的活动将被序列化。发布给独立流的活动可能并发运行。无论所涉及的流来自何处,无论是来自一个流程还是多个流程,这都是事实。