当前位置: 首页 > news >正文

高性能计算应用优化实践之VASP

VASP简介

VASP是最常见的第一性原理计算软件之一。第一性原理计算是基于密度泛函理论,通过选择合适的交换关联赝势(GGA或LDA),然后基于迭代方法自洽求解Kohn-Sham方程,直到所求出的新的电荷密度与输入的电荷密度在收敛判据范围内,则认为迭代计算达到收敛,最后求得系统的总能量、能带、波函数、电荷密度、态密度等等。

VASP编译优化

VASP文件中arch目录中有针对不同编译器的配置文件。

其中-xHOST是Intel编译器针对Intel处理器增加的编译优化选项。Intel平台建议开启该选项。非Intel平台不能识别该参数。

VASP_TARGET_CPU ?= -xHOSTFFLAGS     += $(VASP_TARGET_CPU)

VASP运行优化

VASP使用MKL库完成其中的数学运算,但该库会通过内部函数检测是否为Intel处理器,在Intel处理器上MKL库的加速效果更好。分析显示MKL使用函数mkl_serv_intel_cpu_true来检测它是否在处理真正的Intel CPU。

非Intel平台在intel mkl 2020版本之前可以通过使用环境变量MKL_DEBUG_CPU_TYPE=5可以强制使用AVX2内核,但后续版本移除了这个变量。我们可以用自己的函数来代替它:

int mkl_serv_intel_cpu_true() {return 1;}

并向其编译为共享库:

$ gcc -shared -fPIC -o libisintel.so isintel.c

libisintel.so是识别cpu处理器型号的函数,非Intel平台上运行之前可以加载这个库,替换掉MKL中自带的函数,把非Intel平台识别为Intel,以更好发挥MKL数学库的计算能力。

export LD_PRELOAD=/PATH/libisintel.so

共享内存优化参数:

export I_MPI_FABRICS=shm

Intelmpi默认是shm:ofi,通信过程在查询时会有一定的耗时,针对Intel平台通信做了相关优化,但在非Intel平台会有影响通信性能,导致计算性能降低。可以通过以上参数改善。

UCX优化参数:

export UCX_TLS=sm,dc

调整MPI使用通信协议传输方式为共享内存和动态分配,但UCX参数在单节点测试时,影响不大。

VASP输入文件并行参数优化

VASP主要涉及到K点并行和能带并行两种方式,INCAR主要的并行参数:NCORE,NPAR,KPAR。总核心数=NCORE*NPAR*NKPAR。

KPAR表示同时计算多少个K点,默认为1,可用“grep irre OUTCAR ”查看不可约K点数,体系的K点设置为不可约K点数的除数,最大可设置为体系的不可约K点数。

根据计算体系的实际情况选择性设置,K点较少的体系,并行带来的通信消耗会大于计算的性能提升,对整体计算加速效果不佳。

                                    

NCORE决定轨道并行策略,单个轨道计算所使用的核数量。

NPAR决定能带并行策略,同时并行计算多少条能带。

Vaspwiki上建议优先设置NPAR,但实际情况下设置NCORE更为方便。结合实际测试,我们建议在HYGON平台运行时,NCORE设置为一个NUMA的核心数,从而减少跨NUMA的通信消耗。

算例实践

算例简介:对128个si原子构成的图中结构进行结构优化;选取PAW赝势,PBE交换关联泛函;截断能520eV,精度为1.0E-05eV;KPOINTS是Γ-centered网格,大小为3*3*3

NCORE优化:

在使用同样128核心数时,KPAR默认为1,结果显示NCORE=16达到并行效果最好,其中NCORE是一个NUMA的核心数,减少了跨NUMA的通信消耗

KPAR优化:

NCORE=16时性能最优,在此基础上进一步优化KPAR

该算例共有4个不可约K点:

测试可不同K点并行的结果:

从测试结果来看,KPAR=2时有10%左右的提升,但KPAR=4性能有所降低,是由于并行带来的通信消耗大于计算性能提升,对计算整体加速效果不佳。


http://www.mrgr.cn/news/48715.html

相关文章:

  • 手写mybatis之通过注解配置执行SQL语句
  • 【最新华为OD机试E卷-支持在线评测】跳房子I(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)
  • InternVL2-40B 荣登开源模型榜首丨SuperCLUE中文多模态大模型基准10月榜单
  • 2024-10-12 事业-代号s-开源的进销存系统-记录
  • Docker到底是什么?谈谈我的简单理解
  • QD1-P21-P22 CSS 基础语法、注释、使用方法
  • 小米 1012
  • 三菱FX3UPLC单速定位- DRVI指令/DRVA指令
  • Java消息摘要:MD5验证数据完整性、密码的加密与校验
  • 《OpenCV计算机视觉》—— 人脸识别
  • 关于上传到GPU:这个地方之前一直没有弄清楚
  • 中国剩余定理 C++
  • AI测试入门:基于 RAG 的 LLM 应用程序的测试方法「详细介绍」
  • Linux常见指令
  • 手撕数据结构 —— 带头双向循环链表(C语言讲解)
  • 链接防封(maybe)
  • 01 数据结构基础:数据的逻辑结构(集合、线性、树形、网状)或(线性与非线性)、数据的存储结构(顺序、链式、索引、散列)、数据的运算
  • MySQL数据库管理全面指南:从基础操作到高级管理
  • 组合优化_初识
  • 跟李沐学AI:Transformer