文章目录
Mpich_linux-centos7.9系统下编译安装调用
本篇主要是讲解在linux-centos7.9系统中,如何编译各个版本的MPICH并导入到当前用户或系统环境中,以及编译过程中重要参数,编译后如何调用等。
一、★Mpich软件定义:
MPI是一个跨语言的通讯协议,用于编写并行计算机。支持点对点和广播。MPI是一个信息传递应用程序接口,包括协议和和语义说明,他们指明其如何在各种实现中发挥其特性。MPI的目标是高性能,大规模性,和可移植性。MPI在今天仍为高性能计算的主要模型。通过安装MPICH构建MPI编程环境,从而进行并行程序的开发。MPICH是MPI(Message-Passing Interface)的一个应用实现,支持最新的MPI-2接口标准,是用于并行运算的工具。
mpich官方网址
mpich github下载地址
二、★Mpich软件版本:
Mpich主流稳定的版本:
1. mpich2-1.4.1p1.tar.gz
2. mpich-3.4.3.tar.gz
三、★Mpich2-1.4.1编译安装
3.1静态库的GNU编译(lib文件只含有静态库)
第一种模式: 利用centos7.9自带的gnu编译器gcc/g++/gfortran4.8.5进行默认参数编译
应用范围: 不需要调用mpich动态库,且调用mpich进行编译的源码不含有fortran源码
# 这种模式下编译的mpich,产生的lib文件下是没有动态库*.so和fortran库文件libmpichf90.so
tar -zxvf mpich2-1.4.1p1.tar.gz
cd mpich2-1.4.1p1
./configure --prefix=指定mpich2安装路径
make
make install
第二种模式: 链接Intel编译器icc/icpc/ifort进行默认参数编译
应用范围: 系统已安装intel编译器并导入到当前环境中,不需要调用mpich动态库,且调用mpich进行编译的源码不含有fortran源码
# 这种模式下编译的mpich和intel进行了绑定,但产生的lib文件下是没有动态库*.so和fortran库文件libmpichf90.so
tar -zxvf mpich2-1.4.1p1.tar.gz
cd mpich2-1.4.1p1
CC=icc CXX=icpc FC=ifort F77=ifort \
./configure --prefix=指定mpich安装路径
make
make install
3.2动态库的Intel编译(lib文件含有动态库和静态库)
第一种模式: 利用centos7.9自带的gnu编译器gcc/g++/gfortran4.8.5进行允许动态库参数编译
应用范围: 需要调用mpich动态库,且调用mpich进行编译的源码含有fortran源码
# 这种模式下编译的mpich,产生的lib文件会有动态库*.so和fortran库文件libmpichf90.so
tar -zxvf mpich2-1.4.1p1.tar.gz
cd mpich2-1.4.1p1
./configure --prefix=指定mpich2安装路径 \
--enable-cc --enable-cxx \
--enable-fc --enable-f77 \
--enable-shared
make
make install
第二种模式: 利用Intel编译器icc/icpc/ifort进行允许动态库参数编译
应用范围: 系统已安装intel编译器并导入到当前环境中,需要调用mpich动态库,且调用mpich进行编译的源码含有fortran源码
# 这种模式下编译的mpich和intel进行了绑定,产生的lib文件下有动态库*.so和fortran库文件libmpichf90.so
tar -zxvf mpich2-1.4.1p1.tar.gz
cd mpich2-1.4.1p1
CC=icc CXX=icpc FC=ifort F77=ifort \
./configure --prefix=指定mpich安装路径 \
--enable-cc --enable-cxx \
--enable-fc --enable-f77 \
--enable-shard
make
make install
注意! Mpich2的版本中,mpich2以内的版本默认安装是没有加入允许构建动态库的参数的,所以如果不加编译好的库文件里是没有动态库文件的。这种情况会导致,一些调用mpich2软件在编译过程种因无法找到mpich的动态库而编译失败。
四、★Mpich-3.4.3编译安装
4.1Gnu编译版本
此版本直接调用centos7.9自带的gnu编译器进行编译,相对于mpic2版本中增加一个参数–with-device=ch4:ofi 绑定Fortran的参数改为 --enable-fortran
tar -zxvf mpich-3.4.3.tar.gz
cd mpich-3.4.3
./configure --prefix=指定mpich安装路径 \
--enable-cxx --enable-cc \
--enable-fortran \
--enable-shared \
--with-device=ch4:ofi
4.2Intel编译版本
此版本需要调用intel编译器进行编译,相对于mpic2版本中增加一个参数–with-device=ch4:ofi 绑定Fortran的参数改为 --enable-fortran
tar -zxvf mpich-3.4.3.tar.gz
cd mpich-3.4.3
CC=icc CXX=icpc FC=ifort F77=ifort \
./configure --prefix=指定mpich安装路径 \
--enable-cxx --enable-cc \
--enable-fortran \
--enable-shared \
--with-device=ch4:ofi
注意! Mpich3以内的版本都默认编译动态库,所以如果不想编译生成动态库文件,可以把参数–enable-shared替换成–enable-shared=no 如果不想链接fortran,直接删除参数–enable-fortran就可以了。
注意! 无论是GUN或是Intel编译的哪种mpich版本,都建议使用绑定C++和FORTRAN的方式进行编译安装,它会比默认安装方式多生成*_cxx.so等动态库,根据作者经验在后续很多开源CAE软件调用mpich的时候,都需要调用。
五、★Mpich环境加载
无论哪个版本的mpich安装完成后,我们需要调用它的可执行文件/库文件等,就需要导入到当前的环境中,这里给出两种模式的导入方式,第一种情况适合在个人linux操作系统,第二种情况适合在管理HPC(高性能计算集群)的环境下。
5.1个人主机环境
vim ~/.bashrc #打开个人环境配置文件.bashrc,增加如下命令,保存退出
export MPI_ROOT=指定自己mpich的安装路径
export PATH=$MPI_ROOT/bin:$PATH
export LD_LIBRARY_PATH=$MPI_ROOT/lib:$LD_LIBRARY_PATH
source ~/.bashrc # 执行立即生效命令
5.2HPC集群环境
module avail #确定当前是否安装Environment Modules软件包,如果有可以看到环境配置文件路径
cd /当前环境的路径/modules5/modulefiles #进入到自己Environment Modules中的配置目录中
mkdir mpich;cd mpich
vim 1.4.1 # 新建文件,以mpich的版本号为名字加以区分,增加如下命令,保存退出
#%Module1.0
## Module file created by author
conflict mpich
proc ModulesHelp { } {
puts stderr "by gcc 4.8.5"
}
prepend-path PATH "指定mpich的安装路径/bin"
prepend-path LD_LIBRARY_PATH "指定mpich的安装路径/lib"
module avail
module load mpich/1.4.1 #导入mpich环境
注意! 如果你的mpich 编译的时候使用了intel编译器,那么当你导入mpich环境的时候,也需要导入intel编译器的环境。
六、★Mpich验证
无论哪种导入方式,当导入mpich环境成功后,我们就需要验证一下是否导入成功。
6.1 mpich验证GNU编译方式
mpichversion # 查看安装版本信息命令,如下图所示。所有mpich版本都适用
如上图所示,当发现MPICH CC /CXX/F77/FC后面指定是gcc/g++/gfortran的时候,说明当前的mpich编译的时候是指定了GNU编译器,且没有–enable-fortran参数,说明没有链接fortran库。
6.2 mpich验证Intel编译方式
如上图所示,当发现MPICH CC /CXX/F77/FC后面指定是icc/icpc/ifort的时候,说明当前的mpich编译的时候是指定了Intel编译器,同时有参数–enable-fortran,说明链接了Fortran库
七、★Mpich并行计算调用
7.1 并行方式区别
注意! 在调用mpich前,需要先了解一下现在主流的几种并行调用方式:openmp openmpi mpich
- openmp 是针对单台服务器上多核/多CPU并行计算,也就是说,OpenMP适合单台服务器共享内存结构上的并行计算,而不能进行多台服务器跨节点的并行计算。如果计算数据网格量大,需要多台服务器并行计算提高计算速度,那它就不适合。
- openmpi 是可以在单台服务器上多核/多CPU并行计算,也可以进行多台服务器跨节点的并行计算,同时在并行的通信网络标准上可以调用infinibind,也就是IB网络,它具有极高的吞吐量和极低的延迟,现在主流的可以达到100Gbps,当然还有更高的。适合超大规模的数据并行计算,在各大高性能超算中心都基本使用它。
- mpich 它和openmpi一样也是可以在单台和多台服务器之间进行并行计算,最主要的区别是在通信网络标准上它只能走Ethernet,也就是我们常见的RJ45口。虽然现在也有万兆的光口了,但是主流的还是10/40Gbps,所以在进行大规模数据并行计算的时候,是没有openmpi并行效率高的。适合中小规模的数据并行计算。
7.2 mpich并行调用
在调用mpich前,一定要保证mpich的环境已经导入当前的环境中,一般求解器编译的时候加载的是什么版本的mpich,那么在进行并行计算的时候也要加载对应的版本。举例的求解器为我在Dust_Windows_cygwin编译安装文章中编译的求解器。Dust-Linux_Centos7.9离线编译安装
# 单台服务器并行调用
mpichversion # 查看当前环境时候是否加载mpich,同时核对版本
ls -l dust # 进入到需要调用求解器所在的目录中,并查看求解器是否有可执行权限
chmod +x dust # 如果没有,就增加可执行权限
mpirun -np 8 ./dust # 运行并行命令, 8 是并行的核数,具体数值根据当前自己核数确定
# 多台服务器,跨节点并行调用
mpichversion # 查看当前环境时候是否加载mpich,同时核对版本
ls -l dust # 进入到需要调用求解器所在的目录中,并查看求解器是否有可执行权限
chmod +x dust # 如果没有,就增加可执行权限
touch hostname # 新建多台服务器主机名文件
echo -e "node1\nnode2\nnode3" >> hostname# 写入node1 node2 node3,它们是服务器的主机名
mpirun -np 24 -f hostname ./dust # -f 指定读取主机名的文件hostname,并自动给每个主机分配8核
八、★最后
以上内容都是经过实战验证过的,因并行软件库在很多的CAE软件中都会调用,因此后续会继续编写openmpi的详细编译过程和在高性能集群中的调用命令。
OpenMPI_linux-centos7.9系统源码编译安装调用