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=1timer_vanleer=2timer_dissip=3timer_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_averagetimer_delta 平均耗时和标准差式离散度。
AllTimer_IsActive 全局开关;未开启时 start/stop 不记录。

计时更新逻辑

init_timerjjm+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_timerallgather_timer_average 只在 using_mpi 且 timer active 时调用 MPI_ALLGATHER。前者同步累计和平方和,后者同步平均、离散度和迭代次数。datatype 使用 MPI_REAL_LMDZMPI_INTEGER,通信器是 COMM_LMDZ

复现要点

待确认

相关页面