|
本帖最后由 万里云 于 2015-6-25 20:16 编辑
一、QE源码下载、编译及测试
1.1 源码下载
从5.0版开始,QE官方不再将各模块整合在一起发布,而是只在源码包中包含最基本的PW、CP和PP模块。其余的模块,比如做赝势的atomic,算声子的PHonon,算过渡态的neb等需要单独下载。源码包下载地址为http://qe-forge.org/gf/project/q-e/frs/?action=FrsReleaseBrowse&frs_package_id=18,如无特殊计算需求,可以只下载espresso-x.x.x.tar.gz。最新的稳定版为5.1.2,以下我们就以此版本为例,演示如何编译QE。
1.2 编译
个人认为,计算环境可分为两类:单一服务器和集群。在用户环境设置方面,单一服务器一般是自己私有的,可以为每个使用者建一个账户,可以放心大胆地修改环境变量;而集群一般是公有的,多个使用者使用同一个账户,修改环境变量必须要慎重,没有单一服务器那么自由。在任务调度方面,单一服务器一般不安装调度系统,而是直接使用mpirun提交;而集群有复杂的任务调度系统。在编译环境方面,单一服务器需要自己装编译器和MPI,而集群则预装多种编译器和对应的MPI。因此,这两种计算环境下编译QE的设置不同。
单一服务器一般会随系统附带GNU编译器,但是并不好用。我曾经用基于GNU的MPI编译过QE,编译勉强能过,测试时一堆segment fault。为了能顺利编译并通过测试,以及获得比较高的执行效率,推荐使用Intel编译器+MKL。集群则比较方便,有多种编译器和MPI可供使用。Openmpi C / C++ / Fortran的mpi程序为 mpicc / mpic++ / mpif90,Intel MPI对应的是mpiicc / mpiicpc / mpiifort。除了GNU和Intel编译器之外,还有PGI,Pathscale等编译器,不过比较少见,一般碰不到。
1.2.1 通用准备工作
无论是在单一服务器上编译,还是在集群上编译,这一步是通用的。首先将espresso-5.1.2.tar.gz上传至服务器并解压,如果需要编译其它模块,将相应的压缩包复制到解压后的espresso-5.1.2/archive目录。在编译过程中,系统会自动解压这些压缩包,因此不要画蛇添足。编译完后测试PW模块需要赝势,而自5.0版之后源码包中附带的赝势不全,需要联网下载。由于单一服务器和集群一般不能连外网,因此测试时就会报错。解决方案是下载一份4.x版的QE,把其中pseudo子目录中的赝势添加到5.1.2版的pseudo子目录里。这一步之后,接下来的工作因计算环境而异。
1.2.2 单一服务器上编译QE
前文提到单一服务器可以自由修改环境变量,因此我们可以全部使用动态链接库,便于configure自动识别。在开始编译前,确保$HOME/.bashrc中含有这一行:
source /opt/intel/bin/compilervars.sh intel64
这一行确保了与Intel编译器和MKL相关的环境变量设置正确。
正确设置编译器之后,我们先编译openmpi。这里以1.8.5版为例,将源码上传至服务器后解压,进入源码子目录,执行如下命令:
export CC=icc
export CXX=icpc
export FC=ifort
export CFLAGS="-O3 -xHost"
export CXXFLAGS="-O3 -xHost"
export FCFLAGS="-O3 -xHost"
./configure \
--prefix=$HOME/code/openmpi-1.8.5 \
--enable-mpi-fortran=yes --enable-mpi-cxx=yes --enable-mpi-java=no \
--enable-wrapper-rpath=yes --enable-cxx-exceptions=yes \
--enable-mpi-thread-multiple=yes \
--enable-shared=yes --enable-static=yes
配置完成后make -j 2,然后make check检查编译是否成功,最后make install安装openmpi-1.8.5至$HOME/code/openmpi-1.8.5目录。安装完之后,将如下内容添加至$HOME/.bashrc以设置相关环境变量:
export LD_LIBRARY_PATH=$HOME/code/openmpi-1.8.5/lib:$LD_LIBRARY_PATH
export PATH=$HOME/code/openmpi-1.8.5/bin:$PATH
最后执行命令source $HOME/.bashrc以更新设置。
接下来编译FFTW-3.3.4,解压源码,进入源码目录,执行如下命令:
export CC=icc
export F77=ifort
export CFLAGS="-O3 -xHost"
export FFLAGS="-O3 -xHost"
./configure --prefix=$HOME/code/fftw-3.3.4 --enable-sse2 --enable-shared
然后仿照编译openmpi,make -> make check -> make install三部曲。安装完后,将如下内容添加至$HOME/.bashrc:
export LD_LIBRARY_PATH=$HOME/code/fftw-3.3.4/lib:$LD_LIBRARY_PATH
最后执行命令source $HOME/.bashrc以更新设置。
最后编译QE。进入源码目录,执行如下命令:
export MPIF90=mpif90
export CC=icc
export FC=ifort
export F77=ifort
export CFLAGS="-O3 -xHost"
export FCFLAGS="-O3 -xHost"
export FFLAGS="-O3 -xHost"
./configure --prefix=$HOME/code/espresso-5.1.2
因为前面已经设置好了环境变量,系统会自动找到FFTW和MKL,因此configure后面不加相关设置就可启用MPI并行 + MKL + ScaLapack + FFTW。如果使用Intel MPI,系统可能无法找到对应的BLACS库,这时需要在configure后面加参数SCALAPACK_LIBS="-lmkl_scalapack_lp64 -lmkl_blacs_intelmpi_lp64"来指定。设置完之后,make pw即可编译PW模块,make cp即编译CP模块,make pp即编译PP模块,make ph即编译PHonon模块,其它依此类推。
1.2.3 集群上编译QE
集群相对不自由,不能随便设置环境变量。有的集群编译节点和计算节点给出的动态链接库不同,会导致“编译测试都没问题,但一提交任务就报错退出”这种稀奇古怪的错误,我们组在编译VASP时就遇到过这问题。一个简单粗暴的方法就是全部使用静态链接库。这种方法也有缺点,比如编译出的程序体积很大,但还没达到令人难以接受的地步。FFTW编译部分相同,不同之处在于编译QE时的设置。以下举两个例子,大家可以根据自己所用集群编译器和MKL设置进行修改。
第一个例子是天津超算中心。它使用了自己开发的MPI,mpi程序名与openmpi一致,却需要链接Intel MPI对应的BLACS库(怀疑是套了马甲的IntelMPI)。设置如下:
export MPIF90=mpif90
export F90=ifort
export F77=ifort
export FC=ifort
export CFLAGS=-O2
export FFLAGS=-O2
export FCFLAGS=-O2
export MKL_LIB_PATH=/opt/intel/composer_xe_2013.0.079/mkl/lib/intel64
export FFT_LIB_PATH=$HOME/lib/fftw-3.3.4/lib
./configure --prefix=$HOME/code/espresso-5.1.2 \
BLAS_LIBS="-Wl,--start-group \
$MKL_LIB_PATH/libmkl_intel_lp64.a \
$MKL_LIB_PATH/libmkl_sequential.a \
$MKL_LIB_PATH/libmkl_core.a \
-Wl,--end-group" \
SCALAPACK_LIBS="-Wl,--start-group \
$MKL_LIB_PATH/libmkl_scalapack_lp64.a \
$MKL_LIB_PATH/libmkl_blacs_intelmpi_lp64.a \
-Wl,--end-group" \
FFT_LIBS="$FFT_LIB_PATH/libfftw3.a"
第二个是我们学校的超算中心,用了Intel MPI,因此环境变量MPIF90值有所变化:
export MPIF90=mpiifort
export F77=ifort
export F90=ifort
export FC=ifort
export CFLAGS=-O2
export FCFLAGS=-O2
export FFLAGS=-O2
export MKLDIR=$HOME/lib/mkl-13.0.080
./configure --prefix=$HOME/code/espresso-5.1.2 \
BLAS_LIBS="-Wl,--start-group $MKLDIR/libmkl_intel_lp64.a $MKLDIR/libmkl_sequential.a $MKLDIR/libmkl_core.a -Wl,--end-group" \
SCALAPACK_LIBS="-Wl,--start-group $MKLDIR/libmkl_scalapack_lp64.a $MKLDIR/libmkl_blacs_intelmpi_lp64.a -Wl,--end-group" \
FFT_LIBS="$HOME/lib/fftw-3.3.4/lib/libfftw3.a"
make部分操作同单一服务器。
1.3 测试
PW模块自带一个测试脚本,该脚本默认以串行方式调用pw.x,也可以以并行方式调用。由于集群一般禁止在登录节点运行任务,因此串行方式更通用。
进入espresso-5.1.2/PW/tests目录,执行命令./check-pw.x.j即可启动该脚本。一般情况下输出是这样的:
Checking atom-lsda...passed
Checking atom-pbe...passed
Checking atom-sigmapbe...passed
Checking atom...passed
Checking b3lyp-O...passed
Checking b3lyp-h2o...passed
但也有可能遇到这样的:
Checking cluster2...discrepancy in force detected
Reference: 0.5354, You got: 0.5355
这些微小的数值误差无关紧要,只要没有ERROR就可以。
在单服务器上可以用并行模式调用pw.x,为此先打开espresso-5.1.2/environment_variables这个文件,找到这么两行:
PARA_PREFIX="mpirun -np 2"
PARA_PREFIX=" "
删除最下面那行,再执行check-pw.x.j即可并行测试。可以通过调整np后面的数值来改变所用核数,但不要设置过大,4就差不多了。
测试完成后,make install即可将程序复制到--prefix指定的目录(这里是$HOME/code/espresso-5.1.2)。将此目录添加到环境变量PATH,在单一服务器上就可直接用"mpirun -np 16 pw.x -in abc.in > abc.out 2>&1 &"这样的命令提交任务了。集群有自己的提交方式。比如天津超算是“yhrun -J XXX -n 12 -p TH_xxx pw.x -in abc.in > abc.out 2>&1 &",使用LSF任务调度系统的则需要使用bsub命令。
|
评分 Rate
-
查看全部评分 View all ratings
|