MPI Hello World 实战
摘要:不写理论,直接跑。用 20 行 hello.c 把 MPI 的"编译 → 单机多进程 → 多机"完整链路走一遍,并解读输出里的 rank 与 processor_name,为后续 MPI 编程打好基础。
1. 源码:hello.c
c
#include <mpi.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
printf("Hello World from processor %s, rank %d"
" out of %d processor\n",
processor_name, world_rank, world_size);
MPI_Finalize();
}涉及的 5 个 MPI 调用就是 MPI 程序的骨架:
MPI_Init(初始化)、MPI_Comm_size(总进程数)、MPI_Comm_rank(本进程编号)、MPI_Get_processor_name(所在主机)、MPI_Finalize(收尾)。
2. 编译
bash
source /opt/intel2021/oneapi/setvars.sh intel64 --force
mpicc -o hello hello.c成功无输出。生成可执行文件 hello。
3. 单机多进程运行
bash
mpirun -np 5 ./hello输出示例(5 个进程跑在同一台机器上):
text
Hello World from processor node-01, rank 0 out of 5 processor
Hello World from processor node-01, rank 1 out of 5 processor
Hello World from processor node-01, rank 2 out of 5 processor
Hello World from processor node-01, rank 3 out of 5 processor
Hello World from processor node-01, rank 4 out of 5 processor解读:
rank是进程编号(0~N-1),processor_name是运行该进程的主机名。单机时 5 个 rank 都在node-01上,说明 MPI 在本机进程间通信正常。
4. 多机运行
4.1 准备 hostfile(机器文件)
bash
# hostfile 内容:每行一个节点
node-01
node-02
node-034.2 运行(以太网环境)
bash
mpirun -genv I_MPI_FABRICS shm:ofi -genv FI_PROVIDER tcp -machinefile hostfile -np 6 ./hello输出示例:
text
Hello World from processor node-01, rank 0 out of 6 processor
Hello World from processor node-01, rank 1 out of 6 processor
Hello World from processor node-02, rank 2 out of 6 processor
Hello World from processor node-02, rank 3 out of 6 processor
Hello World from processor node-03, rank 4 out of 6 processor
Hello World from processor node-03, rank 5 out of 6 processor解读:6 个进程分布到 3 个节点(每节点 2 个)。
processor_name各不相同,说明跨节点通信已经打通。
4.3 参数说明
| 参数 | 作用 |
|---|---|
-np N | 总进程数 |
-machinefile / -f | 节点列表文件 |
-hostfile | 同 machinefile(Intel MPI 兼容) |
-perhost n | 每节点进程数上限 |
-genv I_MPI_FABRICS shm:ofi | 使用共享内存 + libfabric 传输 |
-genv FI_PROVIDER tcp | 以太网 fabric(InfiniBand 环境改用 mlx) |
网络 fabric 速选
- 以太网:
-genv I_MPI_FABRICS shm:ofi -genv FI_PROVIDER tcp - InfiniBand:
-genv I_MPI_FABRICS shm:ofi -genv FI_PROVIDER mlx - 写进运行脚本最省事,避免每次手输
5. 常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
mpirun: command not found | 未加载 oneAPI | source setvars.sh |
Unable to reach the host | SSH 免密未配 / 节点名解析失败 | 检查 ssh node-02、hostfile 用 IP |
| 卡住不输出 | 进程数 > 可用核数或 fabric 选错 | 检查 -np 与核数、改 FI_PROVIDER |
6. 小结
跑通 hello world 意味着:
- ✅ MPI 编译链正常
- ✅ 单机多进程通信正常
- ✅ 多机跨节点通信正常
下一步把这些进程组织起来真正并行计算,见 MPI 编程实战:从通信到归约。