Product Introduction
Concepts
Message Passing Interface (MPI) is a specification for parallel computing communication interfaces with support for multi-language programming. It defines a group of functions and syntax rules that allow multiple processes on different computer nodes to work together on a task. MPI is implemented in multiple forms, such as Open MPI, Intel MPI, and MPICH.
Based on Open MPI and point-to-point (P2P) communication operations of the Open Unified Communication X (UCX) framework, Hyper MPI is a Unified Communication Group (UCG) framework optimized for collective communication, which integrates multiple collective operation acceleration algorithms. Hyper MPI features outstanding performance, massive processing capability, and portability. It applies to manufacturing, meteorology, and gene sequencing scenarios. With Hyper MPI, it is promising to build a high-performance computing (HPC) ecosystem based on Huawei-developed Kunpeng servers.
Benefits
MPI supports P2P communication and collective communication, and can implement multiple communication modes, such as broadcast, scattering, and gathering. MPI 3.1 has defined more than 30 collective communication functions. Among these collective communication functions, Allreduce, Bcast, Barrier, Alltoallv, Allgatherv, Gatherv, and Scatterv are more frequently invoked.
When used for collective communication, Hyper MPI has the following advantages over other MPI implementations in terms of communication performance for both large- and small-packet data:
- High-performance optimization
Hyper MPI has optimized topology awareness (including non-blocking APIs) for collective communication functions such as Allreduce, Bcast, Barrier, Alltoallv, Allgatherv, Gatherv, Gather, Scatterv, reduce_scatter, and reduce_scatter_block, and supports asynchronous hardware offloading for collective communication. Therefore, it delivers significantly higher performance than the open-source Open MPI.
- Free ecosystem
Hyper MPI is released as open-source software and designed for servers and large-scale clusters powered by Kunpeng chips. Kunpeng servers feature many cores on a single node, simplified instruction sets, excellent energy efficiency, and low costs. They can work with Hyper MPI to build an efficient and economical HPC ecosystem.
Functions
- Hyper MPI supports the MPI 3.1 standard. Table 1 describes the optimized collective communication operations.
A collective communication algorithm of Hyper MPI supports a maximum of 232 bytes in a sent data packet.
Operation |
Function Description |
Function Prototype for Blocking API Calls |
Function Prototype for Non-blocking API Calls |
|---|---|---|---|
Allreduce |
Allreduce is an MPI group reduction function. It performs a mathematical operation (for example, addition or multiplication) or logical operation (for example, AND or OR) on the send buffer of each independent process, and then synchronizes the result to the receive buffer of all processes in the communication domain. |
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 is an MPI broadcast handling function. The root process sends data in the buffer to all the other processes in the communication domain so that all processes obtain the same data. |
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 is an MPI synchronization function. It synchronizes all processes in the communication domain, ensuring that all the processes are synchronized after a process calls a function. |
int MPI_Barrier(MPI_Comm comm) |
int MPI_Ibarrier(MPI_Comm comm, MPI_Request *request) |
Alltoallv |
Alltoallv is an MPI many-to-many communication function. All processes in the communication domain perform P2P communication operations, send data to other processes, and receive data from other processes. The length of data sent and received by each process in communication is variable. |
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 is an MPI data collection function. It collects variable data of each process in the communication domain and sends the collected data to all processes in the communication domain. |
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 is an MPI data distribution function. It controls the root process in the communication domain to distribute different data blocks to different processes in the communication domain. |
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 is an MPI data collection function. It collects variable data of each process in the communication domain. |
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) |
Gather |
Gatherv is an MPI data collection function. It collects unchanged data of each process in the communication domain. |
int MPI_Gather(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) |
int MPI_Igather(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Request *request) |
Reduce_scatter |
Reduce_scatter is an MPI group reduction and distribution function. It performs mathematical operations (such as addition and multiplication) or logical operations (such as AND OR) on the send buffer in each independent process, and then distributes different data results to different processes. The number of data results obtained by different processes can be different. |
int MPI_Reduce_scatter(const void *sendbuf, void *recvbuf, const int* recvcounts[], MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) |
int MPI_Ireduce_scatter(const void *sendbuf, void *recvbuf, const int* recvcounts[], MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Request *request) |
Reduce_scatter_block |
Reduce_scatter_block is an MPI group reduction and distribution function. It performs mathematical operations (such as addition and multiplication) or logical operations (such as AND OR) on the send buffer in each independent process, and then distributes different data results to different processes. The number of data results obtained by different processes is the same. |
int MPI_Reduce_scatter_block(const void *sendbuf, void *recvbuf, int recvcount, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) |
int MPI_Ireduce_scatter_block(const void *sendbuf, void *recvbuf, int recvcount, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Request *request) |
- Hyper MPI supports Singularity containerization. That is, Hyper MPI can be deployed in a Singularity container.