—— 让你的并行计算飞起来 🚀
1. 简介
- MPI (Message Passing Interface):用于多机分布式并行计算(进程级并行)。
- OpenMP:用于单机多线程并行计算(线程级并行)。
- 混合编程:结合 MPI(跨节点) + OpenMP(单节点多线程),最大化并行效率。
本教程涵盖 Windows(MS-MPI) 和 Linux(OpenMPI) 环境配置,并提供测试代码。
2. Windows 环境配置(MS-MPI + OpenMP)
2.1 安装 MS-MPI
-
下载 MS-MPI(微软官方实现):
- MS-MPI v10.1.2(安装包)
- MS-MPI SDK(开发工具包)
-
安装:
- 先运行
msmpisetup.exe
(安装 MPI 运行时) - 再运行
msmpisdk.msi
(安装头文件和库)
- 先运行
-
验证安装:
mpiexec --version # 应输出 MS-MPI 版本
2.2 安装 MinGW-w64(GCC 编译器)
-
下载 MinGW-w64(带 OpenMP 支持):
- MinGW-w64(推荐)
- 或使用 MSYS2
-
配置环境变量:
- 确保
gcc
和g++
可用:gcc --version # 检查是否安装成功
- 确保
2.3 测试 MPI + OpenMP 混合编程
示例代码 mpi_omp_hello.c
:
#include <mpi.h> #include <omp.h> #include <stdio.h> int main(int argc, char **argv) { MPI_Init(&argc, &argv); int rank, size; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); #pragma omp parallel { int thread_id = omp_get_thread_num(); printf("MPI Rank %d / %d | OpenMP Thread %d\n", rank, size, thread_id); } MPI_Finalize(); return 0; }
编译 & 运行:
gcc -fopenmp mpi_omp_hello.c -o mpi_omp_hello.exe -I "C:\Program Files (x86)\Microsoft SDKs\MPI\Include" -L "C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64" -lmsmpi mpiexec -n 4 ./mpi_omp_hello.exe
输出示例:
MPI Rank 0 / 4 | OpenMP Thread 0 MPI Rank 0 / 4 | OpenMP Thread 1 MPI Rank 1 / 4 | OpenMP Thread 0 MPI Rank 1 / 4 | OpenMP Thread 1 ...
3. Linux 环境配置(OpenMPI + OpenMP)
3.1 安装 OpenMPI 和 GCC
sudo apt update sudo apt install -y openmpi-bin libopenmpi-dev gcc # Ubuntu/Debian sudo yum install -y openmpi gcc # CentOS/RHEL
3.2 测试 MPI + OpenMP
编译 & 运行:
gcc -fopenmp mpi_omp_hello.c -o mpi_omp_hello -lmpi mpirun -np 4 ./mpi_omp_hello
4. 常见问题
Q1: undefined reference to MPI_Init
✅ 解决方案:确保编译时链接 MPI 库(-lmsmpi
/ -lmpi
)。
Q2: OpenMP 不生效?
✅ 检查:
- 编译时加
-fopenmp
- 运行时设置线程数:
export OMP_NUM_THREADS=4 # Linux set OMP_NUM_THREADS=4 # Windows
Q3: mpiexec
找不到?
✅ 检查:
- Windows:确保 MS-MPI 安装后
C:\Program Files\Microsoft MPI\Bin
在PATH
环境变量中。 - Linux:确保
openmpi
正确安装。
5. 总结
系统 | MPI 实现 | 编译命令 | 运行命令 |
---|---|---|---|
Windows | MS-MPI | gcc -fopenmp -lmsmpi | mpiexec -n 4 ./program |
Linux | OpenMPI | gcc -fopenmp -lmpi | mpirun -np 4 ./program |
有问题欢迎交流!💬