首页 > 编程语言 >操作系统_MPI程序设计

操作系统_MPI程序设计

时间:2024-10-19 23:20:41浏览次数:10  
标签:操作系统 MPI --- 进程 程序设计 include 目录 函数

一、实验环境搭建

本次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,---,进程,程序设计,include,目录,函数
From: https://www.cnblogs.com/loremmoqi/p/18486724

相关文章

  • 2024-2025-1 学号20241315《计算机基础与程序设计》第四周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计)这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK04这个作业的目标门电路组合电路,逻辑电路冯诺依曼结构CPU,内存,IO管理嵌入式系统,并行结构物理安全作业正文https://www.cn......
  • 2024-2025-1 20241311 《计算机基础与程序设计》第4周学习总结
    2024-2025-120241311《计算机基础与程序设计》第4周学习总结作业信息这个作业属于哪个课程<班级的链接>2024-2025-1-计算机基础与程序设计这个作业要求在哪里<作业要求的链接>2024-2025-1计算机基础与程序设计第一周作业这个作业的目标<写上具体方面>作业正......
  • 基于springboot校园订餐小程序设计与实现(源码+文档+部署讲解等)
    基于SpringBoot的校园订餐小程序的设计与实现具有重要的课题背景。一、校园生活需求背景在校园中,学生和教职工的用餐需求庞大且多样化。传统的食堂就餐方式可能存在排队时间长、选择有限、无法提前预订等问题。而校园订餐小程序的出现,可以为师生提供更加便捷、高效的......
  • 2024-2025-1 20241316 《计算机基础与程序设计》第四周学习总结
    2024-2025-120241316《计算机基础与程序设计》第四周学习总结作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第四周作业这个作业的目标<学习门电路,组合电路,逻辑电路,冯诺依曼结构,CPU,内存,IO管......
  • 2024-2025-1 20241319 《计算机基础与程序设计》第四周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK04这个作业的目标学习门电路,组合电路,逻辑电路,冯诺依曼结构,CPU,内存,IO管理,嵌入式系统,并行结构,物理安全作业正文https://www......
  • 30天自制操作系统(一)启动区
    一、启动区 ORG 0x7C00 JMP entry DB 0x90 DB "HELLOIPL" DW 512 DB 1 DW 1 DB 2 DW 224 DW 2880 DB 0xf0 DW 9 DW 18 DW 2 DD 0 DD 2880 DB 0,0,0x29 DD 0xffffffff DB "HELLO-OS" DB "FAT12" RESB......
  • 操作系统(6) (Named /Unnamed Semaphore信号量详解)
    目录1:信号量的基本概念2:命名信号量的示例代码3.无名信号量(UnnamedSemaphore)背景(Background)示例代码讲解初始化无名信号量线程函数创建线程并等待完成销毁信号量总结4.对比1:信号量的基本概念背景介绍:信号量是一种并发编程中的同步原语,它用于协调多......
  • 谈谈程序设计的一些原则
     程序的世界丰富多彩,如同宇宙中天体系统。按照粒度大小、层次结构、复杂度分为:平台(Platform)、 系统(System)、软件(Software)、工具(Tool)、模块(Module)、类(Class)、函数(Function)和语句(Statement)然而,不管多么复杂的程序,都可以分解成一句句简单的代码。为了达到程序的目标,我们需要遵......
  • 【rCore OS 开源操作系统】Rust 智能指针
    前置知识点何为“智能”在Rust中,“智能指针”是指那些实现了特定智能行为的指针类型。这些智能行为通常包括内存管理、生命周期跟踪以及所有权转移等。常见智能指针BoxBox<T>是Rust中最简单的智能指针类型之一,它用于堆分配的内存。Box<T>允许你在堆上分配类型T......
  • 2024-2025-1 20241407《计算机基础与程序设计》第四周学习总结
    这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第四周作业这个作业的目标学习门电路,组合电路,逻辑电路,冯诺依曼结构,CPU,内存,IO管理,嵌入式系统,并行结构,物理安全作业正文https://www.cnblogs.com/wangyih......