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
为自动化编译脚本,O2AVX2
、O2AVX512
、O3AVX2
、O3AVX512
为对应的不同优化参数的编译文件,内容格式与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