产品介绍
概念介绍
MPI(Message Passing Interface)是一种支持多语言编程的并行计算通讯应用接口规范,它定义了一组函数和语法规则,使得多个进程可以在不同的计算机节点上协同工作,共同完成一个任务。MPI有多种实现,例如Open MPI、Intel MPI、MPICH等。
Hyper MPI是在Open MPI的基础上,结合Open UCX框架的点对点通信操作,开发出专为集合通信优化的UCG框架,该框架中实现了多种集合操作加速算法。Hyper MPI具有高性能、大规模性、可移植性等特点,以支持制造、气象和政府HPC场景的解决方案,其长远意义在于构建以鲲鹏服务器为硬件基础的高性能计算生态。
价值
MPI支持点对点通信和集合通信,可以实现多种通信模式,例如广播、散射、聚集等。其中,仅MPI 3.1标准中定义的集合通信函数就高达30多种。在众多集合通信操作函数中,Allreduce、Bcast、Barrier、Allgatherv、Gatherv和ScattervAllreduce、Bcast、Barrier和Alltoallv的调用频率较高。
Hyper MPI在集合通信模式中,不管是大包数据,还是小包数据,它的通信性能相较于其它MPI的实现,具有以下优势:
功能
- Hyper MPI支持MPI 3.1标准,主要优化的集合通讯操作如表1所示。
Hyper MPI集合通讯算法支持最大发送数据包长度为232字节。
表1 集合通讯操作说明 集合操作名称
函数简介
阻塞接口函数原型
非阻塞接口函数原型
Allreduce
Allreduce是MPI组规约函数。
作用:将各个独立进程中的send buffer进行数学(例如加法、乘法)或逻辑(例如与、或)运算,然后将结果同步到通信域内所有进程的receive buffer中。
int MPI_Allreduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
int MPI_Iallreduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Request *request)
Bcast
Bcast是MPI广播操作函数。
作用:root进程将buffer中的信息发送给通讯域内其余进程,使得所有进程获取相同的信息。
int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm)
int MPI_Ibcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm, MPI_Request *request)
Barrier
Barrier是MPI同步函数。
作用:该通讯域中全部进程进行同步操作,即保证进程调用函数后具有良好的同步性。
int MPI_Barrier(MPI_Comm comm)
int MPI_Ibarrier(MPI_Comm comm, MPI_Request *request)
Alltoallv
Alltoallv是MPI多对多通信函数。
作用:该通讯域中全部进程进行点对点通信操作,发送数据至其他进程,并从其他进程接收数据,且通信中每个进程发送和接收的长度可变。
int MPI_Alltoallv(const void *sendbuf, const int sendcounts[], const int sdispls[], MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm)
int MPI_Ialltoallv(const void *sendbuf, const int sendcounts[], const int sdispls[], MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Request *request)
Allgatherv
Allgatherv是MPI数据收集函数。
作用:收集该通讯域中每个进程可变的数据,并将收集的数据传送给该通讯域中的所有进程。
int MPI_Allgatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, MPI_Comm comm)
int MPI_Iallgatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Request *request)
Scatterv
Scatterv是MPI数据分发函数。
作用:该通讯域中根进程将不同的数据块分发给该通讯域中不同的进程。
int MPI_Scatterv(const void *sendbuf, const int sendcounts[], const int displs[], MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
int MPI_Iscatterv(const void *sendbuf, const int sendcounts[], const int displs[], MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Request *request)
Gatherv
Gatherv是MPI数据收集函数。
作用:收集该通讯域中每个进程可变的数据。
int MPI_Gatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int *recvcounts, const int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm)
int MPI_Igatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Request *request)
- Hyper MPI支持Singularity容器化,即支持将Hyper MPI部署在Singularity容器中。