串行/并行动力对照主题页

源码范围:LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3ddyn3dpardyn3d_common 和相关 phy_common 并行接口。 Mars 运行参与度:条件经过 + 接口兼容。串行 Mars 3D 或 Mars nogcm 类路径不经过 dyn3dpar 的 MPI halo/bands;Mars 并行动力构建会经过 dyn3dpar 入口、decomposition、halo、band 分布和 _p 动力例程。物理侧并行抽象对 Mars physics 并行初始化是接口兼容/条件经过。

读法

这个主题页回答两个问题:

  1. 串行 dyn3d 和并行 dyn3dpar 在物理/数值职责上如何对应。
  2. 并行版为了 decomposition、halo、band 和分布式 I/O 增加了哪些约束。

最短阅读路径:

  1. dyn3d/index:串行动力目录职责。
  2. dyn3dpar/gcm:并行入口在串行主链上增加 MPI/OMP 和 band 初始化。
  3. leapfrog_p:并行 Matsuno/leapfrog 主循环如何切换 band、halo、physics、耗散和 I/O。
  4. calfis_p:并行动力-物理列映射、OMP split 调用和 tendency 回填。
  5. parallel_lmdz:纬向 decomposition、rank/OMP 状态、gather/broadcast。
  6. mod_hallo:halo/swap 请求注册、打包、发送、等待、解包。
  7. bands:caldyn、Van Leer、dissip、physics 的 band 分布和自适应调整。
  8. guide-serial-parallel-delta:nudging 的局部分布、halo、root 输出和 factt 差异。
  9. 再读各串并行 helper 页:caldynadvtracintegrddissip、history/restart。

总览

串行 dyn3d
  gcm/conf_gcm
    -> global arrays
    -> leapfrog
       -> caldyn
       -> advtrac
       -> integrd
       -> dissip
       -> bilan_dyn/writehist/writedynav/dynredem

并行 dyn3dpar
  gcm/conf_gcm
    -> init_const_mpi/init_parallel
    -> Read_Distrib/set_bands/SetDistrib
    -> Init_Mod_hallo per OpenMP thread
    -> local arrays + halo bands
    -> leapfrog_p
       -> caldyn_p
       -> advtrac_p / vlsplt*_p
       -> integrd_p
       -> dissip_p
       -> bilan_dyn_p/writehist_p/writedynav_p/dynredem_p

入口层对照

主题 串行 dyn3d 并行 dyn3dpar 复现影响
主程序 dyn3d/gcm.F90 dyn3dpar/gcm.F 都读取 run.defconf_gcm,但并行入口先建立 MPI/OMP 环境。
初始态 dynetat0("start.nc") 读全局数组 同样读动力初态,并结合并行分布使用 初态变量含义一致,局部分布和收集路径不同。
physics 初始化 iniphysiq(..., dtphys/nsplit_phys, ...) iniphysiq(..., distrib_phys(mpi_rank), comm_lmdz, ..., dtphys/nsplit_phys, ...) 并行版显式传 communicator 和本 rank 物理列分布。
history/dynav 初始化 串行全局 history id rank 0 初始化,domain 按并行分布定义 并行输出问题要先查 rank 0、domain 和局部切片。
时间推进 leapfrog leapfrog_p 调度概念一致,但并行版在阶段间切换 decomposition 和 halo。

H2 时间推进主题负责解释 forward/leapf/apphys/apdiss 等调度;本页只说明这些调度进入并行后如何受到分布和通信约束。

并行基础层

并行版的核心新增状态在三个模块:

模块 职责 关键状态/动作
parallel_lmdz MPI/OMP rank、纬向 decomposition、局部 ij 范围、gather/broadcast mpi_rank/mpi_size, jj_begin/jj_end/jj_nb, ij_begin/ij_end, pole_nord/pole_sud, SetDistrib
mod_hallo halo 和重分布请求 Register_Hallo, Register_SwapField, SendRequest, WaitRequest, OpenMP threadprivate buffer。
bands 不同计算阶段的 band 分布 jj_Nb_Caldyn, jj_Nb_vanleer, jj_Nb_dissip, distrib_phys, WriteBands
times adaptive bands 计时统计 timer_caldyn/vanleer/dissip/physic、allgather timing。

串行路径没有这些状态,因此串并行差异不应简单解释为“同一数组不同顺序”。并行版的数值等价依赖:正确的局部范围、正确的极点拥有者、正确的 halo 交换时机、正确的 stage-specific band。

主计算段对照

计算段 串行页 并行页/对照 并行新增关注点
动力 tendency caldyn-serial-parallel caldyn_p massbarxy_p、局部子域、halo 前置条件和调试输出。
tracer 调度 advtrac-serial-parallel advtrac_p, vlspltgen_p, vlspltqs_p Van Leer/PPM/Prather 路径的 halo/swap、band 切换和 isotope 同步。
状态积分 integrd-serial-parallel integrd_p 本地子域写回、负压 abort、边界同步前后约束。
耗散 dissip-serial-parallel dissip_p 高阶 stencil 对 halo 宽度敏感,需先确认分布和边界带。
friction/top_bound/addfi/qminimum 对应 routines 串并行页 _p 对应例程 多数职责一致,差异集中在局部范围、边界和并行诊断。
守恒/输出 history-output-serial-parallel, bilan_dyn, bilan_dyn_p writehist_p/writedynav_p/bilan_dyn_p rank 0/domain/local slice/tracer 写出差异。
restart dynredem-restart dynredem_p 并行 root 写出和收集路径。
physics 接口 calfis calfis_p 物理列映射、OMP call_physiq split、MPI tendency 边界交换和 addfi_p 前的回填约定。
guide/nudging guide_mod, guide_p_mod, guide-serial-parallel-delta guide_p_mod 输入全场读取、本地插值/写回、halo、root-only guide_ins.ncfactt 诊断差异。

数据布局和维度

串行页通常用全局水平维度描述:

并行页仍保持相同物理含义,但只处理当前 rank/线程负责的局部范围。关键是:

因此调试并行差异时,先比较“局部范围和 halo 是否正确”,再比较数值公式。

通信发生在哪里

并行计算不是每个 _p 例程都直接调用 MPI。通信可能来自三类位置:

类型 例子 说明
简单上下 halo parallel_lmdz:exchange_hallo 相邻 rank 交换边界行,适合直接上下 halo。
注册式 halo/swap mod_hallo 复杂字段、重分布和 OpenMP threadprivate buffer 使用请求对象。
gather/broadcast/reduce parallel_lmdzphy_common transfer 输出、物理侧全局检查、物理列分布和统计汇总。

串行路径没有通信层;并行路径里“结果不一致”常常不是公式错,而是 halo 注册宽度、band 切换或 root-only 输出路径不对。

Band 和阶段切换

并行版不是固定一种 decomposition 跑完所有阶段。bands 为不同阶段保存不同分布:

阶段 分布变量 目的
caldyn jj_Nb_Caldyn 动力 tendency 阶段。
Van Leer/tracer jj_Nb_vanleer, jj_Nb_vanleer2 输送阶段,可能需要不同 halo/swap 形态。
dissip jj_Nb_dissip 耗散 stencil 阶段。
physics jj_Nb_physic, distrib_phys 物理列分布和 iniphysiq 接口。

times 记录各阶段耗时,AdjustBands_* 可一次移动一个 band 做自适应平衡。复现实验时要保存 Bands_*prc.dat 或确认默认分布,否则串并行对照会受到分布差异影响。

物理侧并行接口

动力并行与物理并行在 iniphysiqphy_common transfer 层交汇:

这意味着 Mars physics 输出或 tendency 的串并行差异,可能来自动力侧 decomposition,也可能来自物理侧列分布和 transfer。

I/O 和 restart 对照

I/O 类型 串行 并行
history 初始化 全局 histid/histvid/histuid 等模块状态 rank 0 初始化,domain 需要局部分布。
history 写出 全局数组写变量 ijb:ije 局部切片,部分 tracer 写出路径不同。
dynav/zonal 串行直接访问完整纬向网格 bilan_dyn_p 先处理 halo/局部纬向段,避免极点重复。
restart dynredem0/1 直接写 restart.nc dynredem0_p/1_p root 写出或收集后写。

H1 restart-io 说明文件职责;本页补充并行为什么会多出 rank/domain/root 的诊断维度。

Mars 范围判断

路径 Mars 参与度 处理方式
串行 dyn3d/gcm 条件经过 Mars 3D seq 或接口参考路径。
Mars phymars/nogcm 必经/条件经过,取决于运行形态 与 COMMON nogcm/leapfrog_nogcm 同类,H2 已说明差异。
并行 dyn3dpar/gcm 条件经过 Mars 并行构建或实验经过;本页重点覆盖。
dyn3dpar halo/bands/times 条件经过 只在并行动力中经过,串行运行不走。
Venus/Titan/evolution/PEM 非 Mars 路径 不纳入本主题。

复现检查表

  1. 先确认可执行文件是 seq 还是 para,不要把 dyn3dpar 问题套到串行运行。
  2. 对并行运行,记录 MPI ranks、OMP threads、Bands_*prc.dat 是否存在。
  3. 检查 parallel_lmdzjj_begin/jj_end/ij_begin/ij_end 和极点 rank。
  4. 对局部数值差异,先确认对应阶段是否已经 SetDistrib 到正确 band。
  5. 对边界行差异,查 exchange_hallomod_hallo 请求注册宽度。
  6. 对 tracer 差异,先查 scheme,再查 advtrac_p/vlsplt*_p 的 halo/swap。
  7. 对 history/restart 差异,查 rank 0、IOIPSL domain、局部切片和 root 写出路径。
  8. 对 physics 差异,同时查动力侧 distrib_phys 和物理侧 transfer。

待确认

相关页面