当前位置: 首页 > 工具软件 > LAPACK > 使用案例 >

关于linux安装mpich/openmpi+lapack+scalapack实现并行计算安装过程以及遇到的一些坑

法烨华
2023-12-01

最近需要用到scalapack库做并行计算,要安装mpi和lapack,遇到一些问题,弄明白了分享一下给后来人避坑
我是用fortran编程计算的,这里主要涉及fortran编译器的一些问题
一.安装mpich/openmpi
1.安装前检查编译器,未安装的先安装好(gfortran或ifort要有一个)

gcc --version
g++ --version
gfortran --version
ifort
echo $SHELL

2.下载对应的mpi库(二选一,后边安装分别对应自己的)
mpich官网
openmpi官网
3.解压

tar xfz mpich-4.1.1.tar.gz
tar zxvf openmpi-4.1.5.tar.gz

4.建立安装目录(坑:这里注意选择要与上边编译器对应的用户目录,是user目录还是根目录)

mkdir /home/(username)/mpich_install(用户目录); sudo mkdir /usr/local/mpich_install (根目录))
mkdir /homeo/(username)/penmpi_install;sudo mkdir /usr/local/mpich_install

一定要注意上边选择的安装目录要与编译器对应用户目录一样,不然后边安装会找不到编译器库对应报错

libtool: line 8979: ifort: command not found

5.配置
进入前的解压文件,配置路径,编译器选择,编译器Flag条件等,默认条件在Makefile文件里面可以看到,如果想修改对应的选项使用命令 : ./configure xxx=xxx
配置安装路径在./configure --prefix=后跟前边建好的安装文件夹绝对路径如

./configure --prefix=/home/(username)/mpich_install 
or
./configure --prefix=/usr/local/mpich_install 

更改编译器选择ifort编译或者gfortran编译(gfortran好像是默认编译器)

./configure   F77=ifort   FC=ifort 

可以在配置路径时后边添加命令

坑:注意这里选择用什么编译器编译mpi后边lapack,scalapack也要用一样的不然会不兼容scalapack安装失败
更多配置请阅读mpi他们对应的README文件,其他的一般默认就可以
6.编译安装

make (几十分钟)
make install (安装失败要清除之前安装的:make uninstall)
如果之前使用的是root安装目录不是普通用户目录用或者报错 "cannot remove/mkdir"用
sudo make install

7.添加环境变量

vi  ~/.bashrc
末尾添加
export MPI_ROOT=/home/username/mpich_install   #安装路径
export PATH=$MPI_ROOT/bin:$PATH
export MANPATH=$MPI_ROOT/man:$MANPATH
保存退出
source  ~/.bashrc

8.查看安装成功与否

which mpicc

which mpiexec   #mpich

which mpif90    #openmpi

运行一下example里的文件看看是否安装成功

mpiexec -n 4 ./examples/cpi   #mpich的测试

到这里mpi库就安装完了,一般错误都好解决,容易奇怪的错误就是make install时候报错

libtool: line 8979: ifort: command not found

这是ifort和mpi安装设置的时候路径没统一,一个在当前普通用户路径下,一个用了sudo在root用户下,导致链接库的时候ifort他找不到.解决办法一:两个在安装的时候都安装在用户路径下或者root路径下,解决办法二:在配置openmpi configure文件时加上ifort的绝对路径(which ifort 然后复制路径 ./configure FC=/path/to/ifort)
二.安装lapack库
scalapack安装需要用到blash和lapack这两个库,需要先安装
1.下载lapack
lapack官网
2.解压文件进入

tar zxvf  lapack-3.11.0.tar.gz
cd lapack-3.11.0

3.配置make.inc

cp make.inc.example  make.inc   #里面是默认的安装配置
下面是编译后库的生成路径,可以更改到自己想要的安装路径,也可以不改编译完考到系统库里
BLASLIB      = $(TOPSRCDIR)/librefblas.a
CBLASLIB     = $(TOPSRCDIR)/libcblas.a
LAPACKLIB    = $(TOPSRCDIR)/liblapack.a
TMGLIB       = $(TOPSRCDIR)/libtmglib.a
LAPACKELIB   = $(TOPSRCDIR)/liblapacke.a

FC = gfortran        #默认gfortran编译要改ifort把gfortran改为ifort
FFLAGS = -O2 -frecursive   #默认日志格式和优化级别,可以改成 -03 -fPIC,表示优化级别03,-fPIC表明与路径无关
FFLAGS_DRV = $(FFLAGS)
FFLAGS_NOOPT = -O0 -frecursive

4.make
保存退出make.inc,运行

make

然后就会生成

liblapack.a,librefblash.a,libtmglib.a 库文件

拷贝到系统库位置即可

sudo cp *.a /usr/local/lib/
可以在bashrc文件里再写一上动态库链接环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/username/lapack-3.11.0
export BLAS=$BLAS:/home/username/lapack-3.11.0
export LAPACK=$LAPACK:/home/username/lapack-3.11.0

上边即完成lapack的安装,现在mpi与lapack,blash库都安装了,即可开始安装scalapack
三.安装SACLAPACK库
安装步骤实际上和lapack库安装是一样的只需要注意编辑SLmake.inc有点不一样

FC            = mpif90               #mpif90更改为前边mpi安装成功后的,如mpich中mpifort     

CC            = mpicc                #C语言编译器可以不用管 

NOOPT         = -O0                  #优化级别 后边可以加 -fPIC

FCFLAGS       = -O3                  #优化级别 后边可以加 -fPIC

CCFLAGS       = -O3                  #优化级别 后边可以加 -fPIC

FCLOADER      = $(FC)

CCLOADER      = $(CC)

FCLOADFLAGS   = $(FCFLAGS)

CCLOADFLAGS   = $(CCFLAGS)

SCALAPACKLIB  = libscalapack.a       #生成的scalapack库名字

BLASLIB       = -lblas               #blas库链接,改为-lrefblas或者librefblas.a的绝对路径
                                      =  /usr/local/lib/librefblas.a
LAPACKLIB     = -llapack             #lapack库链接不变或者改为liblapack绝对路径

LIBS          = $(LAPACKLIB) $(BLASLIB) 

安装scalapack的关键在于前mpi和lapack库的安装,前边安装好了一般都没什么问题可以直接编译成功,所有过程只需注意一点编译器一定要统一,用gfortran就所有库全部都一样,用ifort也要全部一样,貌似大家都默认用gfortran用ifort要改相应的配置文件。
如果出现Rank mismatch between actual argument at (1) and actual argument at (2)..(省略)错误就是编译器版本太高了,网上说编译命令后边加上-fallow-argument-mismatch可以解决,但似乎又会出现新的错误,只有把编译器版本降低网上有降低教程。其他的就没啥了祝大家一次就安装成功不折腾。

 类似资料: