|
本帖最后由 Graphite 于 2023-11-22 13:21 编辑
1、起因
在用LAMMPS帮别人用多体势算一些无机材料体系时,因为性能调优很是折腾了一阵子。
这些体系包括纳米团簇、金属-液体界面、气相热解等。
共同的特点是性能开销都很大,64核一两万原子经常跑不到一天1 ns。多节点并行效果也不好。但是体系不可能裁太小,因此就要充分发挥效能。
2、域分解和重新划分
LAMMPS采用典型的基于MPI和域分解进行CPU运算的解决方案,通俗地说就是为每个核划定“包干区”。
想象32个工人来回搬20000块砖,要使他们各司其职,LAMMPS是这样实现的:
1、划定域分解区域,如果什么都不指定,默认是空间平均分成像4x2x4的空间,如果核起了14个,而又不能划2x7x1,那么每个核会起若干个线程,比如各起4个线程,划成2x7x4。
(当然,很不推荐核数是质数或质数x质数,如14核效果可能不如12核)
2、每个核处理自己手头的原子的力和速度计算,同时用接邻列表(neighbor关键词)作缓冲,相当于做着手里的,余光盯着旁边区域的。
3、如果有别的区域的原子进入域分解区域,移交到手上。如果手上的原子离开,移交给别的核。
因此,就产生了以下几个注意点:
1、域分解要合理,例如纳米团簇,原子可能全都集中在不到30%的空间中,此外都是真空。如果平均划分显然造成30%的核干活,70%核跑空,单纯等待。
2、neighbor范围要足够,否则就会报lost atom崩溃——有原子跑出原来的核的区域,又不在旁边核的缓冲区域内,结果没有核管了。
这当中涉及到的关键词:
comm_style:指定域分解的划分样式,brick(默认)或tiled。
balance:重新划分一次,例如balance 1.2 shift xy 10 1.1,也就是若不平衡度(Imbalance Factor,负载最大的核的负载/平均负载)大于1.2,执行shift方式重新分解,最多尝试10次,要求达到1.1以内的不平衡度。
rcb方式只需要1个参数不平衡度。但是2022版本的LAMMPS,rcb如果实在尝试不出来,会卡死,没有最大尝试次数一说。
参照LAMMPS手册的一张图:
左图为brick平均分,属于是极不平衡的状态,6个核在空跑。中图是brick样式+shift方式重新划分之后。右图为tiled样式+rcb方式重新划分之后。
fix balance:运行过程中每N步尝试balance,变量参数和balance差不多,还能设定计算划分的细节,例如weight neigh表示以接邻列表为权重划分,而不是原子数为权重。out变量能输出每次的重新划分方式到一个文本文件中,做出图出来类似上图。虽然图做出来也没啥用,但至少能确认是否有在好好重新划分。
neighbor:接邻列表相关,考虑重新划分时,接邻列表半径要设的稍大些,例如原来2.0的可以设4.0,防止核数多,划分方式又复杂,在两次重新划分之间的某步掉原子。当然设太大会在搜索接邻列表时消耗太多性能。
另,reaxff力场若要输出键合情况(reax/c/bonds),会覆盖neighbor设定,所以这时neighbor写在所有力场相关设置之后。
体系大小、核数、划分空间在这类问题中互相影响,如果密度极高,可能一个核也就带300原子,那么不合理的设置可能会导致因为通信崩或者效率极低,相比化学结构不合理崩就太不甘心了。
3、例子和广告
气相热解问题见http://bbs.keinsci.com/thread-38799-1-1.html
这个体系越跑到后期团簇生成的就越紧密,而别处都是低密度气相,如果不设置fix balance,开局2 ns/day可能觉得还不错,后期相互作用项更多+不平衡,只剩不到0.5 ns/day乃至根本算不动了。
合理设置之后,好歹到最后还剩0.8 - 1 ns/day。
某个除了团簇全是真空的模拟,不设置fix balance只有五分之一的性能,就是真正的”一核有难八核围观“了。
对于均相、两相间密度/作用复杂度差别不大的,设置一下也能提升10%左右性能。
这些问题实际上都是代算,实际呈现的交付报告肯定是基于具体体系的研究,而且远比帖子里要规范、丰富十倍。
代算归代算,良心还是要有。钱很重要,但更重要是图一开心和念头通达,否则迟早要和黑心的同流合污。我钻研(折腾)得开心,收得堂堂正正,客户收到规范合理的结果,也省心舒适。
会把前因后果、为什么这么建这么算、详细的结果和表述写进报告,也会附上恰当的引用。客户(的课题组)哪天要是自己学了,把报告翻出来看看肯定能学到点,并且能复现。给内行把关评理,也完全欢迎,问心无愧。
|
评分 Rate
-
查看全部评分 View all ratings
|