串行/并行动力对照主题页
源码范围:LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d、dyn3dpar、dyn3d_common 和相关 phy_common 并行接口。 Mars 运行参与度:条件经过 + 接口兼容。串行 Mars 3D 或 Mars nogcm 类路径不经过 dyn3dpar 的 MPI halo/bands;Mars 并行动力构建会经过 dyn3dpar 入口、decomposition、halo、band 分布和 _p 动力例程。物理侧并行抽象对 Mars physics 并行初始化是接口兼容/条件经过。
读法
这个主题页回答两个问题:
- 串行
dyn3d和并行dyn3dpar在物理/数值职责上如何对应。 - 并行版为了 decomposition、halo、band 和分布式 I/O 增加了哪些约束。
最短阅读路径:
- dyn3d/index:串行动力目录职责。
- dyn3dpar/gcm:并行入口在串行主链上增加 MPI/OMP 和 band 初始化。
- leapfrog_p:并行 Matsuno/leapfrog 主循环如何切换 band、halo、physics、耗散和 I/O。
- calfis_p:并行动力-物理列映射、OMP split 调用和 tendency 回填。
- parallel_lmdz:纬向 decomposition、rank/OMP 状态、gather/broadcast。
- mod_hallo:halo/swap 请求注册、打包、发送、等待、解包。
- bands:caldyn、Van Leer、dissip、physics 的 band 分布和自适应调整。
- guide-serial-parallel-delta:nudging 的局部分布、halo、root 输出和
factt差异。 - 再读各串并行 helper 页:
caldyn、advtrac、integrd、dissip、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.def 和 conf_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.nc 和 factt 诊断差异。 |
数据布局和维度
串行页通常用全局水平维度描述:
ip1jmp1,llm:标量或纬向风等全局水平维度。ip1jm,llm:经向交错网格。q(ip1jmp1,llm,nqtot):tracer 第三维来自infotrac%nqtot。
并行页仍保持相同物理含义,但只处理当前 rank/线程负责的局部范围。关键是:
parallel_lmdz以jjm+1个纬向 band 做基本分布。ij_begin/ij_end决定本 rank 的连续水平片段。pole_nord/pole_sud影响极点 halo 和输出边界。- 并行 history/restart 需要把局部场写入或收集成全局 NetCDF 布局。
因此调试并行差异时,先比较“局部范围和 halo 是否正确”,再比较数值公式。
通信发生在哪里
并行计算不是每个 _p 例程都直接调用 MPI。通信可能来自三类位置:
| 类型 | 例子 | 说明 |
|---|---|---|
| 简单上下 halo | parallel_lmdz:exchange_hallo |
相邻 rank 交换边界行,适合直接上下 halo。 |
| 注册式 halo/swap | mod_hallo |
复杂字段、重分布和 OpenMP threadprivate buffer 使用请求对象。 |
| gather/broadcast/reduce | parallel_lmdz 或 phy_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 或确认默认分布,否则串并行对照会受到分布差异影响。
物理侧并行接口
动力并行与物理并行在 iniphysiq 和 phy_common transfer 层交汇:
- 并行
gcm给iniphysiq传distrib_phys(mpi_rank)和comm_lmdz。 - calfis_p 在 physics 步把动力局部场整理成物理列,按
klon_omp调用call_physiq,再把 tendency 回填给动力网格。 - mod_phys_lmdz_para 初始化物理侧 MPI/OMP 抽象。
klon_loc、is_master是THREADPRIVATE,因此 OpenMP 下每个线程物理列数不同。- 物理侧 scatter/gather/bcast/reduce 由
mpi-data-transfer、omp-data-transfer和 transfer wrapper 承担。
这意味着 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 路径 | 不纳入本主题。 |
复现检查表
- 先确认可执行文件是
seq还是para,不要把dyn3dpar问题套到串行运行。 - 对并行运行,记录 MPI ranks、OMP threads、
Bands_*prc.dat是否存在。 - 检查
parallel_lmdz的jj_begin/jj_end/ij_begin/ij_end和极点 rank。 - 对局部数值差异,先确认对应阶段是否已经
SetDistrib到正确 band。 - 对边界行差异,查
exchange_hallo或mod_hallo请求注册宽度。 - 对 tracer 差异,先查 scheme,再查
advtrac_p/vlsplt*_p的 halo/swap。 - 对 history/restart 差异,查 rank 0、IOIPSL domain、局部切片和 root 写出路径。
- 对 physics 差异,同时查动力侧
distrib_phys和物理侧 transfer。
待确认
- Mars 标准并行作业是否保留并复用
Bands_*prc.dat,需要运行目录样例确认。
相关页面
- dyn3d/index
- dyn3dpar/gcm
- leapfrog_p
- calfis_p
- parallel_lmdz
- mod_hallo
- bands
- times
- guide-serial-parallel-delta
- caldyn-serial-parallel
- advtrac-serial-parallel
- integrd-serial-parallel
- dissip-serial-parallel
- history-output-serial-parallel
- dynredem-restart
- mod_phys_lmdz_para
- restart-io
- dynamics-time-integration