HPC——MPI

MPI(Message Passing Interface,消息传递接口)是并行计算领域广泛应用的一个标准化消息传递系统,它允许程序员在分布式内存系统(如计算机集群)上编写并行程序。简单来说,MPI提供了一套标准化的函数库,使得运行在不同计算节点上的进程能够通过相互发送和接收消息来协同工作,从而共同解决一个大规模的计算问题

核心概念

说明

类比理解

​进程​

并行程序的基本执行单位,每个进程拥有独立的地址空间

交响乐团中的每一位乐手。

​通信域​

定义了一组可以相互通信的进程及其上下文,最常用的是包含所有进程的 MPI_COMM_WORLD

指挥家管理的整个乐团,规定了乐手们的协作范围。

​秩​

在通信域内唯一标识一个进程的整型编号(从0开始)

每位乐手在乐团中的固定编号。

​消息​

进程间传递的数据单元,包含数据内容、发送/接收者地址、数据类型和标签等信息

乐手之间传递的乐谱片段。

 

 

 

 

 

 

 

 

⚙️ MPI的核心工作机制

MPI程序通常遵循一个标准的执行流程,并支持多种通信模式来适应不同的需求。

一个典型的MPI程序结构如下:

#include <mpi.h>

int main(int argc, char** argv) {
    MPI_Init(&argc, &argv); // 初始化MPI环境

    int rank, size;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); // 获取当前进程的秩
    MPI_Comm_size(MPI_COMM_WORLD, &size); // 获取通信域内的进程总数

    // ... 这里是并行计算的核心逻辑,进程间通过消息传递协同工作

    MPI_Finalize(); // 清理并终止MPI环境
    return 0;
}

 

 

📊 MPI 与 OpenMP 的简单对比

为了更好地理解MPI的定位,可以将其与之前讨论过的OpenMP进行对比:

特性

MPI

OpenMP

​内存模型​

分布式内存

共享内存

​并行粒度​

进程级,适用于多节点集群

线程级,适用于单节点多核

​编程复杂度​

相对较高,需显式管理通信

相对较低,通过编译指令实现并行

​可扩展性​

极强,可扩展至数千节点

受单节点资源限制

​典型场景​

大规模科学计算、分布式数据处理

多核CPU上的循环并行化、任务并行

 

 

 

 

 

 

 

 

 

 

值得一提的是,在现代混合编程模型中,MPI常与OpenMP结合使用(MPI+OpenMP),用MPI处理节点间的粗粒度并行,用OpenMP挖掘节点内的细粒度并行,从而充分发挥集群的整体计算能力

 

🔧 如何开始使用MPI

  1. ​环境搭建​:常见的MPI实现包括开源的Open MPI和MPICH。在Ubuntu系统上,可以通过包管理器安装Open MPI

    • sudo apt-get install openmpi-bin libopenmpi-dev

       

  2. ​编译与运行​:使用MPI提供的包装编译器(如mpicc用于C,mpic++用于C++)来编译程序,然后使用mpirun命令指定进程数来运行
    • mpic++ -o my_mpi_program my_mpi_program.cpp
      mpirun -np 4 ./my_mpi_program  # 使用4个进程运行程序

       

 

🔧 新节点加入MPI集群的核心步骤

步骤

核心任务

关键命令/操作示例

​1. 网络配置​

确保新节点与原有集群在同一局域网,IP固定,并更新所有节点的/etc/hosts文件,实现主机名解析。

sudo vim /etc/hosts
添加:192.168.1.20 new-node

​2. SSH免密登录​

在主节点生成SSH密钥对,并将公钥分发到新节点,实现集群节点间的无缝互信访问。

ssh-keygen -t rsa
ssh-copy-id mpiuser@new-node

​3. 同步MPI环境​

确保新节点安装与集群版本完全一致的MPI实现(如OpenMPI或MPICH)。

scp -r /usr/local/mpich mpiuser@new-node:/usr/local/

​4. 配置共享目录 (可选)​​

若使用NFS,需在主节点导出共享目录,并在新节点上挂载,确保程序路径一致。

主节点/etc/exports
/home/mpiuser/shared new-node(rw,sync)

​5. 更新主机文件​

编辑主节点的hostfile,指明新节点的主机名及其可用的处理器“槽位”(slots)数。

vim hostfile
添加:new-node slots=4

​6. 验证集群​

使用简单MPI程序测试新节点能否正常加入并参与计算。

mpirun -np 8 --hostfile hostfile ./mpi_hello

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在MPI集群中配置共享目录,主要是通过NFS(网络文件系统)​​ 实现

步骤

核心任务

关键命令/操作示例

​1. 选择NFS服务器​

指定集群中的一台机器作为NFS服务器,存放共享数据。

通常选择主节点(Master)作为服务器。

​2. 安装NFS软件包​

在服务器端和所有客户端节点安装必要的NFS软件。

sudo apt-get install nfs-kernel-server(服务器)
sudo apt-get install nfs-common(客户端)

​3. 配置NFS服务器​

指定哪个目录共享给哪些客户端节点及其访问权限。

编辑 /etc/exports,添加:
/home/dan/share node1(rw,sync) node2(rw,sync)

​4. 启动NFS服务​

在服务器端启动NFS服务并使配置生效。

sudo systemctl restart nfs-kernel-server

​5. 客户端挂载目录​

在各个客户端节点上将服务器共享的目录挂载到本地路径。

sudo mount -t nfs master:/home/dan/share /home/dan/share

​6. 测试与验证​

验证共享目录是否在所有节点上可正常读写。

在服务器共享目录创建文件,检查客户端是否可见

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

框架类别 代表性框架
基于消息传递(MPI) OpenMPI,MPICH
共享内存多线程 OpenMP

posted on 2025-10-14 15:20  Karlkiller  阅读(6)  评论(0)    收藏  举报

导航