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

时间:2018-03-07 23:35:17

标签: cuda gpu nvidia cuda-streams

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

以下是一个例子:

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

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

在这种情况下,

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

  

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

是的,CUDA MPS了解来自给定进程的单独流以及发布给每个进程的活动,并在向GPU发布工作时维护此类流语义。据我所知,MPS处理CUDA呼叫的具体细节尚未公布。

  

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

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