cndaqiang Web Linux DFT

编译程序回顾:以VASP-5.4.1,OCTOPUS-7.1为例

2018-12-15
cndaqiang
DFT
RSS

回顾以前的编译坑

[不保证正确]一些经验之谈

  • 在不出现冲突的情况下:并行编译器的使用并不依赖于之前编译并行编译器的串行编译器
    即:使用gcc-4.8.5编译的MVAPICH可以调用gcc-7.5进行并行代码编译
    mpif90实际上是一个脚本,里面定义了如何调用各种环境
  • 编译的过程如果出现冲突,就不可以了,不冲突的还可以执行
    #mvapich依赖的libgfortran.so.3(gcc-4.8.5)与libgfortran.so.5(gcc-8)可不行
    /usr/bin/ld: warning: libgfortran.so.3, needed by /public/software/mpi/mvapich2/gnu/2.3.1/lib/libmpifort.so, may conflict with libgfortran.so.5
    #mvapich依赖的libgfortran.so.3(gcc-4.8.5)与libgfortran.so.4(gcc-7)可不行
    /usr/bin/ld: warning: libgfortran.so.3, needed by /public/software/mpi/mvapich2/gnu/2.3.1/lib/libmpifort.so, may conflict with libgfortran.so.4
    ## 下面这些关系可能有助于判断
    #### gcc 4.8.4/4.8.5提供(sslab)
    libgfortran.so.3 ...
    #### gcc-5.5.0(huairou)
    libgfortran.so.3 ...
    #### gcc7.5会编译(cnq)
    libgfortran.so.4  libgfortran.so.4.0.0 libgfortran.a libgfortran.la ...
    #### gcc 8/8.3 提供(sslab/huairou)
    libgfortran.so.5
    #### gcc 10.2.0(huairou)
    libgfortran.so.5
    
  • 但是使用gfortran&openmpi编译的用impi调用或者用openmpi调用ifort&impi编译的程序,会变成多个串行
  • 程序执行时需要的动态库会从LD_LIBRARY_PAT、系统缓存(ldconfig -p 可查)检索
    编译器删除后,只要动态库备份了,就可以正常运行,使用ldd查看程序运行需要的库
    (python37) [SSLAB cndaqiang@login2 lib]$ls ~/libtest/
    libblas.so  libgfortran.so.4  liblapack.so
    export LD_LIBRARY_PATH=$HOME/libtest:$LD_LIBRARY_PATH
    (python37) [SSLAB cndaqiang@login3 MoS2_1.6eV_6.6-gccQ-mpiQ.sh_deletGCC_addLDD]$ldd /public/home/cndaqiang/soft/gcc-7.5.0-mvapich/q-e-qe-6.6/TDAPW-6.6/bin/tdpw.x | grep found
      liblapack.so => not found
      libblas.so => not found
      libgfortran.so.4 => not found
      libgfortran.so.4 => not found
      libgfortran.so.4 => not found
    (python37) [SSLAB cndaqiang@login3 MoS2_1.6eV_6.6-gccQ-mpiQ.sh_deletGCC_addLDD]$export LD_LIBRARY_PATH=$HOME/libtest:$LD_LIBRARY_PATH
    (python37) [SSLAB cndaqiang@login3 MoS2_1.6eV_6.6-gccQ-mpiQ.sh_deletGCC_addLDD]$ldd /public/home/cndaqiang/soft/gcc-7.5.0-mvapich/q-e-qe-6.6/TDAPW-6.6/bin/tdpw.x | grep found
    
  • 在A服务器上使用自己编译的gcc7和mvapich编译的程序,再将依赖的动态库(B服务器上有相同的库,比如mvapich的库就不发送了)和编译后的程序直接发送到B服务器,使用B服务器的mvapich提供的mpirun是可以直接运行程序的
  • 静态库因为还要连接不能混用,已经把静态库编入可执行程序后,可执行程序是可以拷贝到别的服务器上运行的
  • ldd可以查看可执行程序和动态库的依赖

编译器

intel系 CC=icc FC=ifort CXX=icpc

使用

source /opt/intel/compilers_and_libraries_2018.0.128/linux/bin/compilervars.sh intel64
source /opt/intel/compilers_and_libraries_2018.0.128/linux/bin/iccvars.sh intel64 
source /opt/intel/compilers_and_libraries_2018.0.128/linux/bin/ifortvars.sh intel64

GCC系 CC=gcc FC=gfortran CXX=g++

使用

export PATH=$GCCDIR/bin:$PATH
export LD_LIBRARY_PATH=$GCCDIR/lib64:$LD_LIBRARY_PATH

并行编程接口

MPI 超算常用

wiki-MPI消息传递界面/接口(英语:Message Passing Interface,缩写MPI)是一个并行计算的应用程序接口(API),常在超级计算机、计算机簇等非共享内存环境程序设计
运行方式

mpirun -np 核数 $EXEC

每种MPI程序(如OPENMPI,MPICH2)使用的串行(ifort或gcc)编译器编译,形成不同的并行编译器(openmpi+ifort或openmpi+gcc)

OPENMPI

Open MPI:Open Source High Performance Computing
使用编译器编译OPENMPI参考gcc Openmpi 编译siesta,只需把FC CC CXX指定即可
如使用intel系FC=ifort CC=icc CXX=icpc,测试使用intel18的编译器编译openmpi-2.1.5与openmpi-4.0.0通过,其他版本可能存在兼容性问题
个人编译,环境变量

export PATH=$MPIDIR/bin:$PATH
export LD_LIBRARY_PATH=$MPIDIR/lib:$LD_LIBRARY_PATH

超算上一般都编译好了不同的MPI程序和编译器的组合,如在天河上导入不同编译器与OPENMPI的组合示例

[AAA@lon6%tianhe2-B ~]$  module load openmpi/1.10-intel
[AAA@lon6%tianhe2-B ~]$ mpicc --version
icc (ICC) 14.0.2 20140120
Copyright (C) 1985-2014 Intel Corporation.  All rights reserved.


[AAA@lon12%tianhe2-B ~]$ module load openmpi/1.8.3
[AAA@lon12%tianhe2-B ~]$ mpicc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

IMPI(Intel MPI)

Intel MPI-Intel基于开放源代码的MPICH2与MVAPICH2研发成的MPI
安装parallel_studio_xe_2018可以安装,一般目录在/opt/intel/impi/,包含IMPI+intel系与IMPI+gcc系
环境变量

source /opt/intel/impi/5.0.2.044/bin64/mpivars.sh
source  /opt/intel/impi/2018.0.128/bin64/mpivars.sh

#intel系 mpiicc mpiifort mpiicpc
#gcc系 mpicc mpif90 mpicxx

天河调用IMPI,包含IMPI+intel系与IMPI+gcc系,命令同上

[AAA@lon6%tianhe2-B ~]$ module load MPI/Intel/IMPI/4.1.3.048
[AAA@lon6%tianhe2-B ~]$ mpiifort --version
ifort (IFORT) 14.0.2 20140120
Copyright (C) 1985-2014 Intel Corporation.  All rights reserved.

MPICH等,我没用过,略

Pthreads 略

OPENMP

注意OPENMP不是OPENMPI,OPENMPI是基于MPI的一种
依据wiki-OpenMP的说法,OpenMP的另一个缺点是不能在非共享内存系统(如计算机集群)上使用。在这样的系统上,MPI使用较多。
然后天河上好像也没有OPENMP的module,先略了

库与编译该库的编译器一定要对应
有些程序使用两种库都可以安装,但测试的时候一种经常报错,如octopus-7.1与mkl,在make check时各种FAIL,而octopus与从netlib下载编译的库就没有

MKL

⭐自助调用⭐
安装parallel_studio_xe_2018可以安装,一般目录在/opt/intel/compilers_and_libraries_2018.3.222/linux/mkl/lib/intel64 环境变量设置

source  /opt/intel/compilers_and_libraries_2018.3.222/linux/mkl/bin/mklvars.sh intel64

天河上也有相应模块intel-compilers/mkl-15
MKL主要包含如下内容:

  • 基本线性代数子系统库(BLAS)
  • 离散基本线性代数库(Sparse BLAS)
  • 线性代数库(LAPACK)
  • 可扩展性线性代数库(ScaLAPACK)
  • 离散求解程序(Sparse Solver routines)
  • 向量数学库函数(Vector Mathematical Library functions)
  • 向量统计库函数(Vector Statistical Library functions)
  • 傅立叶变换程序(Fourier Transform functions (FFT))
  • 集群版傅立叶变换程序(Cluster FFT)
  • 区间求解程序(Interval Solver routines)
  • 三角变换程序(Trigonometric Transform routines)
  • 泊松、拉普拉斯和哈密顿求解程序(Poisson, Laplace, and Helmholtz Solver routines)
  • 优化(信赖域)求解程序(Optimization (Trust-Region) Solver routines)

注意调用的时候

  • 有的库适合intel系编译器,有的适合gcc系,如libmkl_gf_lp64.alibmkl_intel_lp64.a
  • 有的库适合IMPI有的适合OPENMPI,如libmkl_blacs_openmpi_ilp64.alibmkl_blacs_intelmpi_ilp64.a
  • ilp与lp的区别:ilp支持的数据更大,编vasp的时候lp就可以了,ilp未尝试,详细区别
  • 最懒的调用方式⭐自助调用⭐

NETLIB安装

包含blas,blacs,lapack,scalapack等
安装示例gcc Openmpi 编译siesta
环境变量

MATHDIR=/home/cndaqiang/soft/scalapack/lib
export LD_LIBRARY_PATH=$MATHDIR:$LD_LIBRARY_PATH

调用方式

MATHLIB = -L$MATHDIR  -lrefblas -ltmg -lreflapack  -lscalapack

FFTW

编译参考 centos6.5 gcc Openmpi 编译octopus-4.1.2
建议使用intel系编译器调用使用intel编译器编译的fftw,gcc系同理
调用

LIBS_FFTW = -L/home/cndaqiang/soft/OPENMPI-GCC/LIB/fftw-3.3.4/lib -lfftw3_mpi -lfftw3

注意,libfftw3_mpi.a仅包含并行部分的fftw代码,还要引用libfftw3.a,此处致谢Ionizing Radiation
在使用gcc系+netlib系数学库+fftw编译vasp.5.4.1时,要这样设置
在使用intel系或者gcc系+mkl数学库+fftw编译vasp.5.4.1时,貌似因为mkl里面包含了部分fftw的代码,仅调用-lfftw3_mpi即可

GSL libXC等

参考 centos6.5 gcc Openmpi 编译octopus-4.1.2

Example0-Intel+IMPI+mkl+vasp.5.4.1

Intel Parallel Studio XE 编译VASP

Example1-GCC-4.8.4+openmpi-1.10.3+mkl-intel18+vasp.5.4.1

源码修改

使用gcc系编译vasp.5.4.1,要修改部分vasp源码,方法参考Compiling VASP With Gfortran,再次致谢Ionizing Radiation
修改us.F,按照下面,把-开的那行头变成+后面的内容

@@ -1460,7 +1460,7 @@ END MODULE
	   USE asa
	   USE paw
	   USE constant
-      USE us
+      USE us, only : setdij_
	   IMPLICIT NONE
 
	   TYPE (type_info)   T_INFO
@@ -2693,7 +2693,7 @@ END MODULE
	   USE mgrid
	   USE lattice
	   USE wave
-      USE us
+      USE us, only: augmentation_charge

cp arch/makefile.include.linux_gfortran makefile.include

修改makefiel.include

MKLROOT    = /opt/intel/compilers_and_libraries/linux/mkl
FC         = mpif90  -m64 -I${MKLROOT}/include
FCL        = mpif90  -m64 -I${MKLROOT}/include

BLAS       =  ${MKLROOT}/lib/intel64/libmkl_scalapack_lp64.a -Wl,--start-group ${MKLROOT}/lib/intel64/libmkl_cdft_core.a ${MKLROOT}/lib/intel64/libmkl_gf_lp64.a ${MKLROOT}/lib/intel64/libmkl_sequential.a ${MKLROOT}/lib/intel64/libmkl_core.a ${MKLROOT}/lib/intel64/libmkl_blacs_openmpi_lp64.a -Wl,--end-group -lpthread -lm -ldl

OBJECTS    = fftmpiw.o fftmpi_map.o  fftw3d.o  fft3dlib.o \
             /home/cndaqiang/soft/OPENMPI-GCC/LIB/fftw-3.3.4/lib/libfftw3_mpi.a
INCS       =-I/home/cndaqiang/soft/OPENMPI-GCC/LIB/fftw-3.3.4/include

Example2-GCC-4.8.4+openmpi-1.10.3+netlib数学库+vasp.5.4.1

源码修改

同上

cp arch/makefile.include.linux_gfortran makefile.include

修改makefiel.include,注意fftw的阴影和上面的不一样

FC         = mpif90
FCL        = mpif90

LIBDIR     = /home/cndaqiang/soft/scalapack/lib
BLAS       = -L$(LIBDIR) -lrefblas
LAPACK     = -L$(LIBDIR) -ltmg -lreflapack -llapack
BLACS      =
SCALAPACK  = -L$(LIBDIR) -lscalapack $(BLACS)

OBJECTS    = fftmpiw.o fftmpi_map.o  fftw3d.o  fft3dlib.o \
             /home/cndaqiang/soft/OPENMPI-GCC/LIB/fftw-3.3.4/lib/libfftw3_mpi.a \
             /home/cndaqiang/soft/OPENMPI-GCC/LIB/fftw-3.3.4/lib/libfftw3.a
INCS       =-I/home/cndaqiang/soft/OPENMPI-GCC/LIB/fftw-3.3.4/include

Example3-GCC-4.8.4+openmpi-1.10.3+mkl+octopus

环境变量

GCCDIR=/home/cndaqiang/soft/gcc-4.8.4

MPIDIR=/home/cndaqiang/soft/openmpi-1.10.3_gcc-4.8.4

FFTWDIR=/home/cndaqiang/soft/OPENMPI-GCC/LIB/fftw-3.3.4

GSDIR=/home/cndaqiang/soft/gsl-1.14

LIBXCDIR=/home/cndaqiang/soft/libxc-2.0.3

MKLROOT=/opt/intel/compilers_and_libraries_2018.3.222/linux/mkl
source $MKLROOT/bin/mklvars.sh intel64

export PATH=$GCCDIR/bin:$PATH
export LD_LIBRARY_PATH=$GCCDIR/lib64:$LD_LIBRARY_PATH

export PATH=$MPIDIR/bin:$PATH
export LD_LIBRARY_PATH=$MPIDIR/lib:$LD_LIBRARY_PATH

export PATH=$FFTWDIR/bin:$PATH
export LD_LIBRARY_PATH=$FFTWDIR/lib:$LD_LIBRARY_PATH

export PATH=$GSDIR/bin:$PATH
export LD_LIBRARY_PATH=$GSDIR/lib:$LD_LIBRARY_PATH

export PATH=$LIBXCDIR/bin:$PATH
export LD_LIBRARY_PATH=$LIBXCDIR/lib:$LD_LIBRARY_PATH

配置Makefile

./configure --prefix=/home/cndaqiang/soft/octopus-7.1-build \
 ./configure --prefix=$(pwd)/../../octopus-7.2  --with-blas="-lmkl_gf_lp64 -lmkl_sequential -lmkl_core -lmkl_blas95_lp64" --with-libxc-prefix=$LIBXCDIR   --with-gsl-prefix=$GSDIR  --with-fftw-prefix=$FFTWDIR --enable-mpi CC=mpicc FC=mpif90 CXX=mpicxx FCFLAGS="-O3 -ffree-line-length-none" CFLAGS=-O3    

Example4-GCC-4.8.4+openmpi-1.10.3+netlib数学库+octopus

环境变量同上
配置Makefile

 ./configure --prefix=$(pwd)/../octopus-7,1-build-scalapack  --with-blas="-L$MATHDIR  -lrefblas -ltmg -lreflapack  -lscalapack" --with-libxc-prefix=$LIBXCDIR   --with-gsl-prefix=$GSDIR  --with-fftw-prefix=$FFTWDIR --enable-mpi CC=mpicc FC=mpif90 CXX=mpicxx FCFLAGS="-O3 -ffree-line-length-none" CFLAGS=-O3    

还需要

还需要好好去学fortran
比如fortran默认单行长度最多132个字符,但是有的程序单行代码很多,如octopus8,对于gcc可以对gfortran(mpif90)添加-ffree-line-length-none编译参数解决


本文首发于我的博客@cndaqiang.
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!


目录

访客数据