Molpro 2010.1 PL20并行编译(一):InfiniBand网络

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并执行如下命令即可:

make -C lib veryclean
make

关于此问题的讨论:http://www.molpro.net/pipermail/molpro-user/2010-September/003886.html

2. 在使用intel编译器的时候你可能会遇到类似于如下的错误提示:
ifort: error #10106: Fatal error in /home_soft/application/compiler/intel/Compiler/11.1/072/bin/intel64/fortcom, terminated by kill signal(2011.5.18:昨天突然间明白这个问题并不是max locked memeory的问题,而是我在集群上部署了cron任务,每隔半个小时会杀掉那些不是使用作业管理系统提交的并且CPU占用比较大的进程,当时编译的时候自己忘记了这件事请)

出现这个错误的原因是因为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/

我们的系统是64位的,因此使用的BLAS库和LAPACK库都使用8位整数,根据上述页面得到的编译参数为:

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 压缩文件名。

解压完成后进入ga的目录,执行如下命令进行编译:

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文件中。

执行完上述命令后,ga库就编译好了。我们可以通过如下命令检测ga库是否编译正确:
mpirun --rsh=ssh ./global/testing/test.x > test.log
如果编译没问题的话,你应该在test.log文件末尾可以看到如下的输出:
                         ------------------------------

       create   destroy   get      put      acc     scatter   gather  read&inc
calls:   11       10     1.96e+04 1602     1604       42       40      100     
number of processes/call 1.00e+00 1.00e+00 1.00e+00 9.52e-01 1.00e+00
bytes total:             5.98e+06 4.57e+06 6.51e+05 8.02e+04 7.78e+04 8.00e+02
bytes remote:            0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00
Max memory consumed for GA by this process: 1048576 bytes
  

 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"

此处再稍微解释一下:-x86_64和-i8其实不用写,configure会自动正确设置这两个参 数,-icc和-ifort代表我们要使用intel编译器,-mpp表示我们要编译的为并行版本,-mppbase指向之前编译好的ga库目 录,-nohdf5表示我们不使用额外的hdf5库,-var LIBS="-libverbs"加入InfiniBand的编译参数。

执 行如上命令的的时候configure会自动检测到icc和ifort的目录,以及mpp和mpi的编译参数,所以遇到这些提问的时候直接回车即可,当提 示到BLAS和LAPACK的编译参数时,请按照前面给出的参数设置或者暂时不设置,而是在configure执行完之后直接修改CONFIG文件中的 BLASLIB和LAPACKLIB。

configure完成之后执行如下命令进行编译:
make -j 8 2>&1 | tee make.log   (-j 8代表用8个CPU核心同时编译,我们的单个机器有8个CPU Cores,这样可以大幅提高编译速度)。
make完成之后我们可以用如下命令进行一个快速的测试,以保证我们编译出来的程序执行起来没有问题:
make MOLPRO_OPTIONS="-n 2" quicktest
测试完成之后还可以用make tuning命令针对本机做一些优化。

最后用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/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/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 -j 8 2>&1 | tee make.log   
make MOLPRO_OPTIONS="-n 2" quicktest (可省略)
make tuning (可省略)
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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值