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

article/2025/9/19 18:27:02

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)。则:

在这里插入图片描述

可见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分别对应矩阵的相关参数。

执行结果截图:

在这里插入图片描述

实验结论

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

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

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

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

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

参考博文:https://www.cnblogs.com/fengfu-chris/p/4364142.html


http://chatgpt.dhexx.cn/article/Rw0Efuvk.shtml

相关文章

视频矩阵的作用及原理

视频矩阵是指通过阵列切换的方法将m路视频信号任意输出至n路监看设备上的电子装置&#xff0c;一般情况下矩阵的输入大于输出即m>n。有一些视频矩阵也带有音频切换功能&#xff0c;能将视频和音频信号进行同步切换&#xff0c;这种矩阵也叫做视音频矩阵。目前的视频矩阵就其…

spark实现大矩阵运算

目录 一、MapReduce实现大矩阵相乘 二. Spark中分布式矩阵使用 一、MapReduce实现大矩阵相乘 超大矩阵相乘&#xff08;亿级别&#xff09;的MapReduce实现思想详解 地址&#xff1a;https://blog.csdn.net/heyuanhao1989/article/details/50218911 MapReduce实现大矩阵乘…

基于Spark框架的大型分布式矩阵求逆运算实现(二)——大型下三角矩阵求逆运算

基于实际需要&#xff0c;需要对五百万阶的方阵进行求逆运算&#xff0c;但查看Spark&#xff08;v. 2.2.0&#xff09;的官方api并没有此方面的信息&#xff0c;就自己尝试着实现了一个&#xff1b; 先说一下原理&#xff1a; 对于一个可逆矩阵A&#xff0c;必然会得到它的唯…

一文看懂大数据矩阵运算利器-Spark Distributed Matrix

如今是大数据的时代&#xff0c;数据呈指数型增长&#xff0c;那么如何利用这些数据&#xff1f;离不开大数据计算&#xff0c;今天小普给大家介绍的是&#xff1a;Spark的分布式计算框架&#xff0c;它能很好地适配大数据场景下的计算任务。 【相似度计算】是金融领域或商品推…

紧跟时代步伐,朗强HDMI分布式矩阵可以通过手机来控制

近年来&#xff0c;随着AV与IT不断的深入融合&#xff0c;分布式技术成为信号处理行业的一大热点。朗强科技作为音视频信号行业领导者&#xff0c;一直以来不断加大研发力度&#xff0c;不断推出引领市场潮流的产品。现隆重推出一款集大屏拼接、显示控制功能于一体的分布式矩阵…

朗强:紧跟时代步伐!HDMI分布式矩阵可以通过手机来控制!

近年来&#xff0c;随着AV与IT不断的深入融合&#xff0c;分布式技术成为信号处理行业的一大热点。朗强科技作为音视频信号行业领导者&#xff0c;一直以来不断加大研发力度&#xff0c;不断推出引领市场潮流的产品。现隆重推出一款集大屏拼接、显示控制功能于一体的分布式矩阵…

编码分布式矩阵乘法(Coded Distributed Matrix Multiplication, CDMM)问题简单介绍

许多现代分布式计算框架都会遇到大规模分布式矩阵乘法问题&#xff0c;即计算两个大规模矩阵和的乘积&#xff0c;如MapReduce、Spark。由于分布式计算系统会出现的无法预测的时延&#xff0c;主节点&#xff08;master node&#xff09;必须等到最慢的工作节点(worker node)完…

手把手推导分布式矩阵乘的最优并行策略

作者&#xff5c;郭冉、李一鹏、柳俊丞、袁进辉 常用深度学习框架的自动并行机制还不够完善&#xff0c;还需要用户根据经验来配置并行方式&#xff0c;这给开发者带来了不小的智力负担。因此&#xff0c;实现自动最优并行就成为一个有趣的课题。 矩阵乘是深度学习最常用的底层…

CAP原理应用与分布式矩阵

CAP原理是描述一致性&#xff0c;可用性&#xff0c;和分区兼容性的理论&#xff0c;但这个原理用在实际情况下时往往让人很困惑。什么样的情况适用于这样的原理&#xff1f;有哪些先决条件&#xff1f;如何创建一个同时满足一致性和可用性&#xff0c;分区兼容性的分布式系统&…

【Scala-spark.mlib】分布式矩阵——分布式计算的基石与利器

分布式矩阵 1. mlib.linalg.distributed包2. DistributedMatrix特质3. BlockMatrix类4. CoordinateMatrix类5. IndexedRowMatrix类6. RowMatrix类7. 小结 1. mlib.linalg.distributed包 矩阵计算是很多科学计算的重要步骤&#xff0c;而分布式矩阵存储则是分布式计算的基础。根…

Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)...

不多说&#xff0c;直接上干货&#xff01; Distributed matrix &#xff1a; 分布式矩阵  一般能采用分布式矩阵&#xff0c;说明这数据存储下来&#xff0c;量还是有一定的。在Spark Mllib里&#xff0c;提供了四种分布式矩阵存储形式&#xff0c;均由支持长整形的行列数和…

Shiro权限管理详解(授权和注解开发)【面试点】

Shiro权限管理详解 1. 权限管理1.1什么是权限管理1.2用户身份认证1.2.1 概念1.2.2 用户名密码身份认证流程1.2.3 关键对象 1.3 授权1.3.1 概念 1.3.2 授权流程1.3.3 关键对象1.3.4 权限模型1.3.5 权限分配1.3.6 权限控制1.3.6.1 基于角色的访问控制 1. 权限管理 1.1什么是权限…

Shiro权限管理之自定义Realm

文章目录 1. SpringBoot集成shiro快速入门1. shiro 用户认证2. shiro用户授权 2. SpringBoot 使用IniRealm进行认证授权3. Spring Boot 使用 JdbcRealm 进行认证授权1. 数据库驱动2. 数据库表结构3. 创建 testJdbcRealm方法4. 更改数据库表名 4. Spring Boot 使用自定义 Realm …

权限管理框架Shiro简介

Shiro 1、shiro简介 shiro是一个强大易用的java安全框架&#xff0c;可以帮助我们完成&#xff1a;身份认证、授权、加密、会话管理、与web集成、缓存等。 包括了三个核心组件&#xff1a;Subject、SecurityManage和Realm 外部架构 内部架构 authentication&#xff08;认证…

Java shiro权限管理框架视频教程

shiro权限管理框架视频教程 中级 共14课 权限系统在任何一个系统中都存在&#xff0c;随着分布式系统的大行其道&#xff0c;权限系统也趋向服务化&#xff0c;对于一个高级工程师来说&#xff0c;权限系统的设计是必不可少需要掌握的技术栈。 课程简介 权限系统在任何一个…

【Shiro权限管理】一、简介

一、简介 Apache Shiro 是Java 的一个安全框架。Shiro 可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在JavaSE 环境&#xff0c;也可以用在JavaEE 环境。Shiro 可以帮助我们完成&#xff1a;认证、授权、加密、会话管理、与Web 集成、缓存等。 官网地址&#xf…

SSM集成shiro权限管理

这几天在学习了shiro权限管理框架&#xff0c;在刚开始的时候学的时候因为这个配置问题困扰了我很长时间&#xff0c;所以在这篇文章我整合了自己用SSM搭建shiro权限框架的过程。 1.配置 1.1jar包 在项目配置开始前需要先导入shiro的相关jar包&#xff0c;下载地址&#xff1a…

shiro权限管理的应用

shiro权限管理的应用 官网&#xff1a;http://shiro.apache.org 一&#xff0c; 什么是权限管理&#xff1a; 对系统中的资源进行权限配置 &#xff0c; 对资源的一种保护 &#xff1b; 一般需要进过两个步骤&#xff1a; 身份认证- 授权 - 资源访问&#xff1b; 1.1 身份认证&…

shiro权限管理框架简介(一)

一&#xff1a;什么是shiro? shiro是apache的一个开源框架&#xff0c;是一个权限管理的框架&#xff0c;实现 用户认证、用户授权。 spring中有spring security (原名Acegi)&#xff0c;是一个权限框架&#xff0c;它和spring依赖过于紧密&#xff0c;没有shiro使用简单。 s…

shiro权限管理框架学习

一、权限框架简介 基本上涉及到用户参与的系统都要进行权限管理&#xff0c;权限管理属于系统安全的范畴&#xff0c;权限管理实现对用户访问系统的控制&#xff0c;按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。权限管理包括用户身份认证和授权两…