c++如何使用MPI进行分布式计算_c++消息传递接口编程入门【HPC】

2次阅读
c++kquote>c++写MPI程序核心是环境搭建、进程区分和消息传递;需用mpic++编译,调用MPI_Init/MPI_Finalize,通过MPI_Comm_rank区分进程,用MPI_Send/MPI_Recv实现点对点通信。

c++如何使用MPI进行分布式计算_c++消息传递接口编程入门【HPC】

用C++写MPI程序,核心就三件事:环境搭好、进程分清、消息发准。不依赖共享内存,靠显式Send/Recv协同计算,适合跑在多台机器或多个CPU核上。

环境安装与验证

ubuntu/WSL这类linux系统上,一条命令装齐运行时和开发头文件:

  • sudo apt install openmpi-bin libopenmpi-dev
  • 装完立刻验证:mpirun –version 能打出版本号,说明MPI已就绪
  • 编译必须用mpic++(不是g++),它自动链接MPI库

第一个可运行的MPI程序

下面这段代码能直接复制保存为hello.cpp,编译运行后会打印每个进程的编号和总数:

  • mpic++ -o hello hello.cpp
  • mpirun -np 4 ./hello → 启动4个独立进程并行执行

关键点:所有进程都运行同一份代码,但MPI_Comm_rank返回的rank值不同,这是任务分工的依据。

立即学习C++免费学习笔记(深入)”;

c++如何使用MPI进行分布式计算_c++消息传递接口编程入门【HPC】

Magick

无代码AI工具,可以构建世界级的AI应用程序。

c++如何使用MPI进行分布式计算_c++消息传递接口编程入门【HPC】 225

查看详情 c++如何使用MPI进行分布式计算_c++消息传递接口编程入门【HPC】

点对点通信怎么写

两个进程之间传数据,最常用的是阻塞式MPI_SendMPI_Recv,注意匹配五要素:

  • 发送方调用MPI_Send(&data, 1, MPI_INT, dest_rank, tag, MPI_COMM_WORLD)
  • 接收方调用MPI_Recv(&data, 1, MPI_INT, src_rank, tag, MPI_COMM_WORLD, &status)
  • 其中tag是自定义标签,用来区分不同用途的消息;status可填MPI_STATUS_IGNORE跳过状态检查

别漏掉初始化和清理

每段MPI代码开头必须MPI_Init,结尾必须MPI_Finalize

  • MPI_Init不只是“启动”,它解析命令行参数(比如-np)、分配通信资源、建立进程上下文
  • MPI_Finalize释放所有MPI内部对象,不调用可能导致进程卡住或资源泄漏
  • 这两个函数各只出现一次,且必须成对出现

基本上就这些。MPI本身门槛不高,6个基础函数就能跑通大部分场景,难的是后续扩展——比如用MPI_Bcast做广播、MPI_reduce做归约,或者和OpenMP混合编程压榨单节点多核性能。

text=ZqhQzanResources