矩阵乘法

本实例实现C = AxB

设计模式

采用主从模式,即一个主进程负责收发数据,其余从进程负责计算并反馈结果。

代码

//
// Created by zhangx on 2022/9/15.
//
#include <ctime>
#include "iostream"
#include "mpi.h"
#include "stdio.h"
#include "math.h"
using namespace std;
// A(N,M) P(M,P)
const int N = 4;
const int M = 4;
const int P = 3;//打印矩阵
void disp(double *x,int n,int m){for(int i=0;i<n;i++){for(int j=0;j<m;j++)printf("%10.2f",*(x+i*m+j));puts(" ");}
}
int main(){int rank,numprocs;double A[N][M],B[M][P],C[N][P],buffer[M],buffer2[P];MPI_Status status;MPI_Init(NULL,NULL);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
//    主进程操作if(rank==0){srand(time(0));
//        对矩阵A和B赋值for(int i=0;i<N;i++)for(int j=0;j<M;j++)A[i][j] = rand()%10*1.0,B[i][j] = rand()%10*1.0;
//        广播矩阵Bfor(int i=1;i<numprocs;i++)MPI_Send(B,sizeof(B)/sizeof(double),MPI_DOUBLE,i,0,MPI_COMM_WORLD);puts("matrix A:");disp(&A[0][0],N,M);puts("matrix B:");disp(&B[0][0],M,P);puts(" ");int num = 0; // num代表当前发送的数据是A的第num行while(num<N){ // 当还有数据没有发送完
//            把矩阵A的一行分别发送给其他进程int rest = N-num; // 剩余的行数for(int i=0;i<min(rest,numprocs-1);i++){memcpy(buffer,A[num],sizeof(A[num]));MPI_Send(buffer,sizeof(buffer)/sizeof(double),MPI_DOUBLE,i+1,num,MPI_COMM_WORLD);num++;}}//        接收从其他进程发送的数据for(int i=0;i<N;i++){MPI_Recv(buffer2,sizeof(buffer2)/sizeof(double),MPI_DOUBLE,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status);int source = status.MPI_SOURCE;int tag = status.MPI_TAG; // 用tag来区分第几行数据memcpy(C[tag],buffer2,sizeof(buffer2));}
//        给所有从进程发送终止消息for(int i=1;i<numprocs;i++)MPI_Send(buffer,sizeof(buffer)/sizeof(double),MPI_DOUBLE,i,N+1,MPI_COMM_WORLD);
//        打印结果puts("outputs:");disp(&C[0][0],M,P);}else {//        从进程操作MPI_Recv(B, sizeof(B) / sizeof(double), MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status);printf("%d is alive!\n", rank);while (1) {MPI_Recv(buffer, sizeof(buffer) / sizeof(double), MPI_DOUBLE, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
//            如果接收到tag为N+1的消息,代表进程结束if (status.MPI_TAG == N+1) {printf("%d return successfully!\n", rank);break;}
//        接收到的数据,tag代表第几行for (int i = 0; i < P; i++) {for (int j = 0; j < N; j++) {buffer2[i] += buffer[j] * B[j][i];}}
//        发送数据给0号进程MPI_Send(buffer2, sizeof(buffer2) / sizeof(double), MPI_DOUBLE, 0, status.MPI_TAG, MPI_COMM_WORLD);}}MPI_Finalize();return 0;
}

运行结果

程序的计算结果如下,

octave验算如下,

MPI 矩阵乘法 并行优化相关推荐

  1. 通过矩阵乘法性能优化学习CUDA

    通过矩阵乘法性能优化学习CUDA 概述 GPU Architecture GPU中的几个基本概念 物理概念: 软件概念: cuda内存模型 小结: 补充: CUDA shared memory和线程束 ...

  2. 并行处理 mpi矩阵乘法

    基于MPI并行方法实现矩阵乘法 目录 1. 实验目的 3 2. 实验环境 4 3. 实验内容 4 3.1. 实验题目 4 3.2. 实验过程 5 3.2.1. 集群使用 5 3.2.2. 源码及解析 ...

  3. [学习笔记]矩阵乘法及其优化dp

    1.定义: $c[i][j]=\sum a[i][k]\times b[k][j]$ 所以矩阵乘法有条件,(n*m)*(m*p)=n*p 即第一个矩阵的列数等于第二个矩阵的行数,否则没有意义. 2.结 ...

  4. 矩阵乘法的优化及其在卷积中的应用

    公众号关注 "视学算法" 设为 "星标",DLCV消息即可送达! 作者:黎明灰烬 来源:https://zhuanlan.zhihu.com/p/6695839 ...

  5. 矩阵乘法 递归 优化 c语言,矩阵乘法优化递归式

    序: 在OI比赛中,很多情况下我们可以能通过打表(找规律)或者某些方式发现一个递归式. 例如:f(n) = f(n - 1)+f(n - 2),(斐波那契数列). 通常情况下,我们计算f(n)的时间复 ...

  6. MegEngine| CUDA 矩阵乘法终极优化

    前言 单精度矩阵乘法(SGEMM)几乎是每一位学习 CUDA 的同学绕不开的案例,这个经典的计算密集型案例可以很好地展示 GPU 编程中常用的优化技巧,而能否写出高效率的 SGEMM Kernel , ...

  7. 矩阵乘法——CUDA 优化记录

    CUDA 是 NVIDIA 的 GPGPU 模型,它使用 C 语言为基础,可以直接以大多数人熟悉的 C 语言,写出在显示芯片上执行的程序,而不需要去学习特定的显示芯片的指令或是特殊的结构." ...

  8. c语言mpi矩阵乘法,【MPI并行程序】矩阵乘法

    具体思路为创建矩阵,给每个进程分配矩阵的不同部分,每个进程根据进程号的不同处理矩阵的不同部分,计算完成后将每个进程的数组发送给一个特定的进程,由该进程合成一个完整的矩阵输出出来.问题是不一定每个进程都 ...

  9. 矩阵乘法 | 多线程优化加速

    在此篇文章中,主要介绍矩阵的传统算法O(N3)O(N^3)O(N3)的并行加速实现,包括pthread.openmp.mpich等. 单线程 void singleThread(int **matri ...

最新文章

  1. 图论 ---- F. Useful Edges(不等式移项优化预处理 + 路径和简单路径的区别 + 最短路)
  2. java - 策略模式、状态模式、卫语句,避免多重if-else(转)
  3. excel用vlookup查询的值存在两个相同数值的时候,如何都显示出来?
  4. KVM virtio_net之NAPI机制(十七)
  5. [ARM-assembly]-ARMv8 A64 Quick Reference
  6. [你必须知道的css系列]第一回:丰富的利器:CSS选择符之通配符、类选择符、包含选择符、ID选择符...
  7. php 继承多个接口,PHP接口多继承及tarits实现多继承效果的方法
  8. leetcode刷题:不同路径
  9. Html5游戏开发-145行代码完成一个RPG小Demo
  10. shortest path problem
  11. 解决 此 Flash Player 与您的地区不相容 问题
  12. [War3]Fdf文件详解,简单的UI教程演示 - 魔兽争霸3
  13. qt mysql图形界面_qt数据库界面
  14. 域服务器安全策略应用,ad域服务器组策略命令
  15. 为你的企业建立竞争情报系统
  16. 车载前置摄像头学习笔记 ———— 摄像头输出数据格式(JPEG)
  17. 基于RFID定位技术的室内定位原理--RFID室内定位--新导智能
  18. 1 Go语言开发环境搭建详细教程+go常见bug合集【Go语言教程】
  19. 英文里说话时用的PS什么意思
  20. 关于gp和mysql的两点区别

热门文章

  1. 有一个四分钟的沙漏,一个七分钟的沙漏,怎样测试九分钟的时间
  2. Android实现拨打电话
  3. oracle智能便携投影机,智能投影 篇四:天猫精灵投影仪上手体验,小巧便携+内置电池,李佳琦带货推荐...
  4. @Android程序员今年必看!!拖更了三年带回了一个抖音,虎牙,哔哩哔哩都在用的库|墙裂推荐
  5. python 类和对象 atm_Python实现ATM提款机系统
  6. 通过VIN码查询车型信息接口文档
  7. 【PyTorch】高级神经网络结构
  8. HTML网页设计与制作:电影网站设计——电影泰坦尼克号(4页) HTML+CSS+JavaScript
  9. ubuntu20.10 RK3288 android7.1.2 源码编译遇到的问题解答
  10. 结对开发——返回一个整数数组中最大子数组的和