parallel transfer 5D/6D support
源码基线:LMDZ.COMMON-6.3\LMDZ.COMMON。 Mars 运行参与度:条件经过;Mars 并行物理初始化和配置广播可经过这些 transfer 泛型。
输入范围
libf/phy_common/mod_phys_lmdz_mpi_transfert.F90
libf/phy_common/mod_phys_lmdz_omp_transfert.F90
libf/phy_common/mod_phys_lmdz_transfert_para.F90
高维支持
MPI 层 bcast_mpi 泛型在接口中包含:
- integer:
bcast_mpi_i到bcast_mpi_i6 - real:
bcast_mpi_r到bcast_mpi_r6 - logical:
bcast_mpi_l到bcast_mpi_l6
源码位置:mod_phys_lmdz_mpi_transfert.F90:7-11。5D/6D 入口如 bcast_mpi_i5/i6 在第 119-133 行,bcast_mpi_r5/r6 在第 182-196 行,bcast_mpi_l5/l6 在第 245-259 行。
封装层 mod_phys_lmdz_transfert_para.F90:11-15 同样把 bcast_i5/i6、bcast_r5/r6、bcast_l5/l6 纳入 bcast 泛型。调用方只需要 CALL bcast(var),由 rank 和类型选择具体过程。
层次关系
调用方
-> mod_phys_lmdz_transfert_para:bcast
-> OMP MASTER 调 bcast_mpi
-> bcast_omp 在线程内分发
-> 所有 MPI ranks / OMP threads 得到同一配置或数组
因此 ioipsl_getin_p_mod 的模式是:master 调 getin,再 CALL bcast(VarOut)。
OpenMP 修复
还修复了 OMP transfer 中几个竞态风险:
grow_factor从 integer 改为 real,避免扩容比例被整数截断。- logical buffer allocation 使用
OMP SINGLE语义,避免部分线程看到未分配 buffer。 - real gather 改为通过 shared pointer 写输出,减少共享 buffer 复用风险。
这些变更对 Mars 并行物理参数、诊断数组和高维场广播有直接影响,尤其是 hybrid MPI/OMP 运行。
复现检查
- 如果配置数组 rank 大于 4,确认 当前
bcast_*5/*6已被编译。 - 物理 getin 差异先查
ioipsl_getin_p_mod的is_master -> bcast。 - hybrid 运行的线程不一致问题要同时查 OMP buffer 分配和
parallel_lmdz:omp_chunk。 - 不要把 MPI 泛型和 OMP 泛型混成一个过程;它们在
transfert_para层组合。