times.F90
路径
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar\times.F90
文件定位
times.F90 定义模块 times,为并行动力提供 wall-clock/CPU 计时和按 rank、按 band 数的统计表。它的主要使用位置是 bands 的自适应分布调整例程。
Mars 运行参与度
条件经过:Mars 并行动力启用 dyn3dpar timing 和 adaptive bands 时经过;串行入口不经过。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
times |
module | 1 | 计时统计模块。 |
init_timer |
subroutine | 26 | 分配并清零所有 timer 表。 |
start_timer |
subroutine | 50 | 开始某类 timer。 |
suspend_timer / resume_timer |
subroutine | 69 / 86 | 暂停和恢复某类 timer。 |
stop_timer |
subroutine | 102 | 停止 timer 并更新平均和离散度。 |
allgather_timer |
subroutine | 137 | 汇总累计时间表。 |
allgather_timer_average |
subroutine | 172 | 汇总平均、离散度和迭代次数。 |
InitTime |
subroutine | 212 | 开启全局计时并初始化系统/CPU 时间基准。 |
DiffTime |
function | 224 | 返回距上次调用的 wall-clock 时间差。 |
DiffCpuTime |
function | 238 | 返回距上次调用的 CPU 时间差。 |
模块状态
| 状态 | 说明 |
|---|---|
nb_timer=4 |
计时类型数。 |
timer_caldyn=1、timer_vanleer=2、timer_dissip=3、timer_physic=4 |
与 band 调整阶段对应。 |
stopped/running/suspended |
timer 状态枚举。 |
timer_table(max_size,nb_timer,0:mpi_size-1) |
累计耗时。 |
timer_table_sqr |
累计平方,用于估算离散度。 |
timer_iteration |
每个 band 数、timer 类型和 rank 的样本数。 |
timer_average、timer_delta |
平均耗时和标准差式离散度。 |
AllTimer_IsActive |
全局开关;未开启时 start/stop 不记录。 |
计时更新逻辑
init_timer 以 jjm+1 作为 max_size 分配统计表。start_timer 记录起始时间并把状态置为 running;suspend_timer 把当前运行段累加到 timer_running 并进入 suspended;resume_timer 重新记录起点;stop_timer 完成一次样本记录。
stop_timer 使用当前 parallel_lmdz:jj_nb 作为 band 数索引,把本次耗时写入 timer_table(jj_nb,no_timer,mpi_rank),同时增加平方和与迭代次数,并计算:
average = sum / N
delta = sqrt(abs(sum_sq - sum*sum/N)/(N-1))
当样本数小于 2 时,delta=0。
MPI 汇总
allgather_timer 和 allgather_timer_average 只在 using_mpi 且 timer active 时调用 MPI_ALLGATHER。前者同步累计和平方和,后者同步平均、离散度和迭代次数。datatype 使用 MPI_REAL_LMDZ 与 MPI_INTEGER,通信器是 COMM_LMDZ。
复现要点
- 统计表第三维是 rank,范围
0:mpi_size-1。 - timer 样本绑定当前
jj_nb,因此调整 band 前后会落到不同表格行。 AllTimer_IsActive由InitTime设置;未调用时所有 timer 子程序基本空转。- 状态错误只打印消息并把状态重置,不走统一 abort。
待确认
InitTime的实际调用点和 timer 是否默认开启,需要从leapfrog_p或并行 driver 补充依据。DiffTime/DiffCpuTime是否被外部使用需后续符号索引确认。