我正在尝试优化名为LAMMPS的MPI+CUDA基准测试的性能(https://github.com/lammps/lammps)。现在我运行的是两个MPI进程和两个GPU。我的系统有两个插座,每个插座连接到2个K80。由于每个K80内部包含2个GPU,因此每个套接字实际上连接到4个GPU。但我在一个插槽中只使用了两个内核,并将两个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交换机。这些都是我的疑虑。为了明确问题,我列出了以下内容:
-
在我的系统中,一个套接字连接到两个K80。如果一个K80中的两个GPU需要与另一个K8中的GPU通信,那么如果我们想使用GPUDirect,我们必须有IB卡,对吗?
-
如果我们只需要使用1 K80内的两个GPU,那么这两个GPU之间的通信不需要IB卡,对吧?但是,MVAPICH2-GDR至少需要一个IB卡。那么,有什么解决方法可以解决这个问题吗?或者我必须在系统上插入IB卡?
在我的系统中,一个套接字连接到两个K80。如果一个K80中的两个GPU需要与另一个K8中的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技术被称为对等。K80上的两个GPU应该始终能够使用对等通信,并且您可以使用名为simpleP2P的CUDA示例代码来验证这一点。此示例代码还将告诉您您的系统是否能够支持同一系统中任意2个GPU之间的P2P。
对于通过IB(Infiniband)网络连接的独立系统中的GPU,还有一种额外的GPUDirect技术,称为GPUDirect-RDMA。这允许独立系统中的两个GPU通过IB链路相互通信。
因此,由于MVAPICH2-GDR包含与IB相关的GPUDirect RDMA,因此它可能会在默认情况下寻找IB卡。
然而,即使在单个系统中的GPU之间(例如使用K80),也应该能够通过使用GPUDirect启用的MPI(包括某些类型的MVAPICH2)来获得通信优势。这种用法被简单地称为"CUDA感知MPI",因为它使用GPUDirect P2P,但不一定使用RDMA。
关于如何设置的详细教程和演练超出了我在SO答案中所能提供的范围,但有关这种用法的更多信息,我想请您参阅两篇全面涵盖该主题的博客文章,第一篇在这里,第二部分在这里。有关GPUDirect RDMA的更多信息,请点击此处。