资讯动态

LAMMPS 区域分解(Domain Decomposition)与并行负载均衡实战指南

发布时间:2026/10/6 12:28:49 来源:尧图企业网站定制
科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载LAMMPS 面向分布式内存并行MPI的核心策略是空间分解把模拟盒子划分成互不重叠的子域每个子域由对应的 MPI 进程“拥有”并负责计算。本文以 Developer_par_part.rst 为主线系统讲解 LAMMPS 的“brick”与“tiled”两种分解方式、模拟盒子的几何与边界类型以及面对非均匀密度模型时通过processors、balance、fix balance与递归二分RCB等手段消除负载失衡的完整方案并结合源码给出可复现的配置示例。读完本文你将能够为具体的并行仿真选择正确的通信风格、设计处理器网格并写出真正平衡的并行输入脚本。LAMMPS 的 brick 与 tiled 区域分解示意图一、从模拟盒子到子域LAMMPS 的空间分解模型LAMMPS 的模拟盒子是一个 2d 或 3d 体积其形状可以是正交orthogonal或三斜triclinic。正交盒子的边与笛卡尔坐标轴x、y、z对齐所有面均为矩形三斜盒子则是更一般的平行六面体边沿三个任意向量方向延伸面为平行四边形通常用于剪切shear或非正交晶胞的模拟。在每个维度上盒子边界有三种行为模式由 boundary 命令 设置周期性p原子从一侧边界离开后从对侧进入固定f原子一旦越过该面即被删除收缩包裹s盒面位置随原子运动持续调整始终包围全部原子。brick默认的规则网格分解对于分布式内存 MPI 并行LAMMPS 把模拟盒子空间分解为互不重叠的子域填满整个盒子。默认的brick分解适合原子密度大致均匀的模型子域构成一个规则的处理器网格所有子域在尺寸和形状上完全相同。无论是正交还是三斜盒子都可以在模拟过程中连续变形例如压缩固体或剪切液体此时处理器子域随之变形。tiled通用的不规则瓦片分解tiled通信风格允许更一般的分解模拟盒子被划分成大小、形状各异的矩形“瓦片”tile每个处理器拥有一块。这种分解通常由负载均衡命令触发其通信模式比规则网格复杂得多详见下文。二、用 comm_style 设定分解方式底层分解策略由 comm_style 命令 设定语法如下comm_style style style brick 或 tiled示例comm_style brick comm_style tiled需要特别强调的是comm_style 本身并不执行分解它只决定允许哪种分解以及配套的通信模式。分解发生在模拟盒子创建之时create_box、read_data或read_restart初始分解对两种风格完全一致之后可由balance或fix balance命令改变。默认风格为brick。从源码看这一机制在 comm.cpp 中实现CommBrick与CommTiled分别继承自基类CommComm::init()依据style参数实例化对应实现。brick 风格下每个处理器与规则网格中 6 个笛卡尔相邻处理器交换近邻原子信息tiled 风格下处理器间的邻居关系更加复杂通信经由 irregular.h 管理的“不规则通信”路径完成。幽灵原子ghost atoms与两级通信无论采用哪种分解要计算短程相互作用MPI 进程不仅需要自己“拥有”的原子数据还需要来自相邻子域的“幽灵原子”——即距子域边界不超过通信截断距离的原子副本如图中绿色虚线框所示。这一机制同时天然实现了周期性边界跨越周期边界的原子同样以幽灵原子形式从周期的复制子域中取得。幽灵原子通信每个 MD 时间步都要执行因此其模式必须高效。在 2d 模拟中分两阶段3d 中分三阶段先沿x方向交换再沿y方向交换。x阶段各方向邻居发送其红色区域的原子y阶段发送蓝色区域原子其中可能包含上一阶段收到的幽灵原子。不规则分解tiled下模式更复杂——每个方向可能有多个邻居——但仍可仅通过相邻处理器的交换在有限阶段内完成。正向forward通信把拥有原子的属性发给邻居成为其幽灵原子反向reverse通信把幽灵原子计算出的力等属性回送给拥有该原子的进程。详见 Developer_par_comm.rst。brick 与 tiled 两种风格下的幽灵原子通信模式三、负载失衡均匀网格的局限当模型密度不均匀时如气液界面、含空洞的不规则几何体、或组合多种计算代价不同的pair_style hybrid模型默认按体积等分规则网格的分解会让各处理器上的粒子数严重不均。并行效率因此被最慢的处理器即计算负载最大的那个拖累——整体模拟速率受限于木桶短板。文档用一个 2d 系统、12 个 MPI 进程的示例直观展示了这一过程下图四张图分别对应四种方案原子颜色表示各子域的负载失衡程度绿色最优、红色最差由于系统存在真空区域默认分解下部分 MPI 进程甚至没有原子最左图强制 1x12x1 网格后每个进程都参与计算但各子域原子数仍不均且狭长切片形状增大了子域间通信量左二改用 2x6x1 网格并平移子域分界负载失衡进一步减小、通信量降低左三最后使用**递归二分RCB**得到进一步优化的分解最右。四、三种负载均衡策略LAMMPS 提供多层策略来消除负载失衡由浅入深依次为1. 用 processors 命令优化处理器网格默认情况下处理器网格分解基于模拟单元体积并尝试优化子域的体积/表面积比。这可以通过 processors 命令 改变processors Px Py Pz keyword args ...Px、Py、Pz是覆盖模拟域的三维网格在三个方向上的 MPI 进程数约束为 Px × Py × Pz P总进程数任何一维可用*让 LAMMPS 依据盒子尺寸自动选择。关键字还包括gridonelevel/twolevel/numa/custom用于多核节点的网格布局与map决定 MPI 进程到网格的映射方式如cart、xyz等。对于 2d 模拟Pz固定为 1。选择合理的因数分解本身就能解决一部分问题的负载均衡但无论 Px、Py、Pz 如何取值所有子域仍具有相同的形状与体积因此它只能作为第一层手段。2. 用 balance 命令平移分界平面静态均衡balance 命令 调整处理器子域在盒子内的尺寸与形状力求各处理器上的原子数或加权负载均匀。它是“静态”的只在运行前或两次运行之间执行一次后续运行期间子域保持不动。balance thresh style args ... keyword args ... thresh 必须超过才会执行再均衡的不均衡阈值 style x | y | z | shift | rcb keyword weight | sort | outx / y / z网格类方法调整指定维度上处理器子域间的切割平面位置。参数为uniform等间距切分或 Ps-1 个升序排列的 0~1 之间的分数表示切割平面的相对位置0.0 为盒子左/下边缘1.0 为右/上边缘。例如balance 0.9 x uniform y 0.4 0.5 0.6在 x 方向均匀切分、在 y 方向按 0.4/0.5/0.6 三处切割。shift网格类方法按dimstr只含 x/y/z 且每个字母至多出现一次指定的维度序列迭代移动切割平面Niter为每个维度内的迭代次数stopthresh为提前停止的阈值。单维度上的再均衡采用递归多分割recursive multisectioning算法每次迭代统计切割平面两侧的粒子数若与目标不符则把切割位置调整到低、高边界的中点边界随迭代收窄——每迭代一次区间缩小一半因此Niter10时精度约千分之一Niter20时约百万分之一无需设过大。均衡完成后若相邻平面间距小于邻居皮肤距离neigh_modify设定平面会被平移开以保证动态运行中不丢失粒子。rcb瓦片类方法递归坐标二分详见下节。不平衡因子imbalance factor定义为任意处理器拥有的最大粒子或权重数 ÷ 每处理器平均粒子或权重数。1.0 表示完美均衡。例如 10000 粒子跑在 10 个进程上最重负载进程有 1200 个粒子则因子为 1.2即有 20% 的不均衡此时完美均衡最多可使模拟提速约 20%。指定thresh 1.0可以强制在已均衡状态下执行再均衡。3. 用 fix balance 实现动态均衡若密度分布在模拟过程中持续演化静态均衡不够用应改用 fix balance 在run过程中按固定频率动态调整子域fix ID group-ID balance Nfreq thresh style args ... keyword args ... fix 2 all balance 1000 1.05 shift x 10 1.05 fix 2 all balance 1000 1.1 rcbNfreq为检查/再均衡的时间步间隔支持shift、rcb与report仅报告当前不平衡因子。该 fix 计算出的标量与向量量是“intensive”的可通过输出命令访问。4. RCB递归坐标二分rcb风格调用 rcb.cpp 中RCB类实现的递归坐标二分Recursive Coordinate Bisectioning其基本思想如下沿某一维度用一个轴对齐切割把仿真域一分为二。选哪个维度取决于父盒子内的粒子权重分布通常切最长维但当全部或大部分粒子集中在盒子一端时可能换另一个维度切以产生更接近立方体3d/方形2d的子盒子。所有处理器也被分成两组各对应切割一侧的子盒子进程数为奇数时一侧多分一个。切割位置通过二分中位数搜索迭代定位使下半盒的加权粒子数恰好等于分配给该盒的处理器应有的份额从而上下两盒都达到完美均衡。注意每次迭代统计切割两侧的粒子数都需要所有处理器之间的通信。后续切割以完全相同的方式递归进行分配给每个盒子的那组处理器再在该盒的一个维度上做新切割把盒子、处理器子集与盒内粒子一分为二直到每个处理器都获得一块子域并拥有其中的加权粒子。RCB 的运算核心在 rcb.cpp 中可见它创建了 box 与 median 两种 MPI AllReduce 的自定义数据类型MPI_Type_contiguous(6,MPI_DOUBLE,box_type)并通过irregular对象完成粒子迁移。网格方法与瓦片方法的搭配规则x/y/z/shift属于“网格”方法rcb属于“瓦片”方法网格方法可搭配comm_style brick或comm_style tiled瓦片方法只能搭配comm_style tiled在 tiled 分解下指定网格方法会把瓦片分解丢弃、重建均匀间隔的逻辑 3d 网格作为起点因此可以利用网格方法把分区“还原”成规则网格之后改回comm_style brick指定瓦片方法时当前分区无论是网格还是瓦片被忽略从头计算新分区网格方法在某些情况下无法达到完美均衡例如系统初始由create_atoms生成完美晶格时——整条晶格面只能整体归属某个处理器2d 模拟中不能使用z风格shift的dimstr中也不能出现z。五、加权负载均衡weight 关键字默认每个粒子权重为 1.0即假定每个粒子在一个时间步内计算量相同。当这个假设不成立如 hybrid 势中昂贵的多体势与快速两体势混用、run_style respa下部分区域键合相互作用密集时可用weight关键字按经验调整逐粒子权重。起作用的只是权重之间的相对比值权重 2.5 的粒子被认为比权重 0.5 的粒子贵 5 倍权重必须为正。weight style args ... style group | neigh | time | var | storegroupweight group Ngroup group1 weight1 group2 weight2 ...为指定组的粒子赋权重属于多组时权重相乘不属于任何指定组则权重不变。适用于pair_style hybrid与run_style respa场景但假设各组计算代价随时间恒定建议用系列试运行调参。neighweight neigh factor按处理器拥有的邻居列表中的邻居总数加权——邻居越多计算代价越高。timeweight time factor按粒子实际花在计算上的时间加权是更接近真实负载的度量。varweight var name从原子风格变量取权重。storeweight store name把权重存入由fix property/atom定义的自定义原子属性。多个weight标志可以同时使用产生的权重通过相乘合并。示例balance 1.0 shift x 10 1.1 weight group 2 fast 0.5 slow 2.0 balance 1.0 shift x 10 1.1 weight time 0.8 weight neigh 0.5 weight store balance六、源码视角分解如何贯穿 FFT 网格与粒子迁移区域分解不只影响近邻力计算也贯穿长程静电求解。在 Developer_notes.rst 的 FFT 网格一节中明确指出PPPM 类求解器的全局网格同样按处理器子域分解为砖块——“通常是一个规则的 3d 数组Px × Py × Pz更一般地可以是 tiled 分解其中每个处理器拥有一块砖所有砖的并集即全局网格tiled 分解由 RCB 算法的负载均衡产生”。FFT 分解则要求每个处理器拥有横跨整个 x 维的砖y/z 维按规则 2d 数组切分。这正是为何使用balance rcb后 PPPM 的网格分配也随之改变也解释了 balance.rst 中“改变子域形状可能引入 PPPM 等额外计算与通信开销”的告诫——调整分区后应当实测前后运行时间。每次再均衡完成后粒子被迁移到其新的拥有进程fix balance与balance均调用Comm/Irregular完成这一步随后基于新子域重建邻居列表并继续模拟。七、实战决策清单针对一个实际的并行仿真可按以下顺序评估与配置先确认密度是否均匀如果原子在盒内分布基本均匀保持默认comm_style brick即可无需任何均衡操作。若存在明显密度差异先用processors强制一个更合理的网格因数分解如文档示例中避免 1×12×1 的狭长切片改用 2×6×1配合balance shift平移分界平面。若仍不满足切换到comm_style tiled并执行balance 1.1 rcb或fix balance动态版本用递归二分获得每个子域粒子数或权重相等的分解。善用out关键字balance ... out tmp.balance把每个处理器的子域写入文件便于可视化验证分解质量。权衡通信开销狭长子域如 1×12×1虽然让每个进程都有原子但增加了子域间通信均衡的目标是粒子数均匀与通信量最小之间的平衡最终应以实测运行时间为准。相关文档导航comm_style 命令、processors 命令balance 命令、fix balance 命令并行架构总览Developer_parallel.rst含本页在内的 comm/neigh/long/openmp 分节幽灵原子通信详解Developer_par_comm.rstRCB 算法实现rcb.cpp、balance.cpp、fix_balance.cpp赞分享科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载相关推荐kinit负载均衡流量分发与负载均衡实战指南kinit负载均衡流量分发与负载均衡实战指南 引言为什么需要负载均衡 在现代Web应用架构中随着用户量的增长和业务复杂度的提升单一服务器往往难以承受高后端前端任务调度认证鉴权移动开发Transformer多GPU并行训练annotated-transformer负载均衡实战指南Transformer多GPU并行训练annotated transformer负载均衡实战指南 还在为Transformer训练速度慢而烦恼一文教你如何利教程示例工程深度学习NLP人工智能多区域部署防雪崩ribbon4cj区域感知负载均衡器实战解析多区域部署防雪崩ribbon4cj区域感知负载均衡器实战解析 ribbon4cj 是面向仓颉Cangjie语言的 原生微服务客户端负载均衡器 内置 区域GUI 自动化计算机视觉RPA人工智能上一篇普通摄像头做眼动追踪eyeLike 上手实录下一篇如何安全清理Windows驱动RAPR新手完整指南轻松找回10GB空间创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑