24小时热门版块排行榜    

CyRhmU.jpeg
查看: 3030  |  回复: 5
【奖励】 本帖被评价3次,作者pwzhou增加金币 2.4
本帖产生 2 个 QC强帖 ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

pwzhou

铁杆木虫 (正式写手)


[资源] 【pwzhou个人文集】Molpro 2010.1 PL20 并行编译

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

原文同时也发布在网易博客上了:http://blog.163.com/sjsznh@126/b ... 620902011451159954/

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

[ Last edited by pwzhou on 2011-5-6 at 19:44 ]
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

★★★★★ 五星级,优秀推荐

铁杆庄稼颗颗立
摩尔笸箩并编译
千兆交换滚滚来
中央处理片片驱
5楼2011-06-12 09:53:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 6 个回答

pwzhou

铁杆木虫 (正式写手)


375642546(QC强帖+1): 2011-05-06 17:00:49
Molpro 2010.1 PL20并行编译(二):千兆网络

网易博客地址:http://blog.163.com/sjsznh@126/b ... 090201146102522752/

在没有InfiniBand网络而只有千兆网络的情况下,跨节点并行已经没有任何必要,其编译过程与有InfiniBand网络的类似,只需要在编译ga库的时候去掉--with-openib,而在编译的molpro的时候不加入-libverbs的链接参数即可。

PS:如果不想使用MPI,请将--with-mpi设置为no,即:--with-mpi=no

这里提供2种不同环境下的编译(不同的编译器、ga库、mpi以及数学库)。
1. intel编译器套件:intel编译器套件(icc、ifort 11.1.072,MKL 10.2.5.035,intelmpi 4.0.0.028,ga库5-0-2):

环境变量设置:source /home_soft/application/compiler/intel/ictce/4.0.0.020/ictvars.sh

解压ga库以及molpro源代码,进入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="/home_soft/application/compiler/intel/impi/4.0.0.028/intel64/lib -I/home_soft/application/compiler/intel/impi/4.0.0.028/intel64/include" --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

make -j 8 2>&1 | tee make.log
make install

进入molpro目录进行编译:

./configure -x86_64 -i8 -icc -ifort -mpp -mppbase /home_soft/software/chem/molpro2010.1/build_impi/ga-5-0-2/bld -nohdf5

BLASLIB和LAPACK的设置,具体如何获得请参考前一篇日志:
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

make -j 8 2>&1 | tee make.log
make install

2. 由于此环境的CPU为AMD CPU,因此采用了PGI编译器10.0,以及由gcc和pgf90编译的mpich2-1.3,数学库采用了PGI自带的ACML库,ga库为5-0-2版本:

设置环境变量:source /home_soft/dawning/application/env/mpich2-1.3-gcc_pgf90.rc (mpich2-1.3-gcc_pgf90.rc 这个是自己写的一个简单脚本,其中设置了PGI和MPICH的环境变量)

ga库编译:
mkdir bld && cd bld
export BLAS_I8=yes
export BLAS_LIB="-lacml_mv -lacml"              #ACML库自带的BLAS库的链接参数,很简单。

../configure --prefix=`pwd` --enable-f77 F77=pgf90 CC=gcc CXX=g++ --with-tcgmsg --with-mpi="-L/home_soft/dawning/application/mpi/mpich2-1.3/gcc_pgf90/lib -lmpichf90 -lmpichf90 -lmpich -lopa -lmpl -lrt -lpthread -I/home_soft/dawning/application/mpi/mpich2-1.3/gcc_pgf90/include" --with-blas="-lacml_mv -lacml" 2>&1 | tee configure.log
# --with-mpi的链接参数由mpif90 -link-info命令获得

make -j 8 2>&1 | tee make.log
make install

molpro编译:
./configure -x86_64 -i8 -pgcc -pgf90 -mpp -mppbase /home_soft/software/chem/molpro2010.1/build_pgi/ga-5-0-2/bld -nohdf5
BLASLIB="-lacml_mv -lacml"
LAPACKLIB="-lacml_mv -lacml"

make -j 8 2>&1 | tee make.log
make MOLPRO_OPTIONS="-n 2" quicktest
make install
注意:mppbase指向的是ga库的编译目录,而不是安装目录,molpro的configure会自动从编译目录找到安装目录。

这两篇日志所涉及的编译全部为64位环境,32位环境的可以自己参照修改即可。

[ Last edited by pwzhou on 2011-5-15 at 01:14 ]
2楼2011-05-06 11:45:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复(可上传附件)
信息提示
请填处理意见