molpro官方网站:http://www.molpro.net/
编译之前的准备工作:
1. 请首先安装编译器以及相应的MPI,编译器可以选择Linux系统自带的GNU编译器(gcc、gfortran),也可以选择intel编译器 (icc、ifort)或者PGI编译器(pgcc、pgf90),通常在intel的CPU上我会选择Intel编译器,在AMD的CPU上我会选择 PGI编译器,只有在极少数的情况下才会选择用GNU编译器。MPI可供选择的有intel mpi(这个没有免费版本)、openmpi、mvapich、mpich等。上述提及的编译器和mpi在我们的集群上均有安装,此处不再介绍如何安装这 些编译器和mpi。
2. molpro源代码以及其并行所需要的Global Array(GA)库,GA库官方地址为:http://www.emsl.pnl.gov/docs/global/。目前最新版为5.0.2,你不需要单独去下载这个库,在解压后的molpro文件夹下的src目录下就有ga-5-0-2.tgz。当然如果你想用早一点的版本就得自己去下载了,注意ga 5.0以后版本的编译方式和之前版本的略有差别。
3. license文件,文件名为token,安装之前请将此文件放在~/.molpro文件夹下(mkdir ~/.molpro && cp token ~/.molpro)。
编译过程可能遇到的问题以及解决方案:
1. 对于Intel mpi或者mvapich,在编译之前必须启动mpd守护进程(设置好环境变量之后运行 mpd & 即可),否则编译完之后运行会遇到如下的错误提示:
openc: Error in opening file [...]/molpro2010.1/testjobs/../lib/ABDATA 。
如果你在编译完成之后碰到这个问题,那也不用恼火,你不需要重新编译,只需要启动mpd并执行如下命令即可:
关于此问题的讨论:http://www.molpro.net/pipermail/molpro-user/2010-September/003886.html
出现这个错误的原因是因为max locked memory没有设置为unlimited(用ulimit -a命令可以查看,默认的设置值为32,用命令ulimit -l unlimited可以将此值设置为unlimited)。因此,当碰到这个错误的时候,请首先执行ulimit -l unlimited命令,然后重新编译即可。
总结一下:使用intelmpi和mvapich,在编译器首先启动mpd,使用intel编译器,请保证max locked memory的值为unlimited。
编译过程:
在这里提供3种不同环境下的编译(不同的编译器、ga库、mpi以及数学库,InfiniBand驱动为OFED 1.5)
1. intel编译器套件:icc、ifort ,版本10.1.015;MKL数学库10.1.1.019,intel mpi 3.2。ga库版本4.3.3,机器有InfiniBand网络,安装的驱动版本为OFED 1.5。
source /hptc_cluster3/application/compiler/intel/fce/10.1.015/bin/ifortvars.sh
source /hptc_cluster3/application/compiler/intel/cce/10.1.015/bin/iccvars.sh
source /hptc_cluster3/application/compiler/intel/mkl/10.1.1.019/tools/environment/mklvarsem64t.sh
source /hptc_cluster3/application/mpi/intel/3.2/bin64/mpivars.sh
我们在编译过程中将使用intel mkl库所带的BLAS和LAPACK库,关于这两个库的链接参数可在如下页面获得:http://software.intel.com/en-us/articles/intel-mkl-link-line-advisor/
BLASLIB=-L${MKLROOT}/lib/em64t -I${MKLROOT}/include -I${MKLROOT}/em64t/ilp64 -lmkl_blas95_ilp64 ${MKLROOT}/lib/em64t/libmkl_solver_ilp64_sequential.a -Wl,--start-group ${MKLROOT}/lib/em64t/libmkl_intel_ilp64.a ${MKLROOT}/lib/em64t/libmkl_sequential.a ${MKLROOT}/lib/em64t/libmkl_core.a -Wl,--end-group -lpthread
LAPACKLIB=-L${MKLROOT}/lib/em64t -I${MKLROOT}/include -I${MKLROOT}/em64t/ilp64 -lmkl_lapack95_ilp64 ${MKLROOT}/lib/em64t/libmkl_solver_ilp64_sequential.a -Wl,--start-group ${MKLROOT}/lib/em64t/libmkl_intel_ilp64.a ${MKLROOT}/lib/em64t/libmkl_sequential.a ${MKLROOT}/lib/em64t/libmkl_core.a -Wl,--end-group -lpthread
设置好MKL的环境变量后,你可以用echo $MKLROOT命令检查一下此变量是否设置正确。
在某一个目录下分别解压ga-4-3-3.tar.gz和molrpo的源代码文件,解压命令:tar zxvf 压缩文件名。
make TARGET=LINUX64 FC=ifort CC=icc USE_MPI=yes MPI_INCLUDE=/hptc_cluster3/application/mpi/intel/3.2/include64 MPI_LIB=/hptc_cluster3/application/mpi/intel/3.2/lib64 ARMCI_NETWORK=OPENIB BLAS_I8=yes BLAS_LIB="-L${MKLROOT}/lib/em64t -I${MKLROOT}/include -I${MKLROOT}/em64t/ilp64 -lmkl_blas95_ilp64 ${MKLROOT}/lib/em64t/libmkl_solver_ilp64_sequential.a -Wl,--start-group ${MKLROOT}/lib/em64t/libmkl_intel_ilp64.a ${MKLROOT}/lib/em64t/libmkl_sequential.a ${MKLROOT}/lib/em64t/libmkl_core.a -Wl,--end-group -lpthread" 2>&1 | tee make.log
稍微解释一下:TARGET为机器类型,我们的操作系统是SLES 10 SP3 x86_64,因此设置为LINUX64,FC为fortran编译器,此处选择intel的ifort,CC为C编译器,此处选择intel的icc, 我们使用intel mpi,因此设置USE_MPI为yes,MPI_INCLUDE和MPI_LIB分别指向intel mpi的include和lib目录,由于使用InfiniBand,因此设置ARMCI_NETWORK为OPENIB,BLAS使用8位整数,因此 BLAS_I8设置为yes,BLAS_LIB的链接参数为我们从intel mkl的官方网页上获得,2>&1,将错误输出重定向到标准输出,tee make.log将编译过程保存在make.log文件中。
All tests successful
接下来我们进入molpro的目录,执行如下命令:
./configure -x86_64 -i8 -icc -ifort -mpp -mppbase /hptc_cluster3/software/chem/molpro_2010.1/build/ga-4-3-3 -nohdf5 -var LIBS="-libverbs"
执 行如上命令的的时候configure会自动检测到icc和ifort的目录,以及mpp和mpi的编译参数,所以遇到这些提问的时候直接回车即可,当提 示到BLAS和LAPACK的编译参数时,请按照前面给出的参数设置或者暂时不设置,而是在configure执行完之后直接修改CONFIG文件中的 BLASLIB和LAPACKLIB。
最后用make install命令进行安装(请在configure过程中设置安装路径)。
2. intel编译器套件:icc、ifort ,版本10.1.015;MKL数学库10.1.1.019,icc和ifort编译的openmpi 1.4.1。ga库版本5.0.2,机器有InfiniBand网络,安装的驱动版本为OFED 1.5。
环境变量设置:
source /hptc_cluster3/application/compiler/intel/cce/10.1.015/bin/iccvars.sh
source /hptc_cluster3/application/compiler/intel/mkl/10.1.1.019/tools/environment/mklvarsem64t.sh
source /hptc_cluster3/application/mpi/openmpi/1.4.1/icc_ifort/bin/mpivars.sh
依然会用到MKL的BLAS和LAPACK库,链接参数和第一种完全相同。
解压molpro源代码文件,解压完成之后再解压其所带的ga5-0-2库,自带的ga库在molpro解压之后的src目录下。
从ga 5.0开始,其编译也成为经典的三部曲:configure、make、make install。首先进入ga的目录,并建立一个bld目录,我们将在此目录下编译安装ga库,这样做的好处是编译所产生的文件将全部在此目录下而其源代码部分将保持不变,因此当编译出错的时候我们可以直接删除bld目录下的所有文件然后再进行重新编译,同时不用担心会有原来编译过程留下的残余文件影响新的编译过程。
mkdir bld && cd bld
在编译GA时使用MKL的BLAS库:
export BLAS_I8=yes
export BLAS_LIB="-L${MKLROOT}/lib/em64t -I${MKLROOT}/include -I${MKLROOT}/em64t/ilp64 -lmkl_blas95_ilp64 ${MKLROOT}/lib/em64t/libmkl_solver_ilp64_sequential.a -Wl,--start-group ${MKLROOT}/lib/em64t/libmkl_intel_ilp64.a ${MKLROOT}/lib/em64t/libmkl_sequential.a ${MKLROOT}/lib/em64t/libmkl_core.a -Wl,--end-group -lpthread"
开始Configure(在bld目录下执行):
../configure --prefix=`pwd` --with-scalapack=no --enable-f77 F77=ifort CC=icc CXX=icpc --with-tcgmsg --with-mpi="/hptc_cluster3/application/mpi/openmpi/1.4.1/icc_ifort/lib -I/hptc_cluster3/application/mpi/openmpi/1.4.1/icc_ifort/include" --with-openib --with-blas="-L${MKLROOT}/lib/em64t -I${MKLROOT}/include -I${MKLROOT}/em64t/ilp64 -lmkl_blas95_ilp64 ${MKLROOT}/lib/em64t/libmkl_solver_ilp64_sequential.a -Wl,--start-group ${MKLROOT}/lib/em64t/libmkl_intel_ilp64.a ${MKLROOT}/lib/em64t/libmkl_sequential.a ${MKLROOT}/lib/em64t/libmkl_core.a -Wl,--end-group -lpthread" 2>&1 | tee configure.log
对于openmpi,--with-mpi参数设置为"/Path-to-lib -I/Path-to-include"即可,configure会自动获得相应的链接参数。如果系统不能自动获得编译参数,对intelmpi和mpich以及mvapich,请使用mpif90 -link-info获取链接参数,并将其设置为--with-mpi的参数。对openmpi,则需要使用mpif90 --showme:link。
configure完成之后make -j 8 2>&1 | tee make.log,然后make install即可。
进入molpro的目录:
./configure -x86_64 -i8 -icc -ifort -mpp -mppbase /hptc_cluster3/software/chem/molpro_2010.1/build_openmpi/ga-5-0-2/bld -openmpi -nohdf5 -var LIBS="-libverbs"
注意:mppbase指向的是ga库的编译目录,而不是安装目录,molpro的configure会自动从编译目录找到安装目录。
依然按照第一种所介绍的设置BLASLIB和LAPACKLIB以及安装路径,然后编译:
make install
注意:openmpi编译出来的在多节点并行(节点内并行一切正常)时会在最后给出一些类似于下面的信息(不过依然会给出正确的结果,应该是一个bug,目前解决方案未知):
ARMCI configured for 2 cluster nodes. Network protocol is 'OpenIB Verbs API'.
0:Segmentation Violation error, status=: 11
(rank:0 hostname:cn040 pid:8271):ARMCI DASSERT fail. ../../armci/src/signaltrap.c:SigSegvHandler():312 cond:0
13:Segmentation Violation error, status=:11
(rank:13 hostname:cn043 pid:21877):ARMCI DASSERT fail. ../../armci/src/signaltrap.c:SigSegvHandler():312 cond:0
3. intel编译器套件:icc、ifort ,版本10.1.015;MKL数学库10.1.1.019,icc和ifort编译的mvapich 2-1.5。ga库版本5.0.2,机器有InfiniBand网络,安装的驱动版本为OFED 1.5。
废话不多说,直接给出编译过程,首先设置环境变量:
source /hptc_cluster3/application/compiler/intel/cce/10.1.015/bin/iccvars.sh
source /hptc_cluster3/application/compiler/intel/fce/10.1.015/bin/ifortvars.sh
source /hptc_cluster3/application/compiler/intel/mkl/10.1.1.019/tools/environment/mklvarsem64t.sh
source /hptc_cluster3/application/mpi/mvapich2-1.5/icc_ifort/bin/mpivars.sh
启动mpd:mpd &
解压molpro和ga,进入ga目录进行编译:
mkdir bld && cd bld
export BLAS_I8=yes
export BLAS_LIB="-L${MKLROOT}/lib/em64t -I${MKLROOT}/include -I${MKLROOT}/em64t/ilp64 -lmkl_blas95_ilp64 ${MKLROOT}/lib/em64t/libmkl_solver_ilp64_sequential.a -Wl,--start-group ${MKLROOT}/lib/em64t/libmkl_intel_ilp64.a ${MKLROOT}/lib/em64t/libmkl_sequential.a ${MKLROOT}/lib/em64t/libmkl_core.a -Wl,--end-group -lpthread"
../configure --prefix=`pwd` --with-scalapack=no --enable-f77 F77=ifort CC=icc CXX=icpc --with-tcgmsg --with-mpi="-L/hptc_cluster3/application/mpi/mvapich2-1.5/icc_ifort/lib -lmpichf90 -lmpich -lopa -lpthread -lrdmacm -libverbs -libumad -lrt -I/hptc_cluster3/application/mpi/mvapich2-1.5/icc_ifort/include" --with-openib --with-blas="-L${MKLROOT}/lib/em64t -I${MKLROOT}/include -I${MKLROOT}/em64t/ilp64 -lmkl_blas95_ilp64 ${MKLROOT}/lib/em64t/libmkl_solver_ilp64_sequential.a -Wl,--start-group ${MKLROOT}/lib/em64t/libmkl_intel_ilp64.a ${MKLROOT}/lib/em64t/libmkl_sequential.a ${MKLROOT}/lib/em64t/libmkl_core.a -Wl,--end-group -lpthread" 2>&1 | tee configure.log
--with-mpi的参数通过mpif90 --link-info命令获得
make -j 8 2>&1 | tee make.log
make install
编译完成ga,进入molpro目录进行编译:
./configure -x86_64 -i8 -icc -ifort -mpp -mppbase /hptc_cluster3/software/chem/molpro_2010.1/build_mvapich2/ga-5-0-2/bld -nohdf5 -var LIBS="-libverbs"
在configure过程中按照前面所说的给出BLASLIB和LAPACKLIB的链接参数。注意:mppbase指向的是ga库的编译目录,而不是安装目录,molpro的configure会自动从编译目录找到安装目录。
make -j 8 2>&1 | tee make.log
make install