一、HyperMPI是什么
HyperMPI(HMPI)是华为基于Open MPI开发的高性能通信库,专门为鲲鹏平台优化了集合通信操作。在HPC(高性能计算)场景中,多个计算节点之间的数据交换效率直接决定了整体计算速度,而集合通信(广播、规约、同步等)是最核心的通信模式。
标准Open MPI的集合通信采用P2P(点对点)方式实现,通信效率有瓶颈。HyperMPI在UCX框架基础上新增了UCG集合通信模块,南向直接对接传输层,绕过了协议层的开销,配合华为自研的集合通信算法,在大规模并行计算场景下性能提升明显。
本文在华为云开发者空间(鲲鹏aarch64,4VCPUs 8GiB)环境下,实操HyperMPI的编译安装和基础性能测试。
二、HyperMPI架构理解
在动手安装之前,先理解HyperMPI的软件分层:
关键模块说明:
UCG:华为新增的集合通信模块,这是HyperMPI相对Open MPI的核心差异
COLL:华为自研的集合操作组件,调用UCG实现高性能集合通信
HUCX:华为优化的UCX通信框架,提供底层传输支持
HyperMPI支持三种优化的集合通信操作:MPI_Allreduce(全规约)、MPI_Bcast(广播)、MPI_Barrier(同步),这三种操作覆盖了HPC场景中80%以上的通信需求。
三、编译安装
HyperMPI的安装分三步:先编译HUCX,再编译XUCG(集合通信模块),最后编译HyperMPI。三者的编译顺序不能调换。
3.1 安装依赖
3.2 编译HUCX
**编译时间较长(约20-30分钟),HMPI的Makefile不支持并行编译,使用 **make -j 可能导致构建失败,必须用单线程 make。
3.5 配置环境变量
四、编写MPI测试程序
4.1 基础点对点通信测试
创建一个简单的MPI程序,测试两个进程之间的数据传递:
4.2 集合通信性能测试
创建一个测试MPI_Allreduce性能的程序:
五、HyperMPI vs Open MPI性能对比
在相同环境下,对比HyperMPI和标准Open MPI的集合通信性能:
测试完成后切换回HyperMPI:
在鲲鹏920 4核环境下的典型对比结果:
注意:单机4核环境下的提升幅度有限(HyperMPI的优势在大规模集群场景更明显),但已经能看出UCG模块的效果。以上数据为典型参考值,实际结果受硬件配置和网络环境影响。
六、收获与反思
编译顺序严格:HUCX → XUCG → HMPI。三者有层层依赖关系,XUCG依赖HUCX,HMPI依赖HUCX和XUCG。顺序搞反了,configure阶段就会报错找不到依赖。
XUCG用cmake独立编译。和早期版本(v1.2.x)不同,v1.3.0版本的XUCG不再复制到HUCX目录,而是用cmake独立编译安装,HMPI编译时通过 --with-ucg 指定XUCG路径。
HMPI不能并行编译。HUCX和XUCG可以用 make -j4 加速,但HMPI的Makefile有依赖顺序问题,必须单线程 make,否则会随机失败。
单机测试只是起点。HyperMPI的真正价值在多节点集群场景。单机上,UCG的集合通信优化和P2P差异不大。但如果有多台鲲鹏服务器通过InfiniBand或RoCE网络互联,HyperMPI的UCG模块优势会非常明显。
一、HyperMPI是什么
HyperMPI(HMPI)是华为基于Open MPI开发的高性能通信库,专门为鲲鹏平台优化了集合通信操作。在HPC(高性能计算)场景中,多个计算节点之间的数据交换效率直接决定了整体计算速度,而集合通信(广播、规约、同步等)是最核心的通信模式。
标准Open MPI的集合通信采用P2P(点对点)方式实现,通信效率有瓶颈。HyperMPI在UCX框架基础上新增了UCG集合通信模块,南向直接对接传输层,绕过了协议层的开销,配合华为自研的集合通信算法,在大规模并行计算场景下性能提升明显。
本文在华为云开发者空间(鲲鹏aarch64,4VCPUs 8GiB)环境下,实操HyperMPI的编译安装和基础性能测试。
二、HyperMPI架构理解
在动手安装之前,先理解HyperMPI的软件分层:
关键模块说明:
UCG:华为新增的集合通信模块,这是HyperMPI相对Open MPI的核心差异
COLL:华为自研的集合操作组件,调用UCG实现高性能集合通信
HUCX:华为优化的UCX通信框架,提供底层传输支持
HyperMPI支持三种优化的集合通信操作:MPI_Allreduce(全规约)、MPI_Bcast(广播)、MPI_Barrier(同步),这三种操作覆盖了HPC场景中80%以上的通信需求。
三、编译安装
HyperMPI的安装分三步:先编译HUCX,再编译XUCG(集合通信模块),最后编译HyperMPI。三者的编译顺序不能调换。
3.1 安装依赖
3.2 编译HUCX
**编译时间较长(约20-30分钟),HMPI的Makefile不支持并行编译,使用 **
make -j可能导致构建失败,必须用单线程make。3.5 配置环境变量
四、编写MPI测试程序
4.1 基础点对点通信测试
创建一个简单的MPI程序,测试两个进程之间的数据传递:
# 创建测试程序 cat > hello_mpi.c << 'EOF' #include <mpi.h> #include <stdio.h> int main(int argc, char *argv[]) { int rank, size; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); printf("Process %d/%d: MPI OK\n", rank, size); MPI_Finalize(); return 0; } EOF # 使用HyperMPI的mpicc编译 mpicc -o hello_mpi hello_mpi.c # 在本地启动4个进程 mpirun -np 4 ./hello_mpi # 输出: # Process 0/4: MPI OK # Process 1/4: MPI OK # Process 2/4: MPI OK # Process 3/4: MPI OK4.2 集合通信性能测试
创建一个测试MPI_Allreduce性能的程序:
# 创建性能测试程序 cat > allreduce_bench.c << 'EOF' #include <mpi.h> #include <stdio.h> #include <stdlib.h> #define ARRAY_SIZE 1000000 #define ITERATIONS 100 int main(int argc, char *argv[]) { int rank, size; double *buffer = NULL; double start_time, end_time; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); /* 使用malloc分配大数组,避免栈溢出 */ buffer = (double *)malloc(ARRAY_SIZE * sizeof(double)); if (buffer == NULL) { fprintf(stderr, "malloc failed\n"); MPI_Abort(MPI_COMM_WORLD, 1); } /* 初始化数据 */ for (int i = 0; i < ARRAY_SIZE; i++) { buffer[i] = (double)rank + i * 0.001; } /* 预热 */ MPI_Allreduce(MPI_IN_PLACE, buffer, ARRAY_SIZE, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); /* 正式测试 */ start_time = MPI_Wtime(); for (int i = 0; i < ITERATIONS; i++) { MPI_Allreduce(MPI_IN_PLACE, buffer, ARRAY_SIZE, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); } end_time = MPI_Wtime(); if (rank == 0) { double avg_time = (end_time - start_time) / ITERATIONS * 1000; double data_size = ARRAY_SIZE * sizeof(double) / 1024.0 / 1024.0; printf("MPI_Allreduce benchmark:\n"); printf(" Data size: %.2f MB\n", data_size); printf(" Processes: %d\n", size); printf(" Avg time: %.3f ms/op\n", avg_time); printf(" Bandwidth: %.2f MB/s\n", data_size / (avg_time / 1000.0)); } free(buffer); MPI_Finalize(); return 0; } EOF # 编译 mpicc -O2 -o allreduce_bench allreduce_bench.c # 4进程测试 mpirun -np 4 ./allreduce_bench # 输出示例: # MPI_Allreduce benchmark: # Data size: 7.63 MB # Processes: 4 # Avg time: 2.156 ms/op # Bandwidth: 3539.51 MB/s五、HyperMPI vs Open MPI性能对比
在相同环境下,对比HyperMPI和标准Open MPI的集合通信性能:
测试完成后切换回HyperMPI:
在鲲鹏920 4核环境下的典型对比结果:
注意:单机4核环境下的提升幅度有限(HyperMPI的优势在大规模集群场景更明显),但已经能看出UCG模块的效果。以上数据为典型参考值,实际结果受硬件配置和网络环境影响。
六、收获与反思
编译顺序严格:HUCX → XUCG → HMPI。三者有层层依赖关系,XUCG依赖HUCX,HMPI依赖HUCX和XUCG。顺序搞反了,configure阶段就会报错找不到依赖。
XUCG用cmake独立编译。和早期版本(v1.2.x)不同,v1.3.0版本的XUCG不再复制到HUCX目录,而是用cmake独立编译安装,HMPI编译时通过
--with-ucg指定XUCG路径。HMPI不能并行编译。HUCX和XUCG可以用
make -j4加速,但HMPI的Makefile有依赖顺序问题,必须单线程make,否则会随机失败。单机测试只是起点。HyperMPI的真正价值在多节点集群场景。单机上,UCG的集合通信优化和P2P差异不大。但如果有多台鲲鹏服务器通过InfiniBand或RoCE网络互联,HyperMPI的UCG模块优势会非常明显。