0%

vasp多版本自动编译脚本

VASP编译前的目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
./
├── arch
│   ├── makefile.include.linux_gnu
│   ├── makefile.include.linux_intel
│   ├── makefile.include.linux_intel_serial
│   └── makefile.include.linux_pgi
├── bin
├── build
├── build.sh
├── makefile
├── makefile.include
├── O2AVX2
├── O2AVX512
├── O3AVX2
├── O3AVX512
├── patch.5.4.4.16052018
├── README
└── src
├── acfdt.F
├── aedens.F
├── asa.F
├── auger.F
├── ......
└── zgemmtest.F

其中build.sh为自动化编译脚本,O2AVX2O2AVX512O3AVX2O3AVX512为对应的不同优化参数的编译文件,内容格式与makefile.include一致。

其中O2AVX2的文件内容如下(用于编译vasp5.4.4):

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
# Precompiler options
CPP_OPTIONS= -DHOST=\"LinuxIFC\"\
-DMPI -DMPI_BLOCK=8000 \
-Duse_collective \
-DscaLAPACK \
-DCACHE_SIZE=4000 \
-Davoidalloc \
-Duse_bse_te \
-Dtbdyn \
-Duse_shmem

CPP = fpp -f_com=no -free -w0 $*$(FUFFIX) $*$(SUFFIX) $(CPP_OPTIONS)

FC = mpiifort
FCL = mpiifort -qmkl=sequential -lstdc++

FREE = -free -names lowercase

FFLAGS = -assume byterecl -w
OFLAG = -O2 -xcore-avx2
OFLAG_IN = $(OFLAG)
DEBUG = -O0

MKL_PATH = $(MKLROOT)/lib/intel64
BLAS =
LAPACK =
BLACS = -lmkl_blacs_intelmpi_lp64
SCALAPACK = $(MKL_PATH)/libmkl_scalapack_lp64.a $(BLACS)

OBJECTS = fftmpiw.o fftmpi_map.o fft3dlib.o fftw3d.o /opt/intel/oneapi/mkl/latest/interfaces/fftw3xf/libfftw3xf_intel.a

INCS =-I$(MKLROOT)/include/fftw

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


OBJECTS_O1 += fftw3d.o fftmpi.o fftmpiw.o
OBJECTS_O2 += fft3dlib.o

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

OBJECTS_LIB= linpack_double.o getshmem.o

# For the parser library
CXX_PARS = icpc

LIBS += parser
LLIBS += -Lparser -lparser -lstdc++

# Normally no need to change this
SRCDIR = ../../src
BINDIR = ../../bin

#================================================
# GPU Stuff

CPP_GPU = -DCUDA_GPU -DRPROMU_CPROJ_OVERLAP -DUSE_PINNED_MEMORY -DCUFFT_MIN=28 -UscaLAPACK

OBJECTS_GPU = fftmpiw.o fftmpi_map.o fft3dlib.o fftw3d_gpu.o fftmpiw_gpu.o

CC = icc
CXX = icpc
CFLAGS = -fPIC -DADD_ -Wall -openmp -DMAGMA_WITH_MKL -DMAGMA_SETAFFINITY -DGPUSHMEM=300 -DHAVE_CUBLAS

CUDA_ROOT ?= /usr/local/cuda/
NVCC := $(CUDA_ROOT)/bin/nvcc -ccbin=icc
CUDA_LIB := -L$(CUDA_ROOT)/lib64 -lnvToolsExt -lcudart -lcuda -lcufft -lcublas

GENCODE_ARCH := -gencode=arch=compute_30,code=\"sm_30,compute_30\" \
-gencode=arch=compute_35,code=\"sm_35,compute_35\" \
-gencode=arch=compute_60,code=\"sm_60,compute_60\"

MPI_INC = $(I_MPI_ROOT)/include64/

这里主要修改了OFLAG = -O2 -xcore-avx2

自动化编译脚本

编译脚本内容如下:

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
#!/bin/bash

# 启用严格错误检查(可选,根据需求注释)
set -euo pipefail

# 加载编译器环境
#source /opt/intel/oneapi/setvars.sh

# 定义编译目标和版本号
VASP_TARGETS=("vasp_gam" "vasp_ncl" "vasp_std")
VERSION_SUFFIX="544"

# 创建日志目录
mkdir -p build_logs

# 遍历所有以O开头的配置文件
for config in O*; do
# 跳过非文件和非常规文件(如目录)
if [[ ! -f "$config" ]]; then
echo "跳过非文件项: $config"
continue
fi

echo "================================================================="
echo "正在处理配置: $config"
echo "================================================================="

# 清理项目
if ! make veryclean > /dev/null 2>&1; then
echo "警告:清理阶段可能有错误,继续执行..."
fi

# 应用配置文件
cp -v "$config" makefile.include || { echo "错误:复制配置文件失败"; exit 1; }

# 并行编译并记录日志
timestamp=$(date +%Y%m%d_%H%M%S)
log_file="build_logs/build_${config}_${timestamp}.log"
if ! time make all > "$log_file" 2>&1; then
echo "错误:编译失败,详见日志 $log_file"
continue # 跳过后续步骤进入下一个配置
fi

# 重命名生成的可执行文件
for target in "${VASP_TARGETS[@]}"; do
if [[ -f "bin/$target" ]]; then
new_name="bin/${target}-${VERSION_SUFFIX}-${config}"
mv -v "bin/$target" "$new_name"
else
echo "警告:可执行文件 bin/$target 未找到"
fi
done

echo "配置 $config 处理完成"
echo "-----------------------------------------------------------------"
done

echo "所有配置处理完毕"

使用时可以先加载并行环境source /opt/intel/oneapi/setvars.sh,然后在运行脚本 ./build.sh即可。

编译后效果

编译完成后,所有不同优化参数编译的vasp已经被自动命名,并保存到当前目录的bin目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bin/
├── vasp_gam-544-O2AVX2
├── vasp_gam-544-O2AVX512
├── vasp_gam-544-O3AVX2
├── vasp_gam-544-O3AVX512
├── vasp_ncl-544-O2AVX2
├── vasp_ncl-544-O2AVX512
├── vasp_ncl-544-O3AVX2
├── vasp_ncl-544-O3AVX512
├── vasp_std-544-O2AVX2
├── vasp_std-544-O2AVX512
├── vasp_std-544-O3AVX2
└── vasp_std-544-O3AVX512

0 directories, 12 files

所有编译时的日志在build_logs目录下:

1
2
3
4
5
6
7
8
9
build_logs/
├── build_O2AVX2_20250327_153710.log
├── build_O2AVX2_20250327_153916.log
├── build_O2AVX512_20250327_153717.log
├── build_O2AVX512_20250327_160944.log
├── build_O3AVX2_20250327_153726.log
├── build_O3AVX2_20250327_163749.log
├── build_O3AVX512_20250327_153735.log
└── build_O3AVX512_20250327_171925.log