Skip to content

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-03

4.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未加载 oneAPIsource setvars.sh
Unable to reach the hostSSH 免密未配 / 节点名解析失败检查 ssh node-02、hostfile 用 IP
卡住不输出进程数 > 可用核数或 fabric 选错检查 -np 与核数、改 FI_PROVIDER

6. 小结 ​

跑通 hello world 意味着:

  • ✅ MPI 编译链正常
  • ✅ 单机多进程通信正常
  • ✅ 多机跨节点通信正常

下一步把这些进程组织起来真正并行计算,见 MPI 编程实战:从通信到归约。

AI-HPC 智算超算专家 · Contact: openaihpc@gmail.com