高性能计算之MPI:第一次MPI并行程序设计练习
第一次MPI并行程序设计练习第一题定积分计算题目要求设计MPI并行程序计算定积分f010xdxf_{0}^{10}\sqrt{x}dxf010​x​dx。解题思路这题非常简单首先我们设定有 n 个进程分任务并行完成这个计算需求。每个进程要计算 m 个小曲边梯形的面积。然后规定除了 0 进程以外的进程把计算的结果发给 0 进程然后再由 0 进程统一把计算的部分结果加起来就是整个定积分的值了怎么计算曲边梯形的面积呢稍微啰嗦一下下假设当前进程的秩是 rank那么这个进程处理的区间的左边界一定是rank * m然后在该进程下每次计算的曲边梯形的高h f((rank * m k) * w w / 2)这个f(x)也就是被积函数这个 w 也就是每个进程处理的区间的每个小曲边梯形的步长也就是人家的底边。每次我们计算小曲边梯形的底边中点对应的高就是 h了然后累积它们即可解题代码#includempi.h#includestdio.h#includestdlib.h#includemath.hdoublef(doublex){returnsqrt(x);// f(x) sqrt(x)}intmain(intargc,char**argv){intrank,size;doubles0.0,t10.0;MPI_Init(argc,argv);MPI_Comm_rank(MPI_COMM_WORLD,rank);MPI_Comm_size(MPI_COMM_WORLD,size);intpro_numsize;intper_num10000,k;doublew(t-s)/(1.0*pro_num*per_num);doublepart_num0.0,x;for(k0;kper_num;k){xs(1.0*rank*per_numk)*ww/2.0;part_numf(x)*w;}if(0!rank){MPI_Send(part_num,1,MPI_DOUBLE,0,rank,MPI_COMM_WORLD);}else{intj0;doubleresultpart_num;doubletemp_res;for(j1;jsize;j){MPI_Recv(temp_res,1,MPI_DOUBLE,j,j,MPI_COMM_WORLD,MPI_STATUSES_IGNORE);resulttemp_res;}printf(The result is : %.3lf\n,result);}MPI_Finalize();return0;}解题结果解题感悟这题还是比较easy的相比课题上那不是人的seidel迭代、超松弛迭代……这个还算非常友好不过需要注意的是这个Linux里头啊编译带有 math.h 的数学库需要在后面加一个参数 -lm 来告知编译器你用了 math 库第二题计算圆周率PI定积分拓展题目要求想办法计算圆周率PI要用MPI并行程序设计解题思路已知PI arctan(1) * 4于是有下列计算PI的公式π4∗f0111x2dx\pi 4 * f_{0}^{1}\frac{1}{1 x^2}dxπ4∗f01​1x21​dx这样就和上面第一题完全一样的啦就不多解释了直接上代码吧解题代码#includempi.h#includestdio.h#includestdlib.hdoublef(doublex){// f(x) 1/(1 x^2)return(1.0/(1x*x));}intmain(intargc,char**argv){intrank,size;doubles0.0,t1.0;MPI_Init(argc,argv);MPI_Comm_rank(MPI_COMM_WORLD,rank);MPI_Comm_size(MPI_COMM_WORLD,size);intpro_numsize;intper_num100000,k;doublew(t-s)/(1.0*pro_num*per_num);doublepart_num0.0,x;for(k0;kper_num;k){xs(1.0*rank*per_numk)*ww/2.0;part_numf(x)*w;}if(0!rank){MPI_Send(part_num,1,MPI_DOUBLE,0,rank,MPI_COMM_WORLD);}else{intj0;doubleresultpart_num;doubletemp_res;for(j1;jsize;j){MPI_Recv(temp_res,1,MPI_DOUBLE,j,j,MPI_COMM_WORLD,MPI_STATUSES_IGNORE);resulttemp_res;}result*4;printf(The result is : %.3lf\n,result);}MPI_Finalize();return0;}解题结果解题感悟本题的做法理应非常多还可以去做级数因为PI cos(-1) ……级数的表示所以还可以分任务并行计算这个级数然后近似得到结果第三题环形乒乓球题目要求乒乓球是一项双人运动要求是A发球随后B接球……如此循环往复要求利用MPI并行程序设计得到两个计算节点或者是同一计算节点下的两个进程并行完成接球与发球做到两个进程双方来回打乒乓球一定要是A发完球B才能接球B发球时A同理解题思路两方发球接球倒是很简单的事情只需要两个进程并行完成消息传递即可但是后面的要求是要A完成发球B才能接球由于程序的运行、内存的分配在不同的两个进程中是相互独立的所以可能出现A一直调度而B比较慢又无法抢占调度出现A连续发球好几次B才接到球这样的情况所以我们用Sleep()的方式处理要求A在发球后立刻进入阻塞队列好让B有机会调度等到B发球的时候同理解题代码#includempi.h#includestdio.h#includeunistd.hintmain(intargc,char**argv){MPI_Init(NULL,NULL);intworld_size;MPI_Comm_size(MPI_COMM_WORLD,world_size);intworld_rank;MPI_Comm_rank(MPI_COMM_WORLD,world_rank);if(2!world_size){fprintf(stderr,error: must have two process in %s \n,argv[0]);MPI_Abort(MPI_COMM_WORLD,1);}intLIMIT10,count0,tag10,tag20;while(countLIMIT){if(tag1tag2)MPI_Barrier(MPI_COMM_WORLD);if(world_rank1){MPI_Recv(count,1,MPI_INT,0,tag2,MPI_COMM_WORLD,MPI_STATUS_IGNORE);tag2;printf(1 process received %d from 0 process\n,count);sleep(1);count;MPI_Send(count,1,MPI_INT,0,tag2,MPI_COMM_WORLD);}else{count;MPI_Send(count,1,MPI_INT,1,tag1,MPI_COMM_WORLD);tag1;MPI_Recv(count,1,MPI_INT,1,tag1,MPI_COMM_WORLD,MPI_STATUS_IGNORE);printf(0 process received %d from 1 process\n,count);sleep(1);}}MPI_Finalize();return0;}解题结果这里我们就可以看到我们做到了每一轮收到的一方都是上一轮发球的一方解题感悟自认为这题我做的很糟糕因为我采用这种强行阻断进程强行让进程进入阻塞队列的Sleep()函数导致了效率非常底下希望各位前辈大佬带带刚刚入门高性能计算的小弟教教我有无高效的做法完成这种来回进程调度

相关新闻

OpenEuler kata_integration 深度解析:Makefile自动化构建系统的工作原理与优化

OpenEuler kata_integration 深度解析:Makefile自动化构建系统的工作原理与优化

OpenEuler kata_integration 深度解析:Makefile自动化构建系统的工作原理与优化 【免费下载链接】kata_integration A tool with useful scripts for building kata-containers related components and initrd image 项目地址: https://gitcode.com/openeuler/kat…

2026/7/4 10:03:55阅读更多 →
分片压缩、分片上传,融云 IM 视频文件高速传输方案

分片压缩、分片上传,融云 IM 视频文件高速传输方案

在 IM 消息管理中,多种类型消息的传输处理是服务可靠性的关键。关注【融云全球互联网通信云】了解更多通常,发送消息前,融云 IM 会将发送的媒体文件上传到默认文件服务器。而在文本、表情、图片、语音、位置、小视频等各种消息中,…

2026/7/4 9:58:55阅读更多 →
“+=” 在 C# 中表示什么意思

“+=” 在 C# 中表示什么意思

C# 中 “” 是什么意思???在 C# 中 "" 有两种运用场合。第一种:用在数值后面作为 “逻辑运算符”,自加变量,如代码所示:第二种:用于指定响应事件时要调用的方法&#xff1…

2026/7/4 9:58:55阅读更多 →
3步快速上手:在Windows电脑上免费使用Switch Joy-Con控制器的完整指南

3步快速上手:在Windows电脑上免费使用Switch Joy-Con控制器的完整指南

3步快速上手:在Windows电脑上免费使用Switch Joy-Con控制器的完整指南 【免费下载链接】JoyCon-Driver A vJoy feeder for the Nintendo Switch JoyCons and Pro Controller 项目地址: https://gitcode.com/gh_mirrors/jo/JoyCon-Driver 想让你的任天堂Switc…

2026/7/4 12:19:18阅读更多 →
遗传算法工程化实战:适应度设计、编码适配与早熟干预

遗传算法工程化实战:适应度设计、编码适配与早熟干预

1. 项目概述:为什么第二部分比第一部分更值得你花时间啃透 “遗传算法入门——第二部分”这个标题乍看平平无奇,像是教科书里被翻烂的章节编号,但如果你真把它当成“续集”或“补充说明”,那大概率会在实操时卡在第3步就放弃。我带…

2026/7/4 12:19:18阅读更多 →
AI教材编写如何降低查重率:方法与工具全解析

AI教材编写如何降低查重率:方法与工具全解析

1. 为什么AI教材编写需要关注查重率?教材编写与其他内容创作最大的区别在于其权威性和原创性要求。传统教材编写过程中,作者需要花费大量时间查阅文献、整理资料,但稍有不慎就可能陷入"抄袭"的灰色地带。而AI辅助编写虽然提高了效率…

2026/7/4 12:19:18阅读更多 →
工业级 C# YOLO 框架设计:采集-推理-UI 全链路解耦架构

工业级 C# YOLO 框架设计:采集-推理-UI 全链路解耦架构

摘要:在工业视觉检测项目中,将相机采集、YOLO 推理与 UI 渲染写在同一个 async void 或 Timer 回调里,是导致产线“偶发卡顿”、“丢帧”和“内存泄漏”的万恶之源。本文摒弃 Demo 级写法,提出一套基于 .NET 8/9 的全链路解耦架构…

2026/7/4 12:19:18阅读更多 →
Spring Boot与MySQL构建高效后端接口全流程指南

Spring Boot与MySQL构建高效后端接口全流程指南

1. 项目概述:从零开始构建后端接口作为一名长期奋战在一线的开发者,我深知后端接口开发的重要性。接口作为前后端交互的桥梁,其质量直接影响整个系统的稳定性和扩展性。本文将带你从零开始,使用IntelliJ IDEA和MySQL构建完整的后端…

2026/7/4 12:19:18阅读更多 →
机器学习模型服务化:稳定性、可观测性与弹性伸缩实战

机器学习模型服务化:稳定性、可观测性与弹性伸缩实战

1. 项目概述:当模型走出Jupyter,真正开始呼吸真实世界空气 “From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题本身就像一句暗号,专为那些在Jupyter里调通了模型、画出了漂亮ROC曲线、却在部署时被生产环境…

2026/7/4 12:14:18阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/3 14:18:39阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/3 14:38:35阅读更多 →
端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

1. 项目概述:当算法工程师走进GTC26展厅,看到的不是芯片,而是“端到端”的呼吸节奏“端到端”这三个字,在GTC’26现场出现的频率,高得像NVLink带宽测试时的峰值曲线——它不再是一个论文里的技术路径选项,而…

2026/7/4 0:02:48阅读更多 →
缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考牙齿缺失是中老年人群中较为常见的口腔问题,不仅会造成咀嚼不便、进食受影响,长期还可能对营养摄入与日常社交带来困扰。义齿是改善缺牙问题的常用方式,目前市面上的义齿种类较多,…

2026/7/4 0:02:48阅读更多 →
STM32F091RC与LTC6904实现高精度方波信号生成

STM32F091RC与LTC6904实现高精度方波信号生成

1. 项目概述:LTC6904与STM32F091RC的精准方波生成方案在嵌入式系统开发中,精确的时钟信号和定时控制往往是项目成败的关键。LTC6904作为一款低功耗、高精度的可编程振荡器芯片,与STM32F091RC这款ARM Cortex-M0内核微控制器的组合,…

2026/7/4 0:02:48阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/4 1:16:56阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/4 2:33:55阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/4 2:33:55阅读更多 →