mod_hallo.F90
路径
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar\mod_hallo.F90
文件定位
mod_hallo.F90 定义并行动力 halo 请求模块 mod_Hallo。它把字段指针、纬向 offset、层数和 stride 注册为 send/recv 请求,统一打包到缓冲区,使用非阻塞 MPI 发送/接收,并在等待阶段解包回目标字段。
Mars 运行参与度
条件经过:Mars 并行动力和 COMMON dyn3dpar 的 halo、分布重设、并行诊断路径经过;串行入口不经过。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
mod_Hallo |
module |
1 |
halo 请求、缓冲和复制工具。 |
Init_mod_hallo |
subroutine |
48 |
初始化线程私有缓冲和请求列表。 |
Register_Hallo |
subroutine |
317 |
为上下邻接 rank 注册 halo send/recv。 |
Register_SwapField |
subroutine |
217 |
为重新分布后的重叠 band 注册交换。 |
Register_SwapFieldHallo |
subroutine |
265 |
类似 swap,但把新分布按 halo 上下扩展。 |
SendRequest |
subroutine |
384 |
打包发送字段,post MPI_ISSEND/MPI_IRECV。 |
WaitRequest |
subroutine |
502 |
等待所有请求,解包接收字段并释放缓冲。 |
WaitSendRequest / WaitRecvRequest |
subroutine |
597 / 654 |
分离等待发送或接收。 |
CopyField / CopyFieldHallo |
subroutine |
736 / 775 |
本 rank 内重叠区域直接复制。 |
类型和状态
| 类型或状态 |
说明 |
type Hallo |
保存字段指针、offset、size、层数和 stride。 |
type request_SR |
每个目标 rank 的 send 或 recv 请求列表,含 MPI request。 |
type request |
所有 rank 的 send/recv 列表和当前 tag。 |
Buffer、Buffer_Pos、Index_Pos |
打包缓冲和简单分配表,THREADPRIVATE。 |
MaxRequest=200、MaxProc=80、MaxBufferSize=1024*1024*16 |
请求、rank 和缓冲硬限制。 |
依赖
| 依赖 |
用途 |
mod_const_mpi |
COMM_LMDZ 和 MPI_REAL_LMDZ。 |
parallel_lmdz |
using_mpi/mpi_size/mpi_rank/omp_rank、极点标志和当前 jj 分布。 |
mpif.h |
MPI 常量和状态数组。 |
请求生命周期
- 调用
Init_mod_hallo 初始化缓冲;若 use_mpi_alloc 且 using_mpi,可用 MPI_ALLOC_MEM 创建全局 MPI 缓冲。
- 调用
Register_Hallo、Register_SwapField 或 Register_RecvField/Register_SendField 把字段描述追加到请求对象。
SendRequest 逐 rank 计算打包大小,分配缓冲,将字段分层打包,post MPI_ISSEND;同时为接收端分配缓冲并 post MPI_IRECV。
WaitRequest 收集 send/recv MPI request,MPI_WAITALL 后按注册的 Hallo 描述把缓冲解包进目标字段。
- 释放缓冲、清空各 rank 请求数,并递增或重置 tag。
halo 注册规则
Register_Hallo(Field,ij,ll,RUp,RDown,SUp,SDown,a_request) 按当前 rank 的边界决定是否注册上下邻居通信:
- 北极 rank 不向更北侧接收或发送。
- 南极 rank 不向更南侧接收或发送。
RUp/RDown/SUp/SDown 为 0 时对应方向不注册。
- 真正通信目标是
mpi_rank-1 和 mpi_rank+1。
复现要点
- MPI tag 为
a_request%tag + 1000*omp_rank,OpenMP 线程通过 tag 分离消息。
- MPI 调用包在
!$OMP CRITICAL (MPI) 中,配合 serialized MPI 使用。
SendRequest 在 using_mpi=.false. 时会报错停止;本模块不是串行 fallback。
- 缓冲大小和请求数超限使用
print/stop,不是统一 abort_gcm。
待确认
use_mpi_alloc 的来源和配置路径需要在并行构建或运行参数页面中补充。
MaxProc=80 对大 MPI 作业的限制是否仍符合当前运行规模,需要实际平台确认。
相关页面