ChemiAndy

cp2k x86_64的串行/并行编译(ubuntu/SUSE, GNU编译器)

1. Introduction

cp2k被誉为分子模拟的“瑞士军刀”,因为它支持从经典模拟到第一原理模拟,以及QM/MM等几乎全部类型的原子模拟。其分子力学(Fist模块)支持极化、非极化等多种力场,电子结构计算则支持Gaussian型基组的从头计算,和Gaussian+平面波(GPW)的第一原理计算(QS模块)。周期体系计算支持杂化泛函,并且充分享受GPW的快速优势。它的缺点是,对于固体计算目前尚未支持K点计算,仅支持平面波在gamma点展开。


2. cp2k的下载和安装过程

cp2k的主页:https://cp2k.berlios.de/
下载和安装过程在主页上有清晰的介绍。首先采用cvs这个东东来下载和同步服务器上的源代码包;解压后进入arch文件夹选择对应的编译平台文件并适当修改;然后进入src源码文件夹编译;完成后在exe文件夹下可以找到自动生成的文件夹和可执行文件。

下面我以我的电脑平台为例说明安装的具体过程。我的电脑平台:AMD64-4核,2G内存; Ubuntu 9.10(Karmic) x86-64 version. 这里编译器我使用的是GNU C/Fortran Compiler 4.4.  此外,我在open SUSE11.2下面也测试了一下,顺利通过。其实在ubuntu和SUSE下主要的不同只在于安装gnu编译器和数学库的命令不一样。与cp2k相关的编译过程一样。

一般来说,作为商业软件,intel Compiler/intel MKL数学库可以得到更好的执行性能。但是,因为GNU compiler和数学库在ubuntu下安装配置都是全自动的,简单到一个命令就全部搞定,因此推荐。作为第一步,我们不希望把事情搞的太复杂,对吧?等玩熟了再想法提高cp2k的性能。

【编译前的准备】
安装gnu编译器;安装blas/lapack/fftw3数学库;安装libint数学库;安装并行支持Open-mpi

(1) 安装gfortran编译器
> sudo apt-get install build-essential 
> sudo apt-get install gfortran

(SUSE下 sudo zypper in gcc-fortran)

(2) 安装blas/lapack/atlas/fftw3数学库
>sudo apt-get install libblas-dev  liblapack-dev  libatlas-base-dev fftw3-dev 

(SUSE: add repository: https://download.opensuse.org/repositories/science/, 请自己搜索如何加
then "> sypper in blas lapack fftw3")

(3) 安装libint数学库
libint数学库是用来计算双电子积分的,如基于Gaussian型基组的确切交换积分计算。它是cp2k的QS模块支持杂化泛函的关键。

请到佛吉尼亚理工Valeer教授的主页去下载它:https://www.files.chem.vt.edu/chem-dept/valeev/software/libint/download.html
or
> wget https://www.files.chem.vt.edu/chem-dept/valeev/software/libint/src/libint-1.1.4.tar.gz

解压后,进入源码文件夹
> ./configure
> make
> make install 
他就在本地文件夹中生成一些库文件(.a),把他们复制到/usr/lib64文件夹下
> cp ./lib/*.a  /usr/lib64

如遇"cpp check failure"就安装第一步的那个 build-essential 
Hopefully一切顺利,反正我没遇到问题

(4) 安装并行支持open-mpi看我以前的博文
https://hi.baidu.com/xijunw/blog/item/f796e47a1aa047f80ad187de.html

【下载】
先安装cvs
> sudo apt-get install cvs

然后下载cp2k
> touch $HOME/.cvspass  //生成一个保存cvs用户名密码的空文件,隐藏在用户根目录下
> cvs -d:pserver:anonymous@cvs.cp2k.berlios.de:/cvsroot/cp2k login  //匿名登录
> cvs -z3 -d:pserver:anonymous@cvs.cp2k.berlios.de:/cvsroot/cp2k co cp2k // 下载

日后升级(自动更新源代码)
> cd cp2k   //到cp2k目录
> cvs update -dAP  //自动更新


【编译】
修改arch中的编译配置文件;编译


cp2k解压后,主目录cp2k下有arch, exe, makefiles, tools等文件夹。

(5)  修改arch中的编译配置文件
进入arch文件夹,ls可以看到很多平台类型文件,如:
> ls *gfortran*
Cygwin-i686-gfortran.sopt  Linux-x86-64-gfortran.popt
Linux-ia64-gfortran.popt   Linux-x86-64-gfortran.sdbg
Linux-ia64-gfortran.sopt   Linux-x86-64-gfortran.sopt

Linux-x86-64就是我们的操作系统平台(可>uname -a查看平台类型),gfortran是我们的编译器;
后缀 sopt表串行版,popt表并行版, sdbg是啥??忘了。这里我一次介绍sopt,和popt的编译。

好了最关键的步骤开始了:修改sopt文件和popt文件!

********************* Linux-x86-64-gfortran.sopt ******************************
CC       = cc
CPP      =

FC       = gfortran
LD       = gfortran

AR       = ar -r

CPPFLAGS =
DFLAGS   = -D__GFORTRAN -D__FFTSG -D__FFTW3 -D__LIBINT
FCFLAGS  = -O2 -ffast-math -funroll-loops -ftree-vectorize -march=native -ffree-form $(DFLAGS)
LDFLAGS  = $(FCFLAGS)
LIBS     = -L/usr/lib64 -llapack -lblas -latlas -lfftw3 -lderiv -lint -lr12 -lstdc++

OBJECTS_ARCHITECTURE = machine_gfortran.o
****************************** End ******************************************

注意
(a) 其中LIBS 后面标签的顺序也不能错,否则编译不通过。Mailist上有讨论, -lderiv必须在-lint的前面。
(b) DFLAGS后面-D__LIBINT是添加上的,因为我们安装了libint的优化库;
(c) 如果你使用的ubuntu版本一样,那么库文件夹路径也应该一样/usr/lib64,否则自己修改;

并行编译文件
*******************************Linux-x86-64-gfortran.popt**************************
CC       = cc
CPP      =
FC       = mpif90
LD       = mpif90
AR       = ar -r
DFLAGS   = -D__GFORTRAN -D__FFTSG -D__PARALLEL -D__BLACS -D__SCALAPACK -D__FFTW3 -D__LIBINT
CPPFLAGS =
FCFLAGS  = $(DFLAGS)  -ffree-form -O2 -ffast-math -march=opteron -cpp -g
LDFLAGS  = $(FCFLAGS)
LIBS     = -L/usr/lib64 -lscalapack-openmpi  -llapack -lblas -latlas -lfftw3 -lderiv -lint -lr12 -lstdc++

OBJECTS_ARCHITECTURE = machine_gfortran.o
******************************End**********************************************

编译
进入makefiles文件夹,键入:
> make ARCH=Linux-x86-64-gfortran VERSION=sopt

然后开始祈祷,如果一切顺利,会提示OK,然后去exe文件夹下看看多了什么,一个Linux-x86-64-gfortran文件夹,下面有个cp2k.sopt可执行文件

同理,并行编译把TYPE改成popt,Make会自动调用相应的编译配置文件:
> make ARCH=Linux-x86-64-gfortran VERSION=popt

【测试】
准备输入文件job.in, 可从test目录复制。

串行作业测试
> cp2k.sopt job.inp > job.out

并行作业测试
> mpirun -np 2 cp2k.popt > job.out 

此外,cp2k提供强大的自我测试包,包中实例同时可供学习使用;
测试过程要在自建的文件夹下进行,它会自动编译一遍,然后运行所有的测试;当版本升级后你只需运行一下测试命令,则自动完成所有的编译,测试,和结果比较,以便发现是否有错。

配置这个自动测试过程如下:
进入cp2k目录
> mkdir rt  //建立runtest目录,目录名自己定义,我是rt
> cd rt   //进去
> cp ../tools/do_regtest ./do  //把tools下的do_regtest文件拷过来,为了简单改名为do

下面是编辑do这个文件。因为do_regtest这个文件控制如何编译和测试,所以必须告诉它编译配置平台信息和目录路径信息,请编辑如下的内容
export LC_ALL=C
export FORT_C_NAME=gfortrandir_base=$HOME/cp2k/rt  //测试目录,$Home可替换成你的用户目录
cp2k_version=sopt           //VERSION
dir_triplet=Linux-x86-64-gfortran        //ARCH
cp2k_dir=../
maxtasks=2
emptycheck="NO"
leakcheck="NO"

然后,输入
> ./do
运行测试。看看你的编译是不是能正确运行所有的例子吧。

【补记】在另一台ubuntu 10.04LTS上按照上述程序安装时,安装顺利,运行测试出错:
xijun:~/cp2k/mytest/QS/> mpiexec -np 2 cp2k.popt H2O.inp > H2O.out.popt2
BLACS ERROR 'Users with C main programs must explicitly call MPI_Init'
from {-1,-1}, pnum=0, Contxt=-1, on line -1 of file 'blacs_pinfo_.c'.

--------------------------------------------------------------------------
mpiexec noticed that process rank 1 with PID 11544 on node xijun-desktop exited on signal 11 (Segmentation fault).

Google搜索“BLACS ERROR 'Users with C main programs must explicitly call MPI_Init'“,见此处讨论,说编译时要指定libblacsF77init.a,我> ls /usr/lib64/*.a,见有如下相关文件: 
/usr/lib64/libblacsCinit-openmpi.a 
/usr/lib64/libblacsF77init-openmpi.a
/usr/lib64/libblacs-openmpi.a

遂添加 -lblacs-openmpi 至arch/Linux-x86-64-gfortran.popt文件的LIBS参数中,重新编译。

作者:ChemiAndy 转载请注明出处:一花一世界@百度空间
2010.05.10 at Montreal



附: 编译中一些术语:


F77  Fortran77编译命令, e.g. ifort, mpif90

FFLAGS Fortan77编译选项

FC  Fortran90编译命令

FCFLAGS  Fortran编译选项


CC  C编译命令

CFLAGS C编译选项

CXX C++编译命令

CXXFLAGS  C++编译选项


CPPFLAGS    预处理选项

LDFLAGS    链接选项

LIBS  链接库


库文件类型:

.a 是静态链接用的

评论

热度(1)