
用C++写MPI程序,核心就三件事:环境搭好、进程分清、消息发准。不依赖共享内存,靠显式Send/Recv协同计算,适合跑在多台机器或多个CPU核上。
环境安装与验证
在ubuntu/WSL这类linux系统上,一条命令装齐运行时和开发头文件:
- sudo apt install openmpi-bin libopenmpi-dev
- 装完立刻验证:mpirun –version 能打出版本号,说明MPI已就绪
- 编译必须用mpic++(不是g++),它自动链接MPI库
第一个可运行的MPI程序
下面这段代码能直接复制保存为hello.cpp,编译运行后会打印每个进程的编号和总数:
- mpic++ -o hello hello.cpp
- mpirun -np 4 ./hello → 启动4个独立进程并行执行
关键点:所有进程都运行同一份代码,但MPI_Comm_rank返回的rank值不同,这是任务分工的依据。
立即学习“C++免费学习笔记(深入)”;
点对点通信怎么写
两个进程之间传数据,最常用的是阻塞式MPI_Send和MPI_Recv,注意匹配五要素:
- 发送方调用MPI_Send(&data, 1, MPI_INT, dest_rank, tag, MPI_COMM_WORLD)
- 接收方调用MPI_Recv(&data, 1, MPI_INT, src_rank, tag, MPI_COMM_WORLD, &status)
- 其中tag是自定义标签,用来区分不同用途的消息;status可填MPI_STATUS_IGNORE跳过状态检查
别漏掉初始化和清理
每段MPI代码开头必须MPI_Init,结尾必须MPI_Finalize:
- MPI_Init不只是“启动”,它解析命令行参数(比如-np)、分配通信资源、建立进程上下文
- MPI_Finalize释放所有MPI内部对象,不调用可能导致进程卡住或资源泄漏
- 这两个函数各只出现一次,且必须成对出现
基本上就这些。MPI本身门槛不高,6个基础函数就能跑通大部分场景,难的是后续扩展——比如用MPI_Bcast做广播、MPI_reduce做归约,或者和OpenMP混合编程压榨单节点多核性能。