0

我正在尝试优化名为 LAMMPS ( https://github.com/lammps/lammps ) 的 MPI+CUDA 基准测试的性能。现在我正在运行两个 MPI 进程和两个 GPU。我的系统有两个插座,每个插座连接到 2 个 K80。由于每个 K80 内部包含 2 个 GPU,因此每个插槽实际上连接到 4 个 GPU。但我只在一个插槽中使用 2 个内核,以及连接到该插槽的 2 个 GPU(1 K80)。MPI 编译器是 MVAPICH2 2.2rc1,CUDA 编译器版本是 7.5。

这就是背景。我分析了应用程序,发现通信是性能瓶颈。我怀疑这是因为没有应用 GPUDirect 技术。所以我切换到 MVAPICH2-GDR 2.2rc1 并安装了所有其他必需的库和工具。但是 MVAPICH2-GDR 需要 Infiniband 接口卡,这在我的系统上不可用,所以我有运行时错误“通道初始化失败。系统上没有找到活动的 HCA”。根据我的理解,如果我们只想在一个节点上使用 1 K80 以内的 GPU,则不需要 Infiniband 卡,因为 K80 具有用于这两个 GPU 的内部 PCIe 开关。这些是我的疑惑。为了让问题更清楚,我将它们列出如下:

  1. 在我的系统中,一个插座连接到两个 K80。如果一个 K80 中的两个 GPU 需要与另一个 K80 中的 GPU 通信,那么我们要使用 GPUDirect 就必须有 IB 卡,对吗?

  2. 如果我们只需要使用1个K80内的两个GPU,那么这两个GPU之间的通信就不需要IB卡了,对吧?但是,MVAPICH2-GDR 至少需要一张 IB 卡。那么有什么办法可以解决这个问题吗?或者我必须在系统上插入 IB 卡?

4

1 回答 1

5

在我的系统中,一个插座连接到两个 K80。如果一个 K80 中的两个 GPU 需要与另一个 K80 中的 GPU 通信,那么我们要使用 GPUDirect 就必须有 IB 卡,对吗?

唯一需要 IB 卡的情况是当您拥有从系统到系统的 MPI 通信(GPU 或其他)时。同一系统中的 GPU 不需要 IB 卡即可相互通信。下面是有关在此(单系统)设置中使用 GPUDirect 的更多信息。

如果我们只需要使用1个K80内的两个GPU,那么这两个GPU之间的通信就不需要IB卡了,对吧?但是,MVAPICH2-GDR 至少需要一张 IB 卡。那么有什么办法可以解决这个问题吗?或者我必须在系统上插入 IB 卡?

MVAPICH2 - GDR中的 GDR 指的是 GPUDirect-RDMA。GPUDirect 是一组允许 GPU 直接相互通信的技术的总称。

对于同一系统中的 GPU,GPUDirect 技术称为Peer-to-Peer。K80 上的两个 GPU 应该始终能够使用点对点相互通信,您可以使用名称中包含 P2P 的 CUDA 示例代码(例如simpleP2P )自己验证这一点。此示例代码还将告诉您您的系统是否能够支持同一系统中任意 2 个 GPU 之间的 P2P。

对于通过 IB(Infiniband)网络连接的独立系统中的 GPU,还有一种称为 GPUDirect-RDMA 的附加 GPUDirect 技术。这允许不同系统中的两个 GPU通过 IB 链路相互通信。

因此,由于 MVAPICH2-GDR 包含与 IB 相关的 GPUDirect RDMA,它可能会默认寻找 IB 卡。

但是,即使在单个系统中的 GPU 之间(例如使用 K80),您也应该能够通过使用支持 GPUDirect 的 MPI(包括某些风格的 MVAPICH2)来获得通信优势。这种用法简称为“CUDA-aware MPI”,因为它使用 GPUDirect P2P 但不一定是 RDMA。

关于如何设置的详细教程和演练超出了我在 SO 答案中所能提供的范围,但有关这种用法的更多信息,我建议您参考两篇彻底涵盖该主题的博客文章,第一篇是到这里,第二部分就到这里了。有关 GPUDirect-RDMA 的更多信息在这里

于 2016-07-21T14:03:48.107 回答