parallel_lmdz.F90

源码路径:LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar\parallel_lmdz.F90。 Mars 运行参与度:条件经过;Mars 并行动力构建依赖本模块。

文件定位

parallel_lmdz 保存 MPI/OMP 使用状态、纬向 band decomposition、局部 ij 范围、极点所有权和常用通信例程。dyn3dpar 中多数 _p 算子、输送、I/O 和物理接口例程都从这里取得并行边界。

主要符号

符号 行号 作用
init_parallel 53 初始化 MPI/OMP、纬向分块和日志。
SetDistrib 223 切换当前 rank 的纬向 band。
Finalize_parallel 约 256 释放并关闭并行后端。
exchange_hallo 约 370 上下相邻 rank 交换 halo。
Gather_Field 512 收集分布式场到指定 rank。
AllGather_Field 596 gather 到 0 后广播。

omp_chunk 修复

当前源码在 init_parallel 的 OpenMP chunk 计算中加入下调逻辑:

行号 行为
191-192 初始按 (llm+1)/omp_size 向上取整。
197 注释说明 idle threads 可能触发 MPI_Waitall
200-201 当最后线程无工作且 omp_chunk>=1 时递减 omp_chunk
207 若下调后覆盖不足,再检查异常。
211 仍允许 getin('omp_chunk',omp_chunk) 覆盖。

这个修复的目的是避免 hybrid MPI/OMP 中某些 llmomp_size 组合让线程没有垂直层工作,却仍进入 MPI wait 路径,造成 request 错配。

并行分布状态

状态 含义
using_mpi/using_omp 编译宏决定运行路径。
mpi_size/mpi_rank COMM_LMDZ 上进程数和 rank。
jj_begin/jj_end/jj_nb 当前 rank 纬向 band 范围。
ij_begin/ij_end 当前 rank 一维水平数组范围。
pole_nord/pole_sud 是否拥有北/南极。
OMP_CHUNK/omp_rank/omp_size OMP 垂直层分块;omp_rank threadprivate。

复现要点

  1. 并行问题先记录 mpi_size/mpi_rank/omp_size/omp_chunk/llm
  2. leapfrog_p 会频繁 SetDistrib(jj_Nb_Caldyn/Physic/Dissip),不要只看初始化分布。
  3. hybrid MPI_Waitall 错误先查 omp_chunk 是否被用户 getin 覆盖成危险值。
  4. Gather_Field 支持 ip1jmp1ip1jm 两类水平维度,南端处理不同。

相关页面