|
本帖最后由 DeeliN 于 2022-6-10 17:01 编辑
本文先前已在Bilibili发表。
1. 背景介绍
VASP是最流行的密度泛函理论(DFT)计算软件之一,在凝聚态物理和计算化学领域应用广泛。
英特尔处理器在超算领域一家独大的时代已经过去,各大高校和超算中心有不少新购的计算工作站都是采用AMD的CPU来搭建的。
然而,VASP在开发阶段就主要考虑英特尔平台,官网的安装教程也重点聚焦英特尔处理器,针对AMD处理器的教程尚未更新。
此前,AMD的CPU上很难编译出可以正常运行的VASP,更别提效率问题了。
在AMD的CPU上可以使用AMD自家的编译器AOCC和数学库AOCL以提高运行效率,然而网上少有此类教程。
本文将尽量简化编译复杂度,争取花最少的时间编译出在运行Ubuntu20.04的AMD的CPU上高效的VASP程序,其他Linux操作系统以及其他AMD的CPU请类推。
如果您有兴趣,请花几分钟时间细读。
本文主要参考AMD开发者页面VASP安装教程,开始之前,要特别感谢AMD技术团队的指导以及对编译脚本的自动化,才让我们可以这么方便地完成安装。
spack常用命令简述和spack文档。
2. 几个小命令
在计算工作站上安装时,建议使用root用户,运行时则切换回普通用户。
2.1. 安装spack包管理软件
spack 类似 Environment Modules,是环境管理软件,是软件安装和管理的神器,我们要借助它完成快速安装。
先将它安装到某个路径,比如/opt/spack:
- export SPACK_ROOT=/opt/spack
- git clone -c feature.manyFiles=true https://github.com/spack/spack.git ${SPACK_ROOT}
- source ${SPACK_ROOT}/share/spack/setup-env.sh
- spack --help
复制代码 2.2. 安装AOCC编译器套装
AOCC 是 AMD 针对自家 CPU 着力优化的编译器,对标 GCC 和英特尔的 oneAPI中的编译器组合。
- # 最新版的是3.2.0,如有更新请考虑更改数字
- spack install -v aocc@3.2.0 +license-agreed
复制代码 将弹出协议文档,用 ZZ 命令关闭即可。
把 aocc@3.2.0 添加到编译器列表中:
- spack cd -i aocc@3.2.0
- spack compiler add $PWD
- # 检查 aocc@3.2.0 是否在列表中
- spack compilers
复制代码 3. 安装 VASP.6.2.0注意VASP是受版权保护的,把vasp.6.2.0.tgz安装包放到~路径下,安装程序后续将尝试寻找并读取。
请勿做任何修改,否则后续检查文件完整性将失败导致安装受阻。
先加载 aocc@3.2.0,确保后续编译均基于此编译器,而不是系统默认的其他编译器。
- spack load aocc@3.2.0
- # 16 个核并行就够了,再多有可能反而导致安装受阻
- # 我的机器是 EPYC7742,基于zen2架构,如果你的机器是zen3,则修改为zen3
- spack -d install -v -j 16 vasp@6.2.0 +scalapack +openmp %aocc@3.2.0 target=zen2 ^amdfftw@3.1 ^amdblis@3.1 threads=openmp ^amdlibflame@3.1 ^amdscalapack@3.1 ^openmpi@4.1.1 fabrics=auto
复制代码 会自动安装amdfftw@3.1, amdblis@3.1, amdlibflame@3.1 和 amdscalapack,总计将耗时一个小时左右,请耐心等待。
如果出现如下错误,不能正常安装:
- ==> [2022-04-17-15:47:30.194861] amdblis: Executing phase: 'build'
- ==> [2022-04-17-15:47:30.196223] 'make' '-j16'
- Generating monolithic blis.hPython path configuration:
- PYTHONHOME = '/usr'
- PYTHONPATH = (not set)
- program name = 'python'
- isolated = 0
- environment = 1
- user site = 1
- import site = 1
- sys._base_executable = '/usr/local/miniconda39/bin/python'
- sys.base_prefix = '/usr'
- sys.base_exec_prefix = '/usr'
- sys.platlibdir = 'lib'
- sys.executable = '/usr/local/miniconda39/bin/python'
- sys.prefix = '/usr'
- sys.exec_prefix = '/usr'
- sys.path = [
- '/usr/lib/python39.zip',
- '/usr/lib/python3.9',
- '/usr/lib/python3.9/lib-dynload',
- ]
- Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
- Python runtime state: core initialized
- ModuleNotFoundError: No module named 'encodings'
复制代码 解决方案如下:- 将 spack 升级到最新版 0.18.0.dev
- 打开 ~/.spack/packages.yaml 文件以编辑
- spack config edit packages
复制代码 - 删除 Python 包的信息,vi 命令行模式用上下箭头移动光标到特定行,dd 删除即可,最后 :wq 保存;重新安装
- <div># 加载相应的数学库</div><div>spack load aocc@3.2 amdfftw@3.1 amdblis@3.1 amdlibflame@3.1 amdscalapack@3.1 openmpi@4.1.1</div><div># 开始安装 VASP</div><div>spack -d install -v -j 16 vasp@6.2.0 +scalapack +openmp %aocc@3.2.0 target=zen2 ^amdfftw@3.1 ^amdblis@3.1 threads=openmp ^amdlibflame@3.1 ^amdscalapack@3.1 ^openmpi@4.1.1 fabrics=auto</div>
复制代码
- 最后,应当可以看到安装成功的提示:
- vasp: Successfully installed vasp-6.2.0-***
复制代码
4. 测试
4.1. 环境设置
加载 vasp.6.2.0 和 aocc.3.2.0 并检查链接的动态库
- spack load vasp@6.2.0 %aocc@3.2.0
- ldd /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/vasp-6.2.0-yopqxc7troimc2lr7wntxffwm5gp7cy4/bin/vasp_std
复制代码 输出大致如下,检查每一项都有被正常连接到
- linux-vdso.so.1 (0x00007ffcbf7b2000)
- libscalapack.so => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/amdscalapack-3.1-hcirhglktisqarc6qkrdf5gnxmlg4jke/lib/libscalapack.so (0x000014e0e8968000)
- libflame.so.3 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/amdlibflame-3.1-gc3bifimj3i7ulbmxcca634tfdiwbdg3/lib/libflame.so.3 (0x000014e0e7a8d000)
- libblis-mt.so.3 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/amdblis-3.1-yixmcbvx7sep665k4t7r3vfkw65bmlul/lib/libblis-mt.so.3 (0x000014e0e7717000)
- libfftw3.so.3 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/amdfftw-3.1-f2n3bogn46suxl6h5p7ncenjiddlxnes/lib/libfftw3.so.3 (0x000014e0e7166000)
- libfftw3_omp.so.3 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/amdfftw-3.1-f2n3bogn46suxl6h5p7ncenjiddlxnes/lib/libfftw3_omp.so.3 (0x000014e0e715d000)
- libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x000014e0e6f61000)
- libmpi_usempif08.so.40 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/openmpi-4.1.1-yt5cmjjwsgn6r6jvonybmkdcyjl5rjbo/lib/libmpi_usempif08.so.40 (0x000014e0e6f1a000)
- libmpi_usempi_ignore_tkr.so.40 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/openmpi-4.1.1-yt5cmjjwsgn6r6jvonybmkdcyjl5rjbo/lib/libmpi_usempi_ignore_tkr.so.40 (0x000014e0e6f0e000)
- libmpi_mpifh.so.40 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/openmpi-4.1.1-yt5cmjjwsgn6r6jvonybmkdcyjl5rjbo/lib/libmpi_mpifh.so.40 (0x000014e0e6ea3000)
- libmpi.so.40 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/openmpi-4.1.1-yt5cmjjwsgn6r6jvonybmkdcyjl5rjbo/lib/libmpi.so.40 (0x000014e0e6c0b000)
- libflang.so => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/gcc-9.3.0/aocc-3.2.0-a6zip2yo4vgubg5u6i6is5ufrcighzst/lib/libflang.so (0x000014e0e67eb000)
- libflangrti.so => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/gcc-9.3.0/aocc-3.2.0-a6zip2yo4vgubg5u6i6is5ufrcighzst/lib/libflangrti.so (0x000014e0e67dc000)
- libpgmath.so => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/gcc-9.3.0/aocc-3.2.0-a6zip2yo4vgubg5u6i6is5ufrcighzst/lib/libpgmath.so (0x000014e0e639d000)
- libquadmath.so.0 => /lib/x86_64-linux-gnu/libquadmath.so.0 (0x000014e0e6353000)
- libomp.so => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/gcc-9.3.0/aocc-3.2.0-a6zip2yo4vgubg5u6i6is5ufrcighzst/lib/libomp.so (0x000014e0e6070000)
- libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x000014e0e5f21000)
- librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x000014e0e5f17000)
- libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x000014e0e5ef2000)
- libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x000014e0e5ed7000)
- libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x000014e0e5ce5000)
- libompstub.so => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/gcc-9.3.0/aocc-3.2.0-a6zip2yo4vgubg5u6i6is5ufrcighzst/lib/libompstub.so (0x000014e0e5cdc000)
- /lib64/ld-linux-x86-64.so.2 (0x000014e0e8f35000)
- libopen-rte.so.40 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/openmpi-4.1.1-yt5cmjjwsgn6r6jvonybmkdcyjl5rjbo/lib/libopen-rte.so.40 (0x000014e0e5bc9000)
- libopen-orted-mpir.so => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/openmpi-4.1.1-yt5cmjjwsgn6r6jvonybmkdcyjl5rjbo/lib/libopen-orted-mpir.so (0x000014e0e5bc4000)
- libopen-pal.so.40 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/openmpi-4.1.1-yt5cmjjwsgn6r6jvonybmkdcyjl5rjbo/lib/libopen-pal.so.40 (0x000014e0e5992000)
- libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x000014e0e598c000)
- libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x000014e0e5987000)
- libz.so.1 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/zlib-1.2.12-2rn4z7rmbu76lguvwdxxtuvq5ekuCV4y/lib/libz.so.1 (0x000014e0e596c000)
- libhwloc.so.15 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/hwloc-2.7.1-mhxd7qlcqkboseurq2v7p3bnlzyic5xr/lib/libhwloc.so.15 (0x000014e0e590f000)
- libevent_core-2.1.so.7 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/libevent-2.1.12-sugha6eb5ngic3g6rvgntehh2tftwtkl/lib/libevent_core-2.1.so.7 (0x000014e0e58d7000)
- libevent_pthreads-2.1.so.7 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/libevent-2.1.12-sugha6eb5ngic3g6rvgntehh2tftwtkl/lib/libevent_pthreads-2.1.so.7 (0x000014e0e58d2000)
- libpciaccess.so.0 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/libpciaccess-0.16-uxbxrlcqyu2mmb7toz43b2wft4qe5q4v/lib/libpciaccess.so.0 (0x000014e0e58c5000)
- libxml2.so.2 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/libxml2-2.9.12-smjqtjvyouf3p2gjblb5j5wxmgma3baf/lib/libxml2.so.2 (0x000014e0e574f000)
- libiconv.so.2 => /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/libiconv-1.16-cyeood53nsd4eoxjzukokmv3zbkwjoyq/lib/libiconv.so.2 (0x000014e0e5654000
复制代码 很好!先别急着退出root,普通用户在spack加载时会出现找不到编译器的问题,需要手动设置一下。
- # root用户查找机器上的编译器,注意输出显示的yaml文件路径
- spack compiler find # -> /root/.spack/linux/compilers.yaml
- # 复制到用户user1的 ~/.spack/linux/compilers.yaml 下,否则可能找不到编译器
- cp /root/.spack/linux/compilers.yaml /home/user1/.spack/linux/compilers.yaml
复制代码
4.2. 标准算例测试
退出 root 用户,使用普通用户进行算例测试。
在进行VASP6内置的算例测试时,先把刚编译好的vasp执行程序链接到特定路径下:
- # 把vasp.6.2.0.tgz压缩包放到文件夹下,如 ~/test
- cd ~/test
- tar -xvzf vasp.6.2.0.tgz
- cd vasp.6.2.0
- # 创建软链接
- ln -s /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/vasp-6.2.0-yopqxc7troimc2lr7wntxffwm5gp7cy4/bin/vasp_std bin/vasp_std
- ln -s /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/vasp-6.2.0-yopqxc7troimc2lr7wntxffwm5gp7cy4/bin/vasp_gam bin/vasp_gam
- ln -s /opt/spack/opt/spack/linux-ubuntu20.04-zen2/aocc-3.2.0/vasp-6.2.0-yopqxc7troimc2lr7wntxffwm5gp7cy4/bin/vasp_ncl bin/vasp_ncl
- # 加载 vasp.6.2.0 和 aocc.3.2
- spack load vasp@6.2.0 %aocc@3.2 # 初次加载需要数秒,请耐心等待
- which vasp_std # 检查vasp_std是否正常加载,路径是否正常
- which mpirun # 检查mpirun路径
- nohup make test > testResult.txt& # 耐心等待测试完成,大约十几分钟
复制代码 5. 不足
测试结果显示 SiC8_GW0R step GW算例出错1Error in SOLVE_NONLS, weight is negative: 13 NaN NaN,处理相应的GW计算时或许得采用其他的vasp程序。
这种方法暂时无法安装VTST(https://theory.cm.utexas.edu/vtsttools/installation.html)和VASPsol(https://github.com/henniggroup/VASPsol)等程序
6. 总结
用户不必去理会编译时极其繁杂恼人的参数设置,尤其是 MPI 与 fortran 的绑定以及 VASP 安装时 makefile.include 参数的仔细校对,可以节省大量时间。
安装的VASP与使用英特尔 oneAPI 套餐编译出来的VASP相比,一些简单算例的速度提升显著!
不同算例内部对函数的调用情况不同,采用不同编译器运行将体现不同效率。 实测有的算例使用英特尔的 oneAPI 运行效率更高,即使是在AMD的CPU上!
对于大型计算,有必要做小型测试,先跑几个电子步然后杀掉进程,对比不同编译器运行的速度。
|
评分 Rate
-
查看全部评分 View all ratings
|