Rocky Linux9 安装VASP6.4.3(AOCC AOCL OpenMPI)

Rocky Linux9 安装VASP6.4.3(AOCC_AOCL_OpenMPI)

因为我们的机器是AMD的cpu(7R32),在用intel oneapi尝试过编译VASP之后发现运行速度很慢,根本无法发挥机器的全部性能,折腾了好久,最后迫于无奈转战用AOCC+AOCL+OpenMPI这一套来编译vasp,编译出来的速度能够达到正常的计算速度,跟网上别人的计算速度也对比了,没啥大问题,安装的过程主要参考了链接这位博主的思路

AMD9754 AOCC OpenMPI5最简编译VASP6.4.2 - 哔哩哔哩 (bilibili.com)

准备工作

下载AOCC:

https://www.amd.com/zh-cn/developer/aocc.html

下载AOCL:

https://www.amd.com/zh-cn/developer/aocl.html

下载OpenMPI:

https://www.open-mpi.org/software/ompi/v5.0/

安装AOCC

解压aocc安装包

1
tar -xvf aocc-compiler-4.2.0.tar

然后进入目录,运行安装脚本:

1
2
3
cd aocc-compiler-4.2.0/
./install.sh

然后配置环境变量,在aocc-compiler-4.2.0这个文件的上一级目录会出现setenv_AOCC.sh以及aocc-compiler-4.2.0_module文件,直接source setenv_AOCC.sh即可配置环境变量:

1
source setenv_AOCC.sh

如果要确保每次登录aocc都在环境中,以将source该文件的绝对路径写入~/.bashrc中,比如我的setenv_AOCC.sh在/software/aocc_aocl_ompi目录下,则在~/.bashrc添加:

1
source /software/aocc_aocl_ompi/setenv_AOCC.sh

安装AOCL

解压aocl:

1
tar -zxvf aocl-linux-aocc-4.2.0.tar.gz

然后进入解压的文件,执行安装程序并设置安装路径

1
2
cd aocl-linux-aocc-4.2.0/
./install.sh -t /software/aocc_aocl_ompi/aocl4.2.0/

配置环境环境变量:

1
source /software/aocc_aocl_ompi/aocl4.2.0/4.2.0/aocc/amd-libs.cfg

安装Openmpi

注意,我这里后面改成了openmpi4.1.6的版本,并不是5.0以上的版本,主要是因为我用更高的版本在编译vasp的时候出现了报错,而且我尝试了多种方法都没办法解决报错,只有回退Openmpi的版本才能解决这个问题

如果前面的aocc安装没问题并且环境变量也配置好了,这里可以用以下之类产看clang等工具的路径:

1
which clang clang++ flang

返回的值如下:

1
2
3
/software/aocc_aocl_ompi/aocc-compiler-4.2.0/bin/clang
/software/aocc_aocl_ompi/aocc-compiler-4.2.0/bin/clang++
/software/aocc_aocl_ompi/aocc-compiler-4.2.0/bin/flang

记住这些内容,然后解压openmpi的压缩包:

1
tar -zxvf openmpi*

然后进入解压的目录,执行以下代码:

1
./configure CC=/software/aocc_aocl_ompi/aocc-compiler-4.2.0/bin/clang CXX=/software/aocc_aocl_ompi/aocc-compiler-4.2.0/bin/clang++ FC=/software/aocc_aocl_ompi/aocc-compiler-4.2.0/bin/flang --prefix=/software/aocc_aocl_ompi/ompi416

其中CC参数的值就是clang的路径,CXX为clang++的路径,FC为flang的路径,—prefix后面则为希望安装的openmpi的安装路径,然后等几分钟

继续执行:

1
2
make -j 32
make install

安装好之后就是配置openmpi的环境变量,如下

1
2
3
4
MPI_HOME=/software/aocc_aocl_ompi/ompi416
export PATH=${MPI_HOME}/bin:$PATH
export LD_LIBRARY_PATH=${MPI_HOME}/lib:$LD_LIBRARY_PATH
export MANPATH=${MPI_HOME}/share/man:$MANPATH/

环境变量的配置

前面AOCC+AOCL+OpenMPI的安装我在结束的时候都给出了环境变量的配置内容,为了方便使用,可以将它们整合一下,写进一个文件中,这样只需要source一个文件即可加载这整个套件,看我上述的安装步骤也可以看出来,我是将三个软件都安装在了/software/aocc_aocl_ompi目录下,所以我就在这个目录下再创建一个文件:

1
vim env_aocc_aocl_ompi.sh

然后该文件的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
# aocc
source /software/aocc_aocl_ompi/setenv_AOCC.sh

#aocl
source /software/aocc_aocl_ompi/aocl4.2.0/4.2.0/aocc/amd-libs.cfg

#ompi
MPI_HOME=/software/aocc_aocl_ompi/ompi416
export PATH=${MPI_HOME}/bin:$PATH
export LD_LIBRARY_PATH=${MPI_HOME}/lib:$LD_LIBRARY_PATH
export MANPATH=${MPI_HOME}/share/man:$MANPATH/

这样在后续的使用之中直接source这个文件即可。

编译VASP

众所周知,vasp出了自带的编译,还有各种插件可以在编译的时候自行添加,我们要用到的主要有VTST和vaspSOL,所以我将这些内容分开来写

基础的vasp编译

首先解压vasp的压缩包,然后进到解压之后的目录中,然后先查看一下当前目录下的arch目录中是否存在aocc_aocl_ompi的编译文件,我们需要对基本的编译文件进行调整,对于vasp6.3.2版本,版本中的arch目录下并不存在aocc_aocl_ompi的编译文件(makefile.include),该文件可以自己写一个。

直接在解压之后的vasp目录中:

1
vim makefile.include

然后该文件的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# Default precompiler options
CPP_OPTIONS = -DHOST=\"LinuxGNU\" \
-DMPI -DMPI_BLOCK=8000 -Duse_collective \
-DscaLAPACK \
-DCACHE_SIZE=4000 \
-Davoidalloc \
-Dvasp6 \
-Duse_bse_te \
-Dtbdyn \
-Dfock_dblbuf

CPP = flang -E -ffree-form -C -w $*$(FUFFIX) >$*$(SUFFIX) $(CPP_OPTIONS)

FC = mpif90
FCL = mpif90

FREE = -ffree-form -ffree-line-length-none

FFLAGS = -w -fno-fortran-main -Mbackslash

OFLAG = -O3
OFLAG_IN = $(OFLAG)
DEBUG = -O0

OBJECTS = fftmpiw.o fftmpi_map.o fftw3d.o fft3dlib.o
OBJECTS_O1 += fftw3d.o fftmpi.o fftmpiw.o symlib.o
OBJECTS_O2 += fft3dlib.o

# For what used to be vasp.5.lib
CPP_LIB = $(CPP)
FC_LIB = $(FC)
CC_LIB = clang
CFLAGS_LIB = -O
FFLAGS_LIB = -O1
FREE_LIB = $(FREE)

OBJECTS_LIB = linpack_double.o

# For the parser library
CXX_PARS = clang++
LLIBS = -lstdc++

##
## Customize as of this point! Of course you may change the preceding
## part of this file as well if you like, but it should rarely be
## necessary ...
##

# When compiling on the target machine itself, change this to the
# relevant target when cross-compiling for another architecture
VASP_TARGET_CPU ?= -march=native
FFLAGS += $(VASP_TARGET_CPU)

# BLAS (mandatory)
AMDBLIS_ROOT ?= /software/aocc_aocl_ompi/aocl4.2.0/4.2.0/aocc
BLAS = -L${AMDBLIS_ROOT}/lib -lblis

# LAPACK (mandatory)
AMDLIBFLAME_ROOT ?= /software/aocc_aocl_ompi/aocl4.2.0/4.2.0/aocc
LAPACK = -L${AMDLIBFLAME_ROOT}/lib -lflame

# scaLAPACK (mandatory)
AMDSCALAPACK_ROOT ?= /software/aocc_aocl_ompi/aocl4.2.0/4.2.0/aocc
SCALAPACK = -L${AMDSCALAPACK_ROOT}/lib -lscalapack

LLIBS += $(SCALAPACK) $(LAPACK) $(BLAS)

# FFTW (mandatory)
AMDFFTW_ROOT ?= /software/aocc_aocl_ompi/aocl4.2.0/4.2.0/aocc
LLIBS += -L$(AMDFFTW_ROOT)/lib -lfftw3
INCS += -I$(AMDFFTW_ROOT)/include

# HDF5-support (optional but strongly recommended)
#CPP_OPTIONS+= -DVASP_HDF5
#HDF5_ROOT ?= /path/to/your/hdf5/installation
#LLIBS += -L$(HDF5_ROOT)/lib -lhdf5_fortran
#INCS += -I$(HDF5_ROOT)/include

# For the VASP-2-Wannier90 interface (optional)
#CPP_OPTIONS += -DVASP2WANNIER90
#WANNIER90_ROOT ?= /path/to/your/wannier90/installation
#LLIBS += -L$(WANNIER90_ROOT)/lib -lwannier

其中要修改的地方主要就是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# BLAS (mandatory)
AMDBLIS_ROOT ?= /software/aocc_aocl_ompi/aocl4.2.0/4.2.0/aocc
BLAS = -L${AMDBLIS_ROOT}/lib -lblis

# LAPACK (mandatory)
AMDLIBFLAME_ROOT ?= /software/aocc_aocl_ompi/aocl4.2.0/4.2.0/aocc
LAPACK = -L${AMDLIBFLAME_ROOT}/lib -lflame

# scaLAPACK (mandatory)
AMDSCALAPACK_ROOT ?= /software/aocc_aocl_ompi/aocl4.2.0/4.2.0/aocc
SCALAPACK = -L${AMDSCALAPACK_ROOT}/lib -lscalapack

LLIBS += $(SCALAPACK) $(LAPACK) $(BLAS)

# FFTW (mandatory)
AMDFFTW_ROOT ?= /software/aocc_aocl_ompi/aocl4.2.0/4.2.0/aocc
LLIBS += -L$(AMDFFTW_ROOT)/lib -lfftw3
INCS += -I$(AMDFFTW_ROOT)/include

将其中的aocc的目录改成自己安装aocc的目录。

此外需要注意的是以下的点:

1
OBJECTS_O1 += fftw3d.o fftmpi.o fftmpiw.o symlib.o

这其中最后的symlib.o是后加上的,如果不加这个关键词编译依然会成功,但是在计算的时候会报错,我查阅了不少的资料,可以参考以下的链接:

Compiling with AOCC/AOCL OpenMPI SGRGEN error - My Community (vasp.at)

根据这个论坛用户的提醒,添加了这个symlib.o关键词解决了问题。

在编译文件搞定之后,确保一下自己的环境变量是否正确,不放心可以再source一下前面写的那个env_aocc_aocl_ompi.sh文件:

1
source /software/aocc_aocl_ompi/env_aocc_aocl_ompi.sh

然后就可以开始编译vasp,编译的时候指令跟intel的编译有差异:

1
make DEPS=1 -j 32

注意一定要加DEPS=1,不然编译会报错。

最后在这个vasp安装结束后,执行计算结束的时候还可能会出现一个Warning,这个很影响查看计算结果,我也不清楚这个Warning为何会出现,但是可以确认它是无害的,并不会影响计算结果,因此可以在计算前添加一个全局变量来避免这个Warning的输出,而且我仔细观察了一下,我参考的B站的这个博主他编译的vasp也存在这个Warning

1
export NO_STOP_MESSAGE=1

这个问题的解决思路参考的是以下的链接:

Disable "Warning: ieee_inexact is signaling FORTRAN STO - HPC Compilers / Legacy PGI Compilers - NVIDIA Developer Forums

VTST和VaspSOL插件的编译

这两个插件的编译所需的makefile.include可以直接在上面原生vasp的基础上进一步操作

vtst

修改vasp解压目录下的src/main.F文件

1
vim ./src/main.F

对两个地方修改,在vim中用 “/需要搜索的内容” 来搜索指定的内容,然后再回车会跳转到第一个搜索到的地方并将搜索的关键词突出显示:

1
2
3
4
5
6
7
# 第一处要修改的地方
CALL CHAIN_FORCE(T_INFO%NIONS,DYN%POSION,TOTEN,TIFOR, &
LATT_CUR%A,LATT_CUR%B,IO%IU6)

# 改为以下内容,其实就是添加了一个TSIF
CALL CHAIN_FORCE(T_INFO%NIONS,DYN%POSION,TOTEN,TIFOR, &
TSIF,LATT_CUR%A,LATT_CUR%B,IO%IU6) 第一处要修改的地方
1
2
3
4
5
6
7
# 第二处要修改的地方
IF (LCHAIN) CALL chain_init( T_INFO, IO)

# 改为以下内容,其实就是把CALL前面的内容删除
CALL chain_init( T_INFO, IO)

第二处要修改的地方

然后要修改src目录下的隐藏文件.objects:

1
2
vim ./src/.objects

在chain.o的前面添加以下内容:

1
2
3
4
bfgs.o dynmat.o instanton.o lbfgs.o sd.o cg.o dimer.o bbm.o \
fire.o lanczos.o neb.o qm.o \
pyamff_fortran/*.o ml_pyamff.o \
opt.o

还需要修改src目录下的makefile文件,主要修改两个地方:

1
2
3
4
5
# 第一处要修改的地方
LIB= lib parser

# 修改为以下内容,就是在最后加一个pyamff_fortran
LIB= lib parser pyamff_fortran 第一处要修改的地方
1
2
3
4
5
6
# 第二处要修改的地方
dependencies: sources

# 修改为以下内容
dependencies: sources libs

修改完成后,还要将vtstcode解压出来的文件复制到src文件中,这里安装的是6.3.2版本,则将vtstcode-199/vtstcode6.3中的内容复制到src文件中:

1
cp -r path_to_vtstcode/vtstcode-199/vtstcode6.3/* src

注意,cp需要加-r,因为该目录下存在一个文件夹,而且复制后会覆盖原来的chain.F文件。

📧补充内容,vtstcode199存在一个特定的bug,应该是开发人员的疏忽导致一个IF没有正常的结束,会出现报错。

报错内容如下(类似):

1
2
3
4
5
6
7
8
9
10
11
12
13
chain.F(179): error #6321: An unterminated block exists.
IF (LINTERACT) THEN
^
compilation aborted for chain.f90 (code 1)
makefile:166: recipe for target 'chain.o' failed
make[2]: *** [chain.o] Error 1
make[2]: Leaving directory '/home/stephen/vasp.6.3.2/build/std'
cp: cannot stat 'vasp': No such file or directory
makefile:129: recipe for target 'all' failed
make[1]: *** [all] Error 1
make[1]: Leaving directory '/home/stephen/vasp.6.3.2/build/std'
makefile:13: recipe for target 'std' failed
make: *** [std] Error 2

参考以下的帖子:

【新提醒】VASP6.3.2 + vtstcode6.3编译出错 - 第一性原理 (First Principle) - 计算化学公社 (keinsci.com)

可以认为补齐缺失的ENDIF来解决这个报错,在202行之后添加一行ENDIF即可:

1
2
3
4
5
6
7
8
199         IF (newcar_exists) THEN
200 CALL RD_POSCAR_HEAD(LATT_CUR, T_I, NIOND, NIONPD, NTYPD, NTYPPD, IO%IU0, IO%IU6)
201 CALL RD_POSCAR(LATT_CUR, T_I, DYN, NIOND, NIONPD, NTYPD, NTYPPD, IO%IU0, IO%IU6)
202 posion = DYN%POSION
203 ENDIF !这是新加的ENDIF与IF (newcar_exists)配对
204 #if defined(MPI) || defined(MPI_CHAIN)
205 CALLMPI(MPI_Barrier(comm_chain%mpi_comm, ierr))
206 #endif

即在posion = DYN%POSION与#if defined(MPI) || defined(MPI_CHAIN)语句之间添加一个ENDIF即可。

VaspSol

首先需要修改makefile.include文件,在CPP_OPTIONS的最后添加-Dsol_compat:

1
2
3
4
CPP_OPTIONS = ... \
... \
... \
-Dsol_compat

然后需要打补丁,vasp6.3的补丁的下载在下面的链接可以找到:

Patches for VASP 6.3 · Issue #64 · henniggroup/VASPsol (github.com)

将patch文件上传到解压出来的src目录下,同时将Solvation.F也复制到该目录下覆盖原来的Solvation.F,然后执行以下指令:

1
patch -p0 < VASPsol_VASP630.patch

编译

在上述有关两个插件的内容配置完成之后就可以开始编译了,编译用到的makefile.include跟基础的vasp差不多(vaspsol添加了一行内容),然后后续的编译也是一样的:

1
make DEPS=1 -j 32

Rocky Linux9 安装VASP6.4.3(AOCC AOCL OpenMPI)
http://phoenixjason.cn/2024/10/30/20241030Rocky Linux9 安装VASP6.4.3(AOCC_AOCL_OpenMPI)/
作者
Jason
发布于
2024年10月30日
许可协议