You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用mpi4py实现单进程预处理、并行主处理与单进程后处理?

解决mpi4py单进程预处理/后处理+多进程并行的问题

你的问题根源在于所有MPI进程都会完整执行脚本的每一行,包括你放在MPI.Init()前后的代码,所以才会出现所有核心跑所有部分的情况。要实现你要的流程,必须通过进程的rank编号来控制不同进程执行不同的代码段,再配合屏障同步所有进程的进度。

正确的代码结构示例

from mpi4py import MPI

# 初始化MPI通信器
comm = MPI.COMM_WORLD
rank = comm.Get_rank()  # 获取当前进程的编号(从0开始)
size = comm.Get_size()  # 获取总进程数

# --------------------------
# 1. 预处理:仅rank=0的进程执行,其余等待
# --------------------------
if rank == 0:
    print(f"进程{rank}开始预处理")
    # 这里写你的预处理函数逻辑
    # 比如:preprocess_function()
    print(f"进程{rank}预处理完成")

# 所有进程在这里等待,直到rank=0完成预处理
comm.Barrier()

# --------------------------
# 2. 所有进程并行执行主函数
# --------------------------
print(f"进程{rank}开始执行主函数")
# 这里写你的主函数逻辑
# 比如:main_function(rank, size)
print(f"进程{rank}主函数执行完成")

# 所有进程在这里等待,直到全部完成主函数
comm.Barrier()

# --------------------------
# 3. 后处理:仅rank=0的进程执行,其余等待
# --------------------------
if rank == 0:
    print(f"进程{rank}开始后处理")
    # 这里写你的后处理函数逻辑
    # 比如:postprocess_function()
    print(f"进程{rank}后处理完成")

# 结束MPI
MPI.Finalize()

关键知识点说明

  • comm.Get_rank():每个进程有唯一的rank编号,我们用rank == 0指定仅主进程执行预处理和后处理。
  • comm.Barrier():强制所有进程在此处等待,直到所有进程都到达这个点,确保预处理完成后才开始并行主函数,所有主函数完成后才开始后处理。
  • 不要把预处理/后处理放在MPI.Init()之前:因为MPI启动后每个进程都会独立执行脚本,MPI.Init()之前的代码会被所有进程重复执行,这正是你之前遇到的问题。

内容的提问来源于stack exchange,提问作者darrowboat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:06:05