一个K80内两个GPU的CUDA感知MPI

时间:2016-07-21 05:34:06

标签: cuda mpi infiniband multi-gpu mvapich2

我正在尝试优化名为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卡?

1 个答案:

答案 0 :(得分: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应始终能够使用Peer to Peer相互通信,您可以使用名称为simpleP2P的P2P的CUDA示例代码自行验证。此示例代码还将告诉您系统是否能够在同一系统中的任何2个GPU之间支持P2P。

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

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

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

如何设置它的详细教程和演练超出了我在SO答案中提供的内容,但是有关此类用法的更多信息,我会向您推荐两篇博文,其中详细介绍了此主题,第一部分是here,第二部分是here。有关GPUDirect-RDMA的更多信息是here