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 中某些 llm 与 omp_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。 |
复现要点
- 并行问题先记录
mpi_size/mpi_rank/omp_size/omp_chunk/llm。 leapfrog_p会频繁SetDistrib(jj_Nb_Caldyn/Physic/Dissip),不要只看初始化分布。- hybrid
MPI_Waitall错误先查omp_chunk是否被用户getin覆盖成危险值。 Gather_Field支持ip1jmp1和ip1jm两类水平维度,南端处理不同。