操作系统_MPI程序设计

news/2024/10/19 23:34:38

一、实验环境搭建

本次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返回执行当前代码的进程号rankMPI_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(),将通信子内各进程的同一个变量参与规约计算,并向指定的进程输出计算结果// 将部分和汇总到进程0MPI_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通过优化消息传递机制,实现了节点间的高效通信,从而显著提升了并行计算的效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/73614.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

session测试

jsp1 <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head><meta charset="UTF-8"><title>session测试</title> </…

704.二分查找

题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4 示例 2:输入: nums = [-…

win11微软拼音输入法变繁体字

0. 设置→时间和语言 1. 时间和语言→语言和区域2. 中文简体→语言选项3. 键盘→微软拼音→键盘选项4. 常规5. 选择字符集→简体中文

泰山学堂选拔游记

泰山学堂选拔游记 前言:由于相关保密协议,所有与选拔试题与详细细节有关的内容将被剔除。 Tips:由于神秘因素,我在中学阶段的各个平台部分文章与笔记已经进行了隐藏。 插曲:等通知大学的经典通知方式 通过笔试后,要加对应取向面试群了解消息,但各个取向过笔试预留加面试…

mongo基本命令(一)

一 前言 环境: win10 mongo6.0.1 记录一些基本的mongo查询命令 二 查询命令 1 进入命令行 进入mongo命令行,我这里是mongo是装在docker里面的 需要先在docker里面启动mongo容器 docker exec -it xxx bash 进入mongo容器,xxx为mongo容器名 mongosh 进入mongo命令行,我安装…

Java21虚拟线程:我的锁去哪儿了?

0 前言 最近的文章中,我们详细介绍了当我们迁移到 Java 21 并将代际 ZGC 作为默认垃圾收集器时,我们的工作负载是如何受益的。虚拟线程是我们在这次迁移中兴奋采用的另一个特性。 对虚拟线程新手,它们被描述为“轻量级线程,大大减少编写、维护和观察高吞吐量并发应用程序的…

ManualResetEventManualResetEventSlim

ManualResetEvent ManualResetEvent有三个重要的方法,分别为:waiteone(),set(),reset(),其含义如下: 1.WaitOne()即等待信号发出,即可往下运行。 2.set()发出信号,让线程方法继续往下运行,并允许其他线程(如有)一并往下运行。 3.reset()重新初始化(即:去掉票据)变为…