一、实验环境搭建

本次MPI集群环境是在电脑中安装mpi的sdk和应用程序后在visual studio 2022 上配置MPI环境。

  • VC++目录---》包含目录---》添加MPI的include目录

  • VC++目录---》库目录---》添加MPI的x64目录

  • VC++目录---》预编译器---》输入“MPICH_SKIP_MPICXX”点击确认。

  • VC++目录---》代码生成---》运行库选择“多线程调试(/MTd)”。

  • 链接器---》输入---》x64里面三个文件的名字。

  • 完成以上配置之后就点击生成解决方案即可。

二、MPI程序代码

#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>` // 计算从start到end的和
long long sum(int start, int end) {
long long result = 0;
for (int i = start; i <= end; ++i) {
result += i;
}
return result;
} int main(int argc, char* argv[]) {
int rank, size;
long long total_sum = 0;
int start, end;
double start_time, end_time; MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank); //通信域,一般为 MPI_COMM_WORLD返回执行当前代码的进程号rank
MPI_Comm_size(MPI_COMM_WORLD, &size); //通信域,一般为 MPI_COMM_WORLD返回进程总数size // 计算每个进程的工作范围
int total_numbers = 10000;
int chunk_size = total_numbers / size; //分支大小
int remainder = total_numbers % size; if (rank < remainder) {
// 前remainder个进程多处理一个数
start = rank * (chunk_size + 1) + 1;
end = start + chunk_size;
}
else {
// 其余进程
start = rank * chunk_size + remainder + 1;
end = start + chunk_size - 1;
} // 开始计时
start_time = MPI_Wtime(); // 计算部分和
long long partial_sum = sum(start, end); // 结束计时
end_time = MPI_Wtime();
//在指定的通信器中执行屏障同步,确保所有进程在此点上同步,直到所有进程都到达屏障。
MPI_Barrier(MPI_COMM_WORLD); // 输出每个进程的计算时间和范围
printf("Process %d computed sum from %d to %d in %.6f seconds\n", rank, start, end, end_time - start_time);
//函数 MPI_Reduce(),将通信子内各进程的同一个变量参与规约计算,并向指定的进程输出计算结果
// 将部分和汇总到进程0
MPI_Reduce(&partial_sum, &total_sum, 1, MPI_LONG_LONG, MPI_SUM, 0, MPI_COMM_WORLD); // 进程0输出总和
if (rank == 0) {
printf("Total sum from 1 to %d is %lld\n", total_numbers, total_sum);
printf("Number of processes used: %d\n", size);
} MPI_Finalize();
return 0;
}

集群通信函数:使用MPI_Reduce()函数将每个进程的局部和汇总到进程rank0。

同步函数:使用MPI_Barrier()同步函数,确保所有进程在同一个时间点停留,直到所有进程都到达该点。可以用来确保所有进程在继续执行之前都完成了某个阶段的工作。

时间函数:使用MPI_Wtime()函数,返回一个高精度的时间戳,测量出每个进程的时间间隔。

三、运行结果截图及分析



1.实验结果显示1+2+……10000=50005000,即计算的结果正确。

2.使用MPI_Barrir()函数保证了所有进程在被调用之后才执行,保证了通信进程的同步。

3.MPI通过优化消息传递机制,实现了节点间的高效通信,从而显著提升了并行计算的效率。

操作系统_MPI程序设计的更多相关文章

  1. 操作系统和程序设计语言的API使用的字符编码分析

     1.Java的运行环境中,String是什么编码? 使用java做程序设计语言,字符编码是和jvm相关的,和操作系统无关. java默认的编码是jvm在安装的时候就确定了的,它是根据你的系统的环境确 ...

  2. <<操作系统精髓与设计原理>>读书笔记(一) 并发性:互斥与同步(1)

    <<操作系统精髓与设计原理>>读书笔记(一) 并发性:互斥与同步 并发问题是所有问题的基础,也是操作系统设计的基础.并发包括很多设计问题,其中有进程间通信,资源共享与竞争,多个 ...

  3. Linux Communication Mechanism Summarize

    目录 . Linux通信机制分类简介 . 控制机制 0x1: 竞态条件 0x2: 临界区 . Inter-Process Communication (IPC) mechanisms: 进程间通信机制 ...

  4. Java NIO 入门

    本文主要记录 Java 中  NIO 相关的基础知识点,以及基本的使用方式. 一.回顾传统的 I/O 刚接触 Java 中的 I/O 时,使用的传统的 BIO 的 API.由于 BIO 设计的类实在太 ...

  5. 在Eclipse中开发C/C++项目

    摘要:通过本文你将获得如何在Eclipse平台上开发C/C++项目的总体认识.虽然Eclipse主要被用来开发Java项目,但它的框架使得它很容易实现对其他开发语言的支持.在这篇文章里,你将学会如何使 ...

  6. DOM,API,CSS,href,万方db文章,数据库工程师要求

    DOM,文档对象模型(Document Object Model),是W3C组织推荐的处理可扩展标志语言的标准编程接口. API,应用程序接口 (API:Application Program Int ...

  7. 职位-IT:软件设计师

    ylbtech-职位-IT:软件设计师 软件设计师是指能根据软件开发项目管理和软件工程的要求,按照系统总体设计规格说明书进行软件设计,编写程序设计规格说明书等相应的文档的实用性人才.还能够组织和指导程 ...

  8. 基于嵌入式操作系统VxWorks的多任务并发程序设计(1)――基本概念

    1引言 嵌入式系统定义义为:嵌入到对象体系中的专用计算机系统."嵌入性"."专用性"与"计算机系统"是嵌入式统的三个基本要素,对象系统则是指 ...

  9. Linux操作系统之Shell程序设计

    Shell是种命令解释程序,也可以看作是一种命令语言的解释器. 用户在与Shell交互时所输入的命令行必须符合Shell命令的语法和语义规范,才能够被Shell理解并执行.Shell所使用的这种命令语 ...

  10. 【重学计算机】操作系统D6章:并发程序设计

    1. 并发程序的基本概念 程序顺序性 内部顺序性:CPU严格按照顺序执行指令 外部顺序性:程序员设计程序时往往用顺序设计的思想 顺序程序特性 程序执行的顺序性 计算环境的封闭性: 程序执行时犹如独占资 ...

随机推荐

  1. batch normalization的multi-GPU版本该怎么实现? 【Tensorflow 分布式PS/Worker模式下异步更新的情况】

    最近由于实验室有了个AI计算平台,于是研究了些分布式和单机多GPU的深度学习代码,于是遇到了下面的讨论: https://www.zhihu.com/question/59321480/answer/ ...

  2. python语言版(代码):计算百分数的概率单位

    相关资料: [转载]百分数的概率单位变换--解惑:概率确实没有单位但是数学里面确实有"概率单位"这个词 百分比与概率单位对照表 https://www.docin.com/p-22 ...

  3. 第 358 场周赛 - 力扣(LeetCode)

    第 358 场周赛 - 力扣(LeetCode) 2815. 数组中的最大数对和 - 力扣(LeetCode) 双for遍历即可 class Solution { public: int maxSum ...

  4. 微服务全链路跟踪:grpc集成zipkin

    微服务全链路跟踪:grpc集成zipkin 微服务全链路跟踪:grpc集成jaeger 微服务全链路跟踪:springcloud集成jaeger 微服务全链路跟踪:jaeger集成istio,并兼容u ...

  5. [粉丝问答16]应届生被放鸽子,怒怼HR!找工作和找对象哪个更残酷?

    很多应届生在求职过程中遇到过被放鸽子的情况,但是由于段位不高,资源不够,社会阅历尚浅,很多人都是忍气吐声,但是也不乏有些学生性格刚硬,怒怼的. 比如下面这位学生,竟然直接怼了HR. 0.应届硕士小伙怒 ...

  6. Telegram第三方登录步骤

    网上看到的不多,简单做个记录,本文主要对下面的文章做补充 Telegram(电报)授权登录(web)第三方 整体步骤为: 找 botFather 创建机器人 给机器人设置域名白名单,用于设置回调地址, ...

  7. Python开发中,SQLAlchemy 的同步操作和异步操作封装,以及常规CRUD的处理。

    在我们使用Python来和数据库打交道中,SQLAlchemy是一个非常不错的ORM工具,通过它我们可以很好的实现多种数据库的统一模型接入,而且它提供了非常多的特性,通过结合不同的数据库驱动,我们可以 ...

  8. 如何将png转为svg

    如何将png转为svg如图所示. 工具/原料 Inkscape 方法/步骤 1 打开Inkscape,"文件-打开"如图. 2  打开你需要转化的png图片.如图所示. 3 打开你 ...

  9. 使用 SpanMetrics Connector 将 OpenTelemetry 跟踪转换为指标

    原文:https://last9.io/blog/convert-opentelemetry-traces-to-metrics-using-spanconnector/ 如果您已经实施了跟踪但缺乏强 ...

  10. spring boot使用多数据源体验

    小白是一名.net程序员,之前小白介绍了过了自己的博客系统http://www.ttblog.site/,用.net写厌了,所以想学下java尝尝鲜,于是小白准备用spring boot来实现一个博客 ...