【HNU分布式与云计算系统】MPI实现矩阵乘矩阵运算

这篇具有很好参考价值的文章主要介绍了【HNU分布式与云计算系统】MPI实现矩阵乘矩阵运算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MPI实现矩阵乘矩阵运算

实验环境

操作系统:Ubuntu 20.04

编程语言:C++

实验原理

什么是MPI

MPI是一个跨语言的通讯协议,用于编写并行计算机。支持点对点和广播。MPI是一个信息传递应用程序接口,包括协议和和语义说明,他们指明其如何在各种实现中发挥其特性。MPI的目标是高性能,大规模性,和可移植性。MPI在今天仍为高性能计算的主要模型。

尽管MPI属于OSI参考模型的第五层或者更高,他的实现可能通过传输层的sockets和Transmission Control Protocol (TCP)覆盖大部分的层。大部分的MPI实现由一些指定惯例集(API)组成,可由C,C++,Fortran,或者有此类库的语言比如C#, Java or Python直接调用。MPI优于老式信息传递库是因为他的可移植性和速度。

MPI并行运算的思想

并行编程模式

对等模式—程序的各个部分地位相同,功能和代码基本一致,只是处理的数据或对象不同;主从模式—程序通信进程之间的一种主从或依赖关系。

点对点通信模式

阻塞—发送完成的数据已经拷贝出发送缓冲区,即发送缓冲区可以重新分配使用,阻塞接受的完成意味着接收数据已经拷贝到接收缓冲区,即接收方已可以使用。非阻塞—在必要的硬件支持下,可以实现计算和通信的重叠。4种通信模式:标准通信模式、缓存通信模式、同步通信模式、就绪通信模式。

组通信

一个特定组内所有进程都参加全局的数据处理和通信操作。

功能:通信—组内数据的传输;同步—所有进程在特定的点上取得一致;计算—对给定的数据完成一定的操作。

类型:1)数据移动:广播(mpi bcast) 收集(mpi gather) 散射(mpi scater)组收集(mpi all gather)全交换(all to all);2)聚集:规约(mpi reduce)将组内所有的进程输入 缓冲区中的数据按,定操作OP进行运算,并将起始结果返回到root进程的接收缓冲区扫描(mpi scan)要求每一个进程对排在它前面的进程进行规约操作,结果存入自身的输出缓冲区;3)同步:路障(mpi barrier)实现通信域内所有进程互相同步,它们将处于等待状态,直到所有进程执行它们各自的MPI-BARRIER调用。

MPI调用接口

1.mpi init()初始化MPI执行环境,建立多个MPI进程之间的联系,为后续通信做准备;

2.mpi finalize 结束MPI执行环境;

3.mpi comm rank用来标识各个MPI进程的,给出调用该函数的进程的进程号,返回整型的错误值。两个参数:MPI_Comm类型的通信域,标识参与计算的MPI进程组; &rank返回调用进程中的标识号;

4.mpi comm size用来标识相应进程组中有多少个进程;

5.mpi send(buf,counter,datatype,dest,tag,comm): buf:发送缓冲区的起始地址,可以是数组或结构指针;count:非负整数,发送的数据个数;datatype:发送数据的数据类型;dest:整型,目的的进程号;tag:整型,消息标志;comm:MPI进程组所在的通信域;

含义:向通信域中的dest进程发送数据,数据存放在buf中,类型是datatype,个数是count,这个消息的标志是tag,用以和本进程向同一目的进程发送的其它消息区别开来 [1] 。

6.mpi recv(buf,count,datatype,source,tag,comm,status): source:整型,接收数据的来源,即发送数据进程的进程号; status:MPI_Status结构指针,返回状态信息。

实验设计

问题描述与分析

设有L×M矩阵A和M*N矩阵B相乘,得到结果为LxN的矩阵C。记矩阵A、B、C的第i行第j列的元素为Aij (i=0…L. j=0…M) ,Bij ( i=0…M, j=O…N) ,Cij (i=0…L., j=0 …N)。则:

【HNU分布式与云计算系统】MPI实现矩阵乘矩阵运算

可见Cij只与A和B的第i行相关,而与其他行无关,所以具有并行计算的可行性。

假设有n个进程并行计算,则把矩阵A按行分成n个M/n行的小矩阵,每个小矩阵与B进行矩阵乘法,得到n个MIn行,N列的矩阵,将这些矩阵合并到—起就得到最终的结果。

算法思想

假设开启np个进程

(1). 首先将矩阵A和C按行分为np块;

(2). 进程号为 id 的进程读取A的第 id 个分块和B;

(3). 进程号为 id 的进程求解相应的C的第 id 个分块。

算法实现
#include<iostream>
#include<mpi.h>
#include<math.h>
#include<stdlib.h>

void initMatrixWithRV(float *A, int rows, int cols);
void matMultiplyWithSingleThread(float *A, float *B, float *matResult, int m, int p, int n);

int main(int argc, char** argv)
{
    int m = atoi(argv[1]);//A矩阵的行
    int p = atoi(argv[2]);//A矩阵的列及B矩阵的行
    int n = atoi(argv[3]);//B矩阵的列
    
    float *A, *B, *C;
    float *bA, *bC;  
    double beginTime, endTime;//时间

    int myrank, numprocs;

    MPI_Status status;
  
    MPI_Init(&argc, &argv);  // 并行开始
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs); //并行线程数
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank); //执行顺序
    
    int bm = m / numprocs; //矩阵A按行分块

    bA = new float[bm * p];
    B  = new float[p * n];
    bC = new float[bm * n];

    if(myrank == 0){//生成矩阵
        A = new float[m * p];
        C = new float[m * n];
        
        initMatrixWithRV(A, m, p);
        initMatrixWithRV(B, p, n);
    }
    //开始计时
    beginTime = MPI_Wtime();
    //阻塞其他进程强制等待
    MPI_Barrier(MPI_COMM_WORLD);
    
	//数据分配
    MPI_Scatter(A, bm * p, MPI_FLOAT, bA, bm *p, MPI_FLOAT, 0, MPI_COMM_WORLD);
    MPI_Bcast(B, p * n, MPI_FLOAT, 0, MPI_COMM_WORLD);

    //并行计算
    matMultiplyWithSingleThread(bA, B, bC, bm, p, n);
    
    MPI_Barrier(MPI_COMM_WORLD);
    
    //聚合通信,汇总结果
    MPI_Gather(bC, bm * n, MPI_FLOAT, C, bm * n, MPI_FLOAT, 0, MPI_COMM_WORLD);
  
    //计算多余分块
    int remainRowsStartId = bm * numprocs;
    if(myrank == 0 && remainRowsStartId < m){
        int remainRows = m - remainRowsStartId;
        matMultiplyWithSingleThread(A + remainRowsStartId * p, B, C + remainRowsStartId * n, remainRows, p, n);
    }
    
    //结束计时
    endTime = MPI_Wtime();
    
    delete[] bA;
    delete[] B;
    delete[] bC;
    
    if(myrank == 0){
        delete[] A;
        delete[] C;
        printf("Time: %f\n",endTime-beginTime);
    }
    
    MPI_Finalize(); // 并行结束

    return 0;
}
//初始化矩阵随机生成
void initMatrixWithRV(float *A, int rows, int cols)
{
    srand((unsigned)time(NULL));
    for(int i = 0; i < rows*cols; i++){
        A[i] = (float)rand() / RAND_MAX;
    }
}
//矩阵乘法计算
void matMultiplyWithSingleThread(float *A, float *B, float *matResult, int m, int p, int n)
{
    for(int i=0; i<m; i++){
        for(int j=0; j<n; j++){
            float temp = 0;
            for(int k=0; k<p; k++){
                temp += A[i*p+k] * B[k*n + j];
            }
            matResult[i*n+j] = temp;
        }
    }
}
实验结果

编译前先安装相关指令:sudo apt install mpich

编译指令:mpicxx mpimatrix.cc -o mpimatrix(c程序为mpicc)

执行指令:mpirun -np 4 ./mpimatrix 300 200 400,其中4表示4个进程并行执行,300,200,400分别对应矩阵的相关参数。

执行结果截图:

【HNU分布式与云计算系统】MPI实现矩阵乘矩阵运算

实验结论

从上图的实验结果图中能直观看到随着矩阵的增大运行时间明显增大,因为计算也越来越复杂。同时并行计算的进程数越多时间越快。深刻体会到并行算法的效率和强大。

现实世界中许多现象都表现出并行性,众多问题的求解过程都有并行的可能性,但由于人们习惯用SISD计算模型上的思维,使得编写并行机执行程序变得不合常规,其实,底意识的并行才更接近问题.MPI程序的SPMD编程模式给人们进行并行思维以很好的训练,MPI的通信机制为人们在连网工作站上编写并实现并行程序提供了舞台,使得问题求解变得更加自然.

计算的进程数越多时间越快。深刻体会到并行算法的效率和强大。

现实世界中许多现象都表现出并行性,众多问题的求解过程都有并行的可能性,但由于人们习惯用SISD计算模型上的思维,使得编写并行机执行程序变得不合常规,其实,底意识的并行才更接近问题.MPI程序的SPMD编程模式给人们进行并行思维以很好的训练,MPI的通信机制为人们在连网工作站上编写并实现并行程序提供了舞台,使得问题求解变得更加自然.

多核处理器的普及与并行计算机的发展极大地促进了并行程序设计的发展,越来越多的领域尤其是高性能计算与进程通信等领域都使用了并行计算的实现方法。本文使用并行编程的一种重要工具MP I实现了一种矩阵相乘的并行算法。通过对原问题进行建模分析,找出其计算的并行性,从而使用并行计算的方法解决。并行计算充分利用了处理器资源,能够完成串行计算无法胜任的工作,是未来计算的趋势。

参考博文:https://www.cnblogs.com/fengfu-chris/p/4364142.html文章来源地址https://www.toymoban.com/news/detail-400197.html

到了这里,关于【HNU分布式与云计算系统】MPI实现矩阵乘矩阵运算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 分布式链路追踪与云原生可观测性

    分布式链路追踪与云原生可观测性

    Dapper, a Large-Scale Distributed Systems Tracing Infrastructure - Google Dapper,大规模分布式系统的跟踪系统 大规模分布式系统的跟踪系统:Dapper设计给我们的启示 阿里巴巴鹰眼技术解密 - 周小帆 京东云分布式链路追踪在金融场景的最佳实践 分布式链路追踪在字节跳动的实践 可视化全链路

    2024年04月11日
    浏览(27)
  • 分布式计算实验4 随机信号分析系统

    分布式计算实验4 随机信号分析系统

    利用MOM消息队列技术实现一个分布式随机信号分析系统,具体要求: 1.随机信号产生器微服务每隔100毫秒左右就产生一个正态分布的随机数字,并作为一个消息发布。 2.一个随机信号统计分析微服务,对信号进行如下分析:   (1) 计算过去N个随机信号的均值和方差(N为常量

    2023年04月25日
    浏览(12)
  • Java分布式系统和云计算教程

    Java分布式系统和云计算教程

    Java分布式系统和云计算教程 大规模学习分布式 Java 应用程序、并行编程、分布式计算和云软件架构 课程英文名:Distributed Systems Cloud Computing with Java 此视频教程共4.0小时,中英双语字幕,画质清晰无水印,源码附件全 课程编号:324 百度网盘地址:https://pan.baidu.com/s/1qGJzKMXt

    2024年02月01日
    浏览(11)
  • 分布式系统之P2P,云计算,雾计算

    分布式系统之P2P,云计算,雾计算

    一.P2P cs构架的问题:负载(If too many users access the server/s at the same time, such architecture can suffer from network overload problem.(slow down, long Queues, carsh)同时太多的用户访问服务器就会影响服务器性能) 定义:计算任务由多个节点协同完成,而不是依赖于一个中心节点或服务器。 每个节

    2024年02月02日
    浏览(14)
  • (快手一面)分布式系统是什么?为什么要分布式系统?分布式环境下会有哪些问题?分布式系统是如何实现事务的?

    《分布式系统原理与泛型》中这么定义分布式系统: “ 分布式系统是若干独立计算机的集合, 这些计算机对于用户来说就像单个相关系统 ”, 分布式系统(distributed system)是建立在网络之上的软件系统。 就比如:用户在使用京东这个分布式系统的时候,会感觉是在使用一

    2024年02月08日
    浏览(12)
  • 分布式计算实验3 基于PRC的书籍信息管理系统

    分布式计算实验3 基于PRC的书籍信息管理系统

      利用RPC技术实现一个书籍信息管理系统,具体要求:   1.客户端实现用户交互,服务器端实现书籍信息存储和管理。客户端与服务器端利用RPC机制进行协作。中间件任选。   2.服务器端至少暴露如下RPC接口∶    · bool add(Book b) 添加一个书籍对象。    · Book quer

    2023年04月12日
    浏览(8)
  • 云计算与大数据处理:分布式系统与集群技术

    随着互联网的不断发展,数据的产生和存储量日益庞大,传统的单机计算方式已经无法满足需求。因此,分布式系统和集群技术逐渐成为了解决大数据处理问题的重要手段。 分布式系统是指由多个独立的计算机节点组成的系统,这些节点可以在网络上进行通信和协同工作。集

    2024年04月12日
    浏览(48)
  • 分布式系统第四讲:分布式锁及实现方案

    本文主要介绍分布式锁的概念和分布式锁的设计原则,以及常见的分布式锁的实现方式。

    2024年02月12日
    浏览(14)
  • 计算机组成原理课程论文:分布式存储系统组成和应用

    摘要 分布式存储系统是一种解决大规模数据处理和存储需求的重要技术。本文首先对分布式存储系统进行了概述,包括其定义、优缺点等。然后,详细介绍了分布式存储系统的组成部分,包括存储节点、数据管理软件、网络连接和元数据管理,并结合具体案例进行了说明。接

    2024年02月13日
    浏览(16)
  • 结合云计算的最新技术和现状,介绍云计算基础知识、开源分布式数据库Clickhouse、可视化数据分析工具、分布式链路跟踪系统Pinpoint、数据湖存储系统Pulsar等

    作者:禅与计算机程序设计艺术 2019年,“云计算”将成为“经济全球化”的热门词汇之一,2020年全球云计算市场规模预计达到1万亿美元。中国是继美国、英国之后,成为全球第四大云服务提供商。华为、腾讯、阿里巴巴等互联网巨头纷纷布局云计算领域,各家公司纷纷推出

    2024年02月08日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包