一、介绍
在前面的MPI和MPS中,对MPI已经有了一个基础的了解。而为了实现MPI,在CUDA环境中,一些常见的库或框架都支持上MPI,主要有:
- NVIDIA HPC-X
这个是NVIDIA官方集成的的套件,包含Open MPI的实现,集成了UCX通信框架和SHARP网络计算以及NCCL,算是自家人做自家事,主打一个好用高效 - Open MPI
目前最广泛应用的开源MPI实现,搞C++的在并行通信上也会用到。主打通用场景及各种平台应用 - MVAPICH2
专注于InfiniBand网络设计的一种高效MPI实现,较早支持GPU Direct RDMA,一般应用于InfiniBand集群
它们几个都有一个共同的特点,即普遍对CUDA-aware MPI支持较好。而CUDA-aware MPI正是利用 GPUDirect RDMA进行优化的节点间通信。这恰恰是集群应用中的一个痛点问题。
二、CUDA-aware MPI
CUDA-aware MPI,是一种支持直接对GPU内存进行操作MPI库的扩展。对于传统的MPI来说,其需要多次的在主机和设备内存间进行复制。而CUDA-aware MPI,可以直接操作指向GPU内存的指针,通过MPI负责与GPU内存的交互,类似于Direct IO。这样就避免了内存间的拷贝,当然提高了效率。
CUDA-aware MPI的技术点主要有:
- GPU Direct Technologies
GPU Direct Peer-to-Peer (P2P):这种技术如果有过网络P2P开发的一眼就能看明白,即GPU间直接通过PCIe总线交换数据,而不通过主机和主机的内存
GPU Direct RDMA:这个非常重要,这也是CUDA-aware MPI的关键所在,即允许支持RDMA的网络适配器直接操作不同节点的GPU内存,和Direct IO非常类似 - 统一虚拟寻址
不同节点间的内存要想直接访问,真实的物理地址是不可能统一连续的。那么就可以参考PC系统的虚拟地址来处理。在CUDA4以后,引入了UVA,即提供了一个统一的虚拟地址。这样,在操作不同的GPU内存时,不会出现地址的冲突问题 - IPC支持
这个很好理解,既然支持了跨节点的通信,那么必然要支持跨节点间的不同进程间的通信,否则这个意义也不算多大。而CUDA-aware MPI通过CUDA IPC机制在GPU间通过共享内存来实现进程间的通信
对CUDA-aware MPI来讲,其最大的优势在于提升带宽、降低延迟从而大幅提高效率;另外,通过减少拷贝降低了主机的CPU和内存的占用;由于其对开发者透明,进一步简化了开发的复杂度。
三、应用场景和限制
CUDA-aware MPI的应用场景在目前来看非常广泛,毕竟现在已经是分布式的天下。不谈集群就没有啥算力可言了。其主要的应用场景有:
- 大规模的GPU集群AI应用
包括各种基础框架(深度学习的Pytorch、TensorFlow等)训练、应用等等 - 大规模的科学计算
这种属于进行大数据的快速计算和数据处理 - 其它
如GPU加速的HPC应用等。以及其它所有的需要进行节点数据交换场景
虽然说CUDA-aware MPI有其优势所在,也有其短板之处。主要有,对硬件和软件的要求比较,包括版本的兼容性、硬件的支持性、代码开发管理的相对复杂性以及异步通信的复杂性。这就意味着,在较小规模或一些特定的中大型规模上应用CUDA-aware MPI,反而可能引起不必要的效率下降。
四、例程
下面看看简单的应用对比例程:
- 传统的方式
//发送到主机-BANK-A
kernel<<<...>>>(dev_buf);
cudaMemcpy(host_buf,dev_buf,size,cudaMemcpyDeviceToHost);
MPI_Send(host_buf,size,MPI_CHAR,1,100,MPI_COMM_WORLD);
//GPU接收 BANK-B
MPI_Recv(host_buf_b,size,MPI_CHAR,0,100,MPI_COMM_WORLD, &status);
cudaMemcpy(dev_buf_b,host_buf_b,size,cudaMemcpyHostToDevice);
- CUDA-aware MPI方式:
//BANK-A
MPI_Send(dev_buf_a,size,MPI_CHAR,1,100,MPI_COMM_WORLD);
//BANK-B
MPI_Recv(dev_buf_b,size,MPI_CHAR,0,100,MPI_COMM_WORLD, &status);
代码只是一个示意,明白应用方法与传统不同即可。
五、总结
由于没有MPI的环境,所以这里只是简单的描述了分析了下其应用的特点及场景。大家如果感兴趣而且手头有相关的环境,可以尝试着对其进行开发应用。毕竟计算机技术不动手是万万不行的。