bands.F90

路径

LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar\bands.F90

文件定位

bands.F90 定义模块 Bands,保存并行动力不同阶段的纬向 band 数量和物理列分布。它可从 Bands_${iim}x${jjm}x${llm}_${mpi_size}prc.dat 读取历史分布,也可根据 timing 统计把 band 从慢 rank 调整到快 rank。

Mars 运行参与度

条件经过:Mars 并行动力入口使用 COMMON dyn3dpar band 分布时经过;串行 Mars 路径不经过。

定义的符号

符号 类型 行号 作用
Bands module 4 band 分布和自适应调整模块。
AllocateBands subroutine 20 分配所有 rank 的 band 数组。
Read_distrib subroutine 34 读取或生成默认分布。
Set_Bands subroutine 93 派生 vanleer2 和 physics 分布。
AdjustBands_caldyn subroutine 141 根据 caldyn timing 调整 caldyn band。
AdjustBands_vanleer subroutine 206 根据 Van Leer timing 调整输送 band。
AdjustBands_dissip subroutine 272 根据耗散 timing 调整 dissip band。
AdjustBands_physic subroutine 338 根据 physics timing 调整物理列分布。
WriteBands subroutine 393 写出当前分布文件。

模块状态

状态 说明
bands_caldyn=1bands_vanleer=2bands_dissip=3 band 类型编号。
jj_Nb_Caldyn caldyn 阶段每个 rank 的纬向 band 数。
jj_Nb_vanleerjj_Nb_vanleer2 tracer 输送阶段的分布及派生分布。
jj_Nb_dissip 耗散阶段分布。
jj_Nb_physicjj_Nb_physic_bis 物理列相关的纬向/辅助分布。
distrib_phys 每个 rank 传给物理初始化的物理列数或起始分配信息。

读取和默认分布

Read_distrib 构造文件名 Bands_${iim}x${jjm}x${llm}_${mpi_size}prc.dat。若文件存在,按块读取 caldyn、vanleer、dissip 和 physics 分布;若不存在,则把 jjm+1 个纬向 band 尽量平均分给 MPI ranks,同时把 iim*(jjm-1)+2 个物理列平均分配。

Set_Bands

Set_Bands 依据读取结果补充派生状态:

  1. 计算 jj_Nb_vanleer2
  2. 根据 distrib_phys 推导物理侧 jj_para_begin/end 范围。
  3. 填写 jj_Nb_physicjj_Nb_physic_bis,供物理接口和重分布使用。

自适应调整

四个 AdjustBands_* 例程都依赖 times 中的 timer_average/timer_delta/timer_iteration。典型逻辑是:

  1. allgather_timer_average 汇总所有 rank 的计时。
  2. 找出当前阶段平均耗时最大和最小的 rank。
  3. 若慢 rank 的 band 数允许减少,且快 rank 增加一个 band 的预测耗时低于慢 rank 当前耗时,则移动一个 band。
  4. physics 版本还结合 mod_phys_lmdz_para:klon_mpi_para_nb 处理物理列数量。

输出格式

WriteBands 使用和 Read_distrib 相同的文件名,以 formatted 文本写出当前 caldyn、vanleer、dissip 和 physics 分布。并行入口中通常只让 mpi_rank==0 写出,避免多个 rank 同时覆盖文件。

复现要点

待确认

相关页面