讲师中心 微信公众号
AI工具推荐 视频效率加速

c++ mpi并行计算 c++如何使用openmpi进行分布式计算

浅辰姑娘_8779

浅辰姑娘_8779

发布时间:2026-03-19 19:33:51

|

930人浏览过

|

来源于php中文网

原创

MPI_Init必须在所有MPI调用前且仅调用一次,传入&argc和&argv;MPI_Comm_rank/size返回当前进程在通信器中的局部视图;MPI_Send/Recv需source、dest、tag、comm四者严格匹配;编译必须用mpicxx,运行必须用mpirun。

c++ mpi并行计算 c++如何使用openmpi进行分布式计算

mpi_init() 必须在所有 MPI 调用前执行,且只能调用一次

很多刚写 MPI 的人会在多个函数里反复调用 MPI_Init,或者在没初始化就直接用 MPI_Comm_rank,结果程序直接 abort 或返回随机值。OpenMPI 不会帮你容错,它只按规范行事:进程启动后第一件事必须是 MPI_Init,最后一件事是 MPI_Finalize。

常见错误现象:Abort(1098756) on node 0: Fatal error in MPI_Init: Other MPI error, error stack: —— 这基本就是初始化失败或重复初始化。

  • MPI_Init 必须传入 &argc 和 &argv,哪怕你不用命令行参数也要保留这两个变量(OpenMPI 会从中解析 -np、--host 等)
  • 不要在子线程里调用 MPI_Init;MPI 进程模型是“一个进程一个 MPI 实例”,多线程需显式启用 MPI_THREAD_MULTIPLE(且性能开销大,一般不推荐)
  • 如果用 C++ 封装类,别把 MPI_Init 塞进构造函数——对象可能被复制、移动,导致多次隐式调用

mpi_comm_rank() 和 mpi_comm_size() 返回的是当前进程的局部视图

这两个函数不跨机器通信,只是从本地 MPI 运行时缓存里读两个整数。所以它们快、安全,但容易误以为“能拿到全局状态”。实际它们只反映当前 MPI_COMM_WORLD(或你传入的 communicator)在本进程眼里的编号和总数。

使用场景:绝大多数并行任务靠它分片,比如把数组长度 N 均分给 size 个进程,每个进程算 N / size 段,再用 rank 算偏移量。

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

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 若用 MPI_Comm_split 创建了子通信器,MPI_Comm_rank 返回的是该子组内的 rank,不是 MPI_COMM_WORLD 中的原始 rank
  • MPI_Comm_size 返回的不是物理机器数,而是启动时指定的进程总数(mpirun -np 16 就是 16);同一台机器上跑 8 个进程,size 仍是 8
  • 别用 rank == 0 来判断“主节点”就一定在首台机器上——OpenMPI 调度取决于 hostfile 和资源策略,rank 0 可能在任意节点

mpi_send() / mpi_recv() 阻塞行为与匹配规则必须严格对齐

新手最常卡在这儿:发了数据却收不到,或死锁。根本原因不是网络问题,而是 MPI 的匹配机制太严格——MPI_Send 和 MPI_Recv 必须在 **source**、**dest**、**tag**、**communicator** 四个维度完全一致才能配对成功。

常见错误现象:MPI_Recv 一直挂起,strace 显示进程停在 poll();或收到乱码(tag 错位导致读到其他消息)。

  • 发送方 MPI_Send(buf, count, dtype, dest=1, tag=42, comm),接收方必须写 MPI_Recv(buf, count, dtype, source=1, tag=42, comm);source = MPI_ANY_SOURCE 可以,但 tag = MPI_ANY_TAG 要慎用,容易收错
  • 阻塞式调用下,MPI_Send 在对方调用对应 MPI_Recv 前可能缓冲(小消息走 eager 协议),但大消息会卡住等对方 ready——所以别让 rank 0 发、rank 1 收,而 rank 1 先去干别的事没及时 recv
  • 用 MPI_Isend/MPI_Irecv 可避免死锁,但得配 MPI_Wait;更简单的是统一用 MPI_Scatter/MPI_Gather 等集体通信,它们内部已处理好同步

编译和运行时必须用 mpicxx,不能直接用 g++

mpicxx 不是 wrapper 脚本而已,它会自动注入 OpenMPI 的头文件路径、链接库顺序、线程支持标志(如 -pthread)和 ABI 兼容选项。直接用 g++ -lmpi 编译,大概率链接失败或运行时报 undefined symbol: PMPI_Init。

性能影响:mpicxx 默认启用优化(如内联 MPI 函数),还可能根据架构选最佳传输后端(tcp vs ucx vs knem);手动配错会导致回退到低效路径。

  • 检查是否真用了 OpenMPI 的编译器:运行 mpicxx --showme,输出应含 -I/usr/lib/x86_64-linux-gnu/openmpi/include 和 -L/usr/lib/x86_64-linux-gnu/openmpi/lib -lmpi
  • 运行时别漏 mpirun:编译完的二进制不能直接 ./a.out,必须 mpirun -np 4 ./a.out;否则 MPI_Init 会报 “no MPI environment detected”
  • 跨机器运行时,确保所有节点的 OpenMPI 版本一致(至少主版本号相同),否则 MPI_Comm_spawn 或动态进程功能可能静默失败

最容易被忽略的一点:MPI 进程间没有共享内存,所有数据交换都靠显式 send/recv 或集体操作;别试图用全局变量或 std::shared_ptr 传递数据——那只是各自进程里一份独立拷贝。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

1913

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

2634

2023.10.07

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2528

2023.11.20

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

909

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2460

2023.10.25

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

3845

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

1570

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

0

2026.09.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn