Post

MPI学习--MPICH并行环境搭建与配置

MPI学习--MPICH并行环境搭建与配置

公司分布式环境使用MPI搭建,最近打算上手学习一下MPI,目前的主要目的是能够快速使用MPI的API将现有程序并行化,例子代码均用C语言实现。

环境: Ubuntu 20.04.6

下载MPICH

下载地址

下载下来的压缩包为: mpich-4.2.3.tar.gz

编译和安装

解压

1
2
tar zxvf mpich-4.2.3.tar.gz
cd mpich-4.2.3

编译

MPICH提供了很多的配置选项,可以通过./configure -h命令查看,注:prefix参数是表示安装路径

1
2
3
./configure  --prefix=/usr/local/mpich-4.2.3
make
sudo make install

编译会很久==!

设置环境变量

需要为已经安装好的mpi设置环境变量

1
2
3
vim ~/.bashrc
export PATH=/usr/local/mpich-4.2.3/bin:$PATH
source ~/.bashrc

这里额外提一下$:的意思,前者可以理解为引用与整体替换,$PATH也就是代表目前系统PATH环境变量的值。而后者是 PATH 环境变量中用于分隔不同目录路径的分隔符。

因此这里的意思是将/usr/local/mpich-4.2.3/bin添加到PATH环境变量开头,并用分隔符隔开。

检测一下环境变量是否设置正确

1
2
which mpicc
which mpif90

如果显示都在/usr/local/mpich-4.2.3/bin/下的话,表示环境变量设置成功。

配置和验证

MPI进程的创建、启动和管理需要借助进程管理器来完成,直观的讲PM就是MPI环境与操作系统的接口。 正常MPI会在多个主机上启动进程管理器进程,形成MPI运行时的环境,这样目标主机就需要配置集群环境支持节点间无密码登录(例如ssh),这里的原理主要是通过密钥进行身份验证的方式,由于仅作学习使用,这里就不再进行配置了。

测试

首先进入最开始解压的文件mpich-4.2.3/examples,其中有个文件hellow.c,我们先用mpicc将其编译一下,然后再执行。

1
2
mpicc -o hellow hellow.c
mpirun -np 4 ./hellow

这里简单说一下mpicc:

mpicc 是与 MPI相关的编译器包装器(compiler wrapper),主要用于编译包含 MPI 函数调用的 C 语言程序,它并不是一个完全独立的编译器,它实际上是基于普通 C 编译器(如 gcc)构建的。在不同的系统和 MPI 实现中,mpicc 可能会以不同的方式利用底层的 C 编译器。

如果输出结果为以下,则说明没有问题了。

1
2
3
4
Hello world from process 3 of 4
Hello world from process 0 of 4
Hello world from process 1 of 4
Hello world from process 2 of 4

查看MPI版本

1
2
3
# mpirun --version
mpirun (Open MPI) 4.0.3
Report bugs to http://www.open-mpi.org/community/help/

很奇怪,我安装的是mpich,不知道为什么最后显示是open mpi

查看配置信息

1
2
3
4
5
6
7
8
9
10
11
12
# ompi_info
Package: Debian OpenMPI
Open MPI: 4.0.3
Open MPI repo revision: v4.0.3
Open MPI release date: Mar 03, 2020
C compiler absolute: /usr/bin/gcc
C compiler family name: GNU
C compiler version: 9.3.0
C++ compiler: g++
C++ compiler absolute: /usr/bin/g++
Fort compiler: gfortran
Fort compiler abs: /usr/bin/gfortran

这里仅截取了一部分,ompi_info会显示 OpenMPI 的详细信息,包括编译器、版本、配置选项、依赖库等。

像上文所说的mpicc,其实可以理解为一个脚本,执行的是gcc

1
2
3
4
5
6
# mpicc -show
gcc -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi 
	-I/usr/lib/x86_64-linux-gnu/openmpi/include 
	-pthread 
	-L/usr/lib/x86_64-linux-gnu/openmpi/lib 
	-lmpi

其他的同理,至此MPI配置完成,可以使用了。

This post is licensed under CC BY 4.0 by the author.