最近需要用到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
可以解决,但似乎又会出现新的错误,只有把编译器版本降低网上有降低教程。其他的就没啥了祝大家一次就安装成功不折腾。