物理侧 OMP data/transfer 组

输入范围

LMDZ.COMMON-6.3\LMDZ.COMMON\libf\phy_common\mod_phys_lmdz_omp_data.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\phy_common\mod_phys_lmdz_omp_transfert.F90

文件定位

mod_phys_lmdz_omp_data.F90 将当前 MPI rank 的 klon_mpi 物理列切分给 OpenMP 线程,并保存线程局部 klon_omp 和起止列。mod_phys_lmdz_omp_transfert.F90 在同一 MPI rank 内用共享缓冲、barrier、master 和 critical 实现 OMP 层 bcast/scatter/gather/reduce。

Mars 运行参与度

条件经过:Mars 或 COMMON 物理侧启用 OpenMP 物理并行时经过;非 OMP 构建退化为单线程分布。

文件和符号

文件 行数 主要符号 作用
mod_phys_lmdz_omp_data.F90 126 mod_phys_lmdz_omp_data, Init_phys_lmdz_omp_data, Print_module_data 保存 OMP rank、线程局部物理列范围和极点标志。
mod_phys_lmdz_omp_transfert.F90 1119 mod_phys_lmdz_omp_transfert, bcast_omp, scatter_omp, gather_omp, reduce_sum_omp, omp_barrier 同一 MPI rank 内的线程间 transfer 包装;主文件页见 mod_phys_lmdz_omp_transfert

OMP data 初始化

Init_phys_lmdz_omp_data(klon_mpi) 的关键步骤:

  1. CPP_OMP 下由 master 线程读取 omp_size,各线程读取 omp_rank;否则设为单线程。
  2. 检查 OpenMP master 是否为 rank 0 线程;异常时调用 abort_physic
  3. master 分配 klon_omp_para_nb/begin/end(0:omp_size-1)
  4. klon_mpi 尽量平均分给线程,余数优先给低编号线程。
  5. 每个线程设置自己的 klon_omp/klon_omp_begin/klon_omp_end
  6. 极点物理标志继承自 MPI data 的 is_north_pole_dyn/is_south_pole_dyn

OMP transfer 接口族

mod_phys_lmdz_omp_transfert 使用模块级 buffer:

公开接口:

复现要点

待确认

相关页面