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

sil*_*amb 0 cuda mpi multi-gpu infiniband mvapich2

我正在尝试优化称为LAMMPS的MPI + CUDA基准测试的性能(https://github.com/lammps/lammps).现在我运行两个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接口卡,不可用我的系统上,所以我必须运行时错误"通道初始化失败.在系统上未找到有效的HCAs".根据我的理解,Infiniband的卡则不需要,如果我们只是想在一个节点上使用1 K80内的GPU,因为K80具有这两个GPU的内部PCIe交换机.这些都是我的疑惑.为了清楚地说明问题,我将其列出如下:

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

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

Rob*_*lla 5

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

唯一需要IB卡的时候是你有从系统到系统的MPI通信(GPU或其他).同一系统中的GPU不需要存在IB卡以便彼此通信.有关在此(单系统)设置中使用GPUDirect的更多信息如下所示.

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

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

对于同一系统中的GPU,GPUDirect技术称为点对点(Peer-to-Peer).K80上的两个GPU应始终能够使用Peer to Peer相互通信,您可以使用名称中包含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感知MPI",因为它使用GPUDirect P2P但不一定使用RDMA.

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