在单个 GPU 上运行多个 MPI 等级时我真的需要 MPS,还是 Kepler 的 Hyper-Q 本身就足够了?

Posted

技术标签:

【中文标题】在单个 GPU 上运行多个 MPI 等级时我真的需要 MPS,还是 Kepler 的 Hyper-Q 本身就足够了?【英文标题】:Do I really need MPS when running multiple MPI ranks on a single GPU, or Kepler's Hyper-Q itself is enough? 【发布时间】:2014-12-13 11:09:30 【问题描述】:

基本上我想在单个 GPU (NVidia K20c) 上运行多个 MPI 等级,并且我知道 MPS 和 Kepler 的 Hyper-Q 的存在。

但是,我的问题是,Hyper-Q 本身是否足以满足我的需求?还是我必须使用 MPS? 根据上面的 Hyper-Q 链接,“启用 Hyper-Q 不需要额外的编码工作。只需要一个安装了 CUDA 5 并设置环境变量以让多个 MPI 等级共享 GPU 的 Tesla K20 GPU - Hyper -Q 然后就可以使用了。”

这是否意味着我根本不需要 MPS?

ps,我也知道关于类似主题的以下问题,但似乎并没有清楚地回答我的问题。 Do I have to use the MPS (MULTI-PROCESS SERVICE) when using CUDA6.5 + MPI?

谢谢。

【问题讨论】:

【参考方案1】:

您可以在单个 GPU 上运行多个 MPI 等级,而无需 MPS。在这种情况下,所有排名 (GPU) 代码都将序列化。给定等级的 GPU 代码只有在与前一个等级相关的 GPU 代码完全完成并退出 GPU 时才会开始执行。

如果您想让一个级别的 GPU 代码与另一级别的 GPU 代码同时执行,那么 MPS 将是必要的。如果与等级相关的 GPU 代码充分利用了 GPU,那么您不太可能从 MPS 中看到太多好处。可以观察到等级 GPU 代码可以与其他等级的 GPU 代码同时执行的显着优势。

【讨论】:

感谢您的快速回复。但我仍然不清楚 Hyper-Q 扮演什么角色。从上面的链接来看,Hyper-Q 本身似乎会“在主机和 GPU 之间提供 32 个工作队列,使多个 MPI 进程能够在 GPU 上并发运行”,而 Fermi 架构将串行化多个队列的执行。如果 Hyper-Q 也将所有等级序列化,那么 Hyper-Q 的意义何在?或者 Hyper-Q 只是硬件功能,它必须与 MPS 一起使用才能启用并行性,这是原始 Hyper-Q 帖子省略的重要一点?谢谢! 来自单个进程的 CUDA 任务和来自多个进程的 CUDA 任务之间存在差异。 Hyper-Q 为来自单个进程的请求消除了一些人为的并发障碍。但由于与 Hyper-Q 无关的 CUDA 行为,来自多个进程的请求仍会序列化。 MPS 充当“漏斗”,收集来自多个进程/rank 的 CUDA 任务并将它们像来自单个进程一样发送到 GPU,以便 Hyper-Q 生效。 非常感谢您的解释。

以上是关于在单个 GPU 上运行多个 MPI 等级时我真的需要 MPS,还是 Kepler 的 Hyper-Q 本身就足够了?的主要内容,如果未能解决你的问题,请参考以下文章

即使我们有单节点多 GPU 设置,也限制 MPI 在单 GPU 上运行

在多个分布式 CPU 上运行 PyTorch 数据加载器/数据集

OpenACC + MPI Fortran 程序入门

如何使用 Nvidia 多进程服务 (MPS) 运行多个非 MPI CUDA 应用程序?

MPI + GPU:如何混合两种技术

在同一个 GPU 上运行多个 tensorflow 进程是不是不安全?