安装环境简介:
CPU:AMD
OS:CentOS 7
MPI:OpenMPI 4.0.4
GCC:10.2.0
真正从零开始安装(新机器,只安装了 OpenMPI 和 Gcc),理论上此方法适用于所有机器。OpenMPI 和 Gcc 这两个的安装并没有什么难度,唯一需要注意的就是在安装 OpenMPI 时需要开启一个选项,用于支持旧版本的语法,否则可能会出现一些语法错误,到时候只能通过修改源代码才能安装成功,非常麻烦。
下载 CP2K 7.1.0 源代码,并查看需要的依赖库
源代码在github 上,这里需要注意的点是你需要用 git 命令下载源代码
$ git clone --recursive -b support/v7.1 https://github.com/cp2k/cp2k.git cp2k
如果你是在 github 页面右侧的 Releases 里面直接下载 .gz 压缩包,再开始编译的时候会提示你缺少一些文件。而根据提示,你需要使用 git 命令下载,这就导致了如果你原来不是使用 git 命令下载的话,压缩包解压之后的文件夹并不是一个 git 仓库,所以无法下载。
解决办法:从 git 仓库中把 .github 文件夹下下来放在你解压后的文件夹内(没有实验过,理论可行)
然后执行
$ git submodule update --init --recursive
这样会自动下载子模块
在 cp2k/arch 文件夹中看看有没有你需要的配置文件,例如我需要的配置文件是 Linux-x86-64-gfortran.psmp。
打开后可以在最上方看到这次安装所需要的其他包的信息,例如:
- GFortran 7.4.0
- MPICH 3.3
- LAPACK 3.8.0
- ScaLAPACK 2.0.2、
- FFTW 3.3
- Libint 2.6.0
- Libxc 4.3.4
- libxsmm 1.14
- ELPA 2019.05.001
- PLUMED 2.5.2
- SPGLIB 1.12.2
接下来我们所需要做的就是把上面的所有包依次下,并安装(超级无敌巨多坑!!!),跟着文章一步一步来,可以避免 99% 的坑。
下面所有的下载和解压过程我都会忽略(特殊情况文中会说明),所有的压缩包解压后我都统一放在同一个目录,安装步骤略多且繁琐,需要一定的耐心和细心。
安装 lapack-3.8.0
$ cd lapack-3.8.0/
$ cp make.inc.example make.inc
$ vim make.inc
# 修改下面几处
CC = mpicc
CFLAGS = -O3 -fPIC
FORTRAN = mpifort
OPTS = -O2 -frecursive -fallow-argument-mismatch -fPIC
NOOPT = -O0 -frecursive -fallow-argument-mismatch -fPIC
LOADER = mpifort
LOADOPTS = -fallow-argument-mismatch -fPIC
# 最下方还有一处需要更改
BLASLIB = ../../libblas.a
这里需要注意的是所有编译选项后面需要添加 -fPIC ,否则后面也是会提醒你重新编译,以及最后一处需要修改的地方,这里原来是 librefblas.a。后面其他软件编译需要 lapack库时使用的大多使用的是 -lblas ,不修改就会出现 usr/bin/ld: cannot find -lblas 错误。
$ make -j 32
编译完成后可以看到 libblas.a,liblapack.a,libtmglib.a 三个库文件。
安装 scalapack-2.0.2
好像不编译该库也不会导致编译 CP2K 时出现什么错误,不过以防万一还是安装一下。
$ vim SLmake.inc
# 修改下面几处
FC = mpif90
CC = mpicc
# 最下方还有一处需要更改
LIBS = -L../lapack-3.8.0/ $(LAPACKLIB) $(BLASLIB)
这里最后一处修改就是添加上刚才安装的 lapack-3.8.0 的路径.
$ make -j 32
编译完成后可以看到 libscalapack.a
安装 fftw-3.3.8
$ cd fftw-3.3.8
$ ./configure --prefix=./install --enable-threads --enable-avx512 --enable-avx2 --enable-avx --enable-sse2
$ make -j 32
$ make install
这里需要注意的是在 ./configure 时,一定要加上 –enable-threads 选项,否则后续会缺少 libfftw3_threads.la 库。
安装 libxc-4.3.4
这里我提供了一份 shell 脚本,直接执行即可
#!/bin/bash
###############################################################################
# Copyright (c) Intel Corporation - All rights reserved. #
# This file is part of the XCONFIGURE project. #
# #
# For information on the license, see the LICENSE file. #
# Further information: https://github.com/hfp/xconfigure/ #
# SPDX-License-Identifier: BSD-3-Clause #
###############################################################################
# Hans Pabst (Intel Corp.)
###############################################################################
if [ "" = "$1" ]; then PRFX=gnu-; else PRFX=$1-; shift; fi
HERE=$(cd $(dirname $0); pwd -P)
DEST=${HERE}/../libxc/${PRFX}skx
if [ ! -e ${HERE}/configure.ac ] || [ "${HERE}" != "$(pwd -P)" ]; then
echo "Error: XCONFIGURE scripts must be located and executed in the application folder!"
exit 1
fi
if [ "${HERE}" = "${DEST}" ]; then
echo "Warning: LIBXC source directory equals installation folder!"
read -p "Are you sure? Y/N" -n 1 -r
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
fi
CONFOPTS=""
TARGET="-mavx512f -mavx512cd -mavx512dq -mavx512bw -mavx512vl -mfma -L../lapack-3.8.0 -L../scalapack-2.0.2"
export FLAGS="-O3 ${TARGET}"
export LDFLAGS="-llapack -blas"
export CFLAGS="${FLAGS}"
export CXXFLAGS="${FLAGS}"
export FCFLAGS="${FLAGS}"
export LIBS=""
export AR="gcc-ar"
export FC="mpifort"
export CC="mpicc"
export CXX="mpicxx"
libtoolize
aclocal
autoheader
automake -a
autoconf
./configure \
--prefix=./install \
CC=mpicc CXX=mpicxx FC=mpifort \
$*
这里需要注意的地方1. 修改编译器为 mpi 编译器,2. 需要加上之前安装的 lapack 和 scalapack。
这份脚本的源代码是在 https://github.com/hfp/xconfigure/raw/master/config 上,但是原脚本在编译 4.3.4 版本时会报错。
复制到 libxc-4.3.4 文件夹中并保存为 make.sh
$ chmod +x make.sh
$ ./make.sh
$ make -j 32
$ make install
安装 spglib-1.12.2
这里没有什么需要注意的。
$ cd spglib-1.12.2
$ mkdir _build
$ cd _build
$ cmake -DCMAKE_INSTALL_PREFIX="../install" ..
$ make -j 32
$ make install
安装 elpa-2019.05.001
这里也提供一份可以使用的脚本,用法参考 安装 libxc-4.3.4。
export LDFLAGS="-fPIC -L../lapack-3.8.0 -L../scalapack-2.0.2"
export CFLAGS="-march=knl -fPIC -L../lapack-3.8.0 -L../scalapack-2.0.2"
export CXXFLAGS="-march=knl -fPIC -L../lapack-3.8.0 -L../scalapack-2.0.2"
export FCFLAGS="-march=knl -fPIC -fallow-argument-mismatch -L../lapack-3.8.0 -L../scalapack-2.0.2 -L/path/to/zlib/lib"
export LIBS="-llapack -lblas"
export AR="gcc-ar"
export FC="mpifort"
export CC="mpicc"
export CXX="mpicxx"
./configure
--enable-openmp \
--enable-shared=no \
--disable-sse --disable-sse-assembly \
--disable-avx --disable-avx2 \
--prefix=./install
这里需要修改的有 编译器,安装路径,以及 LDFLAGS等编译选项,其中要注意的是由于这次安装的机器是 AMD 的 cpu ,需要 -march=knl 选项,否则会报错 : avx512 。。。。(具体错误不记得了)。
执行完该脚本后执行 make -j 32,make install 即可
安装 gsl-2.6
这里没有什么需要注意的。
$ cd spglib-1.12.2
$ ./configure --prefix=./install CC=mpicc CXX=mpicxx FC=mpifort
$ make -j 32
$ make install
安装 plumed2-2.5.5
这里只需要注意加上 lapack 、fftw 和 gsl 的路径即可。
$ cd spglib-1.12.2
$ ./configure --prefix=./install CXX=mpicxx CC=mpicc LDFLAGS="-L../lapack-3.8.0 -L../fftw-3.3.8/install/lib -L../gsl-2.6/install/lib" LIBS="-llapack -lblas -lfftw3" --enable-gsl
$ make -j 32
$ make install
安装 libxsmm-1.16
$ cd libxsmm-1.16
$ make INTRINSICS=1 SSE=2 AVX=2 ROW_MAJOR=0 INDICES_M="$(echo $(seq 1 24))" INDICES_N="$(echo $(seq 1 24))" INDICES_K="$(echo $(seq 1 24))"
这里特别需要注意的是INTRINSICS=1这个选项,因为这里使用的是高版本的 gcc ,具体说明在 libxsmm 官网上有说明。
如果你使用的是低版本的 gcc ,添加该选项可能会报错,删除该选项即可。
安装 boost-1_74_0
如果你的系统中有 boost ,且版本 >= 1.30 则不需要安装 boost。
boost 的安装过程与其他软件不太一样,但是没有什么特别需要注意的地方。
$ cd boost_1_74_0/
$ ./bootstrap.sh --with-libraries=all --with-toolset=gcc
# 这时候会出现一个新的文件 b2
$ ./b2 install --prefix=./install
安装 gmp-6.2.0
这里可能会有同学有疑问:为什么要安装 gmp ?我们在安装 gcc 时不是已经安装过了吗?
原因:系统中 gcc 是管理员编译好的,gmp 也已经安装好,但是在安装过程中并不支持 c++ 语法,导致我们在使用 mpicxx 编译程序时会报错。如果你的系统中 gmp/lib 中已经包含了 libgmpxx.so ,那么在这里就不需要再重新安装 gmp。
安装 gmp 的过程并不复杂。
$ cd gmp-6.2.0
$ ./configure --prefix=./install --enable-cxx
$ make -j 32
$ make install
一定一定要加上 –enable-cxx 选项否则还是会出现上述的错误。
安装 libint-v2.6.0
这里是我踩坑最多的地方,请务必按照下面的步骤安装。
-
下载
没想到在下载就开始翻车了,libint 在 github 上的官方版本并不适用于 cp2k-7.1.0 的安装,我们必须使用 cp2k 提供的特定的安装包来编译 https://github.com/cp2k/libint-cp2k/releases/tag/v2.6.0 。而据网友描述,官方提供的版本也会出现编译失败的情况,可能是我运气好,一次就编译通过了。
我下载的版本是 libint-v2.6.0-cp2k-lmax-6.tgz ,官方提供的一共有四个版本,我随便选了一个就成功了,太感动了。
在这里也不要下错成最下面的 Source Code,那里面只是 3 个无关的文件(我已经不想吐槽了)
-
编译
走到这里就可以恭喜你了,后面基本上没有什么其他的问题,让我们继续吧!
$ cd libint-v2.6.0-cp2k-lmax-6
$ ./configure --prefix=./install --enable-fortran CC=mpicc CXX=mpicxx CXXFLAGS="-O3 -I../gmp-6.2.0/install/include -L../gmp-6.2.0/install/lib -L/apps/software/zlib/1.2.11/gcc/10.2.0/lib" CFLAGS="-O3 -I../gmp-6.2.0/install/include -L../gmp-6.2.0/install/lib -L/apps/software/zlib/1.2.11/gcc/10.2.0/lib" --with-boost=../boost_1_74_0/install FC=mpifort FCFLAGS="-O3 -I../gmp-6.2.0/install/include -L../gmp-6.2.0/install/lib -L/apps/software/zlib/1.2.11/gcc/10.2.0/lib"
$ make -j 32
$ make install
这里使用的 zlib 是系统里自带的,如果你的系统中没有 zlib ,自行安装一个即可,十分简单。
安装 CP2K
终于终于,我们的主角登场了,安装过程其实很快也很简单,只是这里繁琐的步骤实在是让人望而却步。
首先我们修改所需要的配置文件 ,我这里使用的是 arch/Linux-x86-64-gfortran.psmp
CC = mpicc
FC = mpif90
LD = mpif90
AR = ar -r
include /path/to/plumed2-2.5.5/install/lib/plumed/src/lib/Plumed.inc.static
ELPA_VER = 2019.05.001
ELPA_INC = /path/to/elpa-2019.05.001/install/include/elpa_openmp-$(ELPA_VER)
ELPA_LIB = /path/to/elpa-2019.05.001/install/lib
FFTW_INC = /path/to/fftw-3.3.8/install/include
FFTW_LIB = /path/to/fftw-3.3.8/install/lib
LIBINT_INC = /path/to/libint-v2.6.0-cp2k-lmax-6/install/include
LIBINT_LIB = /path/to/libint-v2.6.0-cp2k-lmax-6/install/lib
LIBXC_INC = /path/to/libxc-4.3.4/install/include
LIBXC_LIB = /path/to/libxc-4.3.4/install/lib
LIBXSMM_INC = /path/to/libxsmm-1.16/include
LIBXSMM_LIB = /path/to/libxsmm-1.16/lib
SPGLIB_INC = /path/to/spglib-1.12.2/install/include
SPGLIB_LIB = /path/to/spglib-1.12.2/install/lib
# 下面这些是原来没有的,请自行添加
LAPACK_LIB = /path/to/lapack-3.8.0
SCALA_LIB = /path/to/scalapack-2.0.2
GSLBLAS_LIB = /path/to/gsl-2.6/install/lib
GSLBLAS_INC = /path/to/gsl-2.6/install/include
ZLIB_LIB = /path/to/zlib-1.2.11/lib
PLUMED_LIB = /path/to/plumed2-2.5.5/install/lib
PLUMED_INC = /path/to/plumed2-2.5.5/install/include
CFLAGS = -O2 -g -mtune=native
DFLAGS = -D__ELPA -D__FFTW3 -D__LIBINT -D__LIBXC -D__LIBXSMM
DFLAGS += -D__MPI_VERSION=3 -D__PLUMED2 -D__SPGLIB
DFLAGS += -D__parallel -D__SCALAPACK
FCFLAGS = $(CFLAGS) $(DFLAGS)
FCFLAGS += -ffree-form -ffree-line-length-none
FCFLAGS += -fopenmp -fallow-argument-mismatch
FCFLAGS += -ftree-vectorize -funroll-loops -std=f2008
FCFLAGS += -I$(ELPA_INC)/elpa -I$(ELPA_INC)/modules
FCFLAGS += -I$(FFTW_INC) -I$(LIBINT_INC) -I$(LIBXC_INC) -I$(LIBXSMM_INC) -I$(GSLBLAS_INC) -I$(PLUMED_INC) -I$(SPGLIB_INC)
LDFLAGS = $(FCFLAGS) -static-libgfortran
LIBS = -L$(PLUMED_LIB) -L$(GSLBLAS_LIB) -L$(ZLIB_LIB) -lgsl -lgslcblas -lz -L$(LIBXSMM_LIB) -L$(FFTW_LIB)
LIBS += $(ELPA_LIB)/libelpa_openmp.a
LIBS += $(LIBXC_LIB)/libxcf03.a
LIBS += $(LIBXC_LIB)/libxc.a
LIBS += $(LIBINT_LIB)/libint2.a
LIBS += $(SPGLIB_LIB)/libsymspg.a
LIBS += $(LIBXSMM_LIB)/libxsmmf.a
LIBS += $(LIBXSMM_LIB)/libxsmm.a
LIBS += $(FFTW_LIB)/libfftw3.a
LIBS += $(FFTW_LIB)/libfftw3_threads.a
LIBS += $(SCALA_LIB)/libscalapack.a
LIBS += $(LAPACK_LIB)/liblapack.a
LIBS += $(LAPACK_LIB)/libblas.a
LIBS += -ldl -lpthread -lstdc++
上面的配置文件只需要把 /path/to 改为你自己的地址即可
$ make ARCH=Linux-x86-64-gfortran VERSION=psmp -j 32
可能会提示你执行一条 git 命令,直接执行下载即可。如果机器不能联网,在有网的环境中执行完成后重新上传即可。
接下来你只需要静静地等待安装完成即可。
安装完成后,在 exe/Linux-x86-64-gfortran 文件夹下可以看到可执行文件 cp2k.psmp
至此,安装全部结束
使用
上述所有安装的 依赖库/lib 文件夹需要添加到 LD_LIBRARY_PATH,依赖库/bin 添加到 PATH
泪目,撒花 QAQ
下面是技术总结
以下错误出现的位置我现在记不清楚,不过解决办法依然可以使用。
-
missing ‘(’ before “__has_include” operand
找到出现该错误的文件,调整其中的 if 语句,主要是把其中含有 __has_include 的语句注释,但是还需要保持判断结果准确。 -
can not find libint_f.mod
这个错误的原因就是你使用的是官方提供的 libint ,解决办法是参考文章中 安装 libint 一节重新安装。 -
对 ‘dfftw_plan_with_nthreads_’ 未定义的引用
该错误的原因是在安装 fftw 时没有添加 –enable-threads ,解决办法是重新安装 fftw -
编译完成后运行时出错:Error in `cp2k-7.1/exe/Linux-x86-64-gfortran/cp2k.psmp’: munmap_chunk(): invalid pointer: 0x000000000e9d1800
这个错误是在编译 elpa 库是没有添加 –enable-openmp 选项,前几天(2020.09.27)我被这个错误搞得晕头转向,不知道是哪里的原因。我在编译 elpa 库时没有添加该选项,然后又将 arch/Linux-x86-64-gfortran.psmp 配置文件中的 libelpa_openmp.a 修改为 libelpa.a ,编译倒是通过了,就是运行不起来。查找了两天才找到这个错误原因,太蛋疼了
转载请注明出处,谢谢。