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。
BufferBuffer_PosIndex_Pos 打包缓冲和简单分配表,THREADPRIVATE
MaxRequest=200MaxProc=80MaxBufferSize=1024*1024*16 请求、rank 和缓冲硬限制。

依赖

依赖 用途
mod_const_mpi COMM_LMDZMPI_REAL_LMDZ
parallel_lmdz using_mpi/mpi_size/mpi_rank/omp_rank、极点标志和当前 jj 分布。
mpif.h MPI 常量和状态数组。

请求生命周期

  1. 调用 Init_mod_hallo 初始化缓冲;若 use_mpi_allocusing_mpi,可用 MPI_ALLOC_MEM 创建全局 MPI 缓冲。
  2. 调用 Register_HalloRegister_SwapFieldRegister_RecvField/Register_SendField 把字段描述追加到请求对象。
  3. SendRequest 逐 rank 计算打包大小,分配缓冲,将字段分层打包,post MPI_ISSEND;同时为接收端分配缓冲并 post MPI_IRECV
  4. WaitRequest 收集 send/recv MPI request,MPI_WAITALL 后按注册的 Hallo 描述把缓冲解包进目标字段。
  5. 释放缓冲、清空各 rank 请求数,并递增或重置 tag。

halo 注册规则

Register_Hallo(Field,ij,ll,RUp,RDown,SUp,SDown,a_request) 按当前 rank 的边界决定是否注册上下邻居通信:

复现要点

待确认

相关页面