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配置完成,可以使用了。