什么是并行程序设计?
并行程序设计是将一个大任务分解为多个子任务,同时在多个处理器或核心上执行,以提高程序运行效率的技术。在科学计算、人工智能、大数据处理等领域广泛应用。
目前最主流的两种并行编程模型是:MPI(Message Passing Interface) 和 OpenMP(Open Multi-Processing)。
MPI 简介
MPI 是一种用于分布式内存系统的标准消息传递接口。它允许多个进程在不同节点(甚至不同机器)之间通过发送和接收消息进行通信。
特点:
- 适用于集群、超算等分布式环境
- 显式通信:程序员需手动管理数据传输
- 语言支持:C/C++、Fortran、Python(mpi4py)等
- 可扩展性强,适合大规模并行
简单示例(C语言):
#include <mpi.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);
printf("Hello from process %d of %d\n", rank, size);
MPI_Finalize();
return 0;
}
OpenMP 简介
OpenMP 是一种用于共享内存系统的并行编程 API,主要通过编译器指令(pragma)实现多线程并行。
特点:
- 适用于单机多核 CPU
- 隐式并行:通过注释/指令自动并行化循环等结构
- 语言支持:C/C++、Fortran
- 开发简单,适合细粒度并行
简单示例(C语言):
#include <omp.h>
#include <stdio.h>
int main() {
#pragma omp parallel
{
int id = omp_get_thread_num();
int total = omp_get_num_threads();
printf("Hello from thread %d of %d\n", id, total);
}
return 0;
}
MPI 与 OpenMP 对比
| 特性 | MPI | OpenMP |
|---|---|---|
| 内存模型 | 分布式内存 | 共享内存 |
| 通信方式 | 显式消息传递 | 隐式共享变量 |
| 适用平台 | 多节点集群、超算 | 单机多核 CPU |
| 编程复杂度 | 较高 | 较低 |
| 典型应用场景 | 大规模科学模拟 | 图像处理、数值计算 |
混合编程:MPI + OpenMP
在现代高性能计算中,常采用 MPI + OpenMP 混合模型:用 MPI 在节点间分配任务,用 OpenMP 在每个节点内利用多核并行。这种“两级并行”能充分发挥异构计算资源的优势。
例如,在一台拥有 4 个节点、每节点 16 核的集群上,可启动 4 个 MPI 进程,每个进程内部再创建 16 个 OpenMP 线程。
学习资源推荐
- MPI 官方标准文档
- OpenMP 官方教程与规范
- 《Using MPI》by William Gropp et al.
- 《Parallel Programming in OpenMP》by Rohit Chandra et al.
- 中国国家超算中心在线课程