转载请注明出处。

  1. /*
  2. Function:C++实现并行矩阵乘法;
  3. Time: 19/03/25;
  4. Writer:ZhiHong Cc;
  5. */

运行方法:切到工程文件x64\Debug文件下,打开命令行,输入以下指令:

mpiexec -n N Project.exe NUM

// N代表开启进程数量,NUM代表矩阵规模大小(size)

具体代码:

1.头文件:

  1. #include<stdio.h>
  2. #include <iostream>
  3. #include<math.h>
  4. #include<mpi.h>
  5. #include<time.h>

2.矩阵规模(size)接收,通过C++自带参数argv和argc[ ]:

  1. if (argv == 2)
  2. {
  3. //判断有无矩阵大小size接收,无则初始化为5
  4. size = atoi(argc[1]);
  5. }
  6. else { size = 5; }

3.为各指针变量分配空间

  1. int *a, *b, *c, *pce, *ans;
  2. a = (int*)malloc(sizeof(int)*size*size);//矩阵a
  3. b = (int*)malloc(sizeof(int)*size*size);//矩阵b
  4. c = (int*)malloc(sizeof(int)*size*size);//结果矩阵
  5. pce = (int*)malloc(sizeof(int)*size*line);//接收a矩阵下的块矩阵
  6. ans = (int*)malloc(sizeof(int)*size*line);//暂存次进程的答案

4.定义进程号,进程个数以及块矩阵的行数

  1. int rank, numprocess, line;
  2. line = size / numprocess;//将数据分为(进程数)个块,主进程也要处理数据

5.主进程中进行一系列操作:生成矩阵、分配矩阵、接收次进程答案、拼接答案、计算耗时、最终输出三个矩阵

  1. for (int i = 0; i<size; i++)
  2. {
  3. for (int j = 0; j<size; j++)
  4. {
  5. //随机两个相乘的矩阵a,b
  6. a[i*size + j] = random(10);
  7. b[i*size + j] = random(10);
  8. }
  9. }
  10. for (int i = 1; i<numprocess; i++)
  11. {
  12. //将b矩阵传递给各进程
  13. MPI_Send(b, size*size, MPI_INT, i, 0, MPI_COMM_WORLD);
  14. }
  15. for (int i = 1; i<numprocess; i++)
  16. {
  17. //将a矩阵分成块矩阵,传递给各进程
  18. MPI_Send(a + (i - 1)*line*size, size*line, MPI_INT, i, 1, MPI_COMM_WORLD);
  19. }
  20. for (int k = 1; k<numprocess; k++)
  21. {
  22. MPI_Recv(ans, line*size, MPI_INT, k, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  23. //接收传递结果到数组c
  24. for (int i = 0; i<line; i++)
  25. {
  26. for (int j = 0; j<size; j++)
  27. {
  28. c[((k - 1)*line + i)*size + j] = ans[i*size + j];
  29. }
  30. }
  31. }
  32. for (int i = (numprocess - 1)*line; i<size; i++)
  33. {
  34. //计算分配给主进程的块矩阵
  35. for (int j = 0; j<size; j++)
  36. {
  37. int temp = 0;
  38. for (int k = 0; k<size; k++)
  39.       {
  40. temp += a[i*size + k] * b[k*size + j];
  41.       }
  42. c[i*size + j] = temp;
  43. }
  44. }
  45. for (int i = 0; i < size; i++)
  46. {
  47. //打印显示
  48. for (int j = 0; j<size; j++) { printf("%d ", a[size*i + j]); }printf(" ");
  49. for (int j = 0; j<size; j++) { printf("%d ", b[size*i + j]); }printf(" ");
  50. for (int j = 0; j<size; j++) { printf("%d ", c[size*i + j]); }printf("\n");
  51. }
  52. endtime = MPI_Wtime();
  53. printf("Took %f secodes.\n", endtime - starttime);
  54. }

  

6.次进程中进行此类操作:接收相乘矩阵,计算答案传送给主进程

  1. MPI_Recv(b, size*size, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  2. //接收b矩阵
  3. MPI_Recv(pce, size*line, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  4. //接收块矩阵
  5. for (int i = 0; i<line; i++)
  6. {
  7. //计算块矩阵与b矩阵相乘的结果
  8. for (int j = 0; j<size; j++)
  9. {
  10. int temp = 0;
  11. for (int k = 0; k<size; k++)
  12. temp += pce[i*size + k] * b[k*size + j];
  13. ans[i*size + j] = temp;
  14. }
  15. }
  16. MPI_Send(ans, line*size, MPI_INT, 0, 2, MPI_COMM_WORLD);
  17. //将结果传递到主进程

运行:开启10个进程处理两个12×12的矩阵相乘问题

运行:直接运行,不录入参数

  欢迎大家在评论区提问或者指出问题!

基于MPI的大规模矩阵乘法问题的更多相关文章

  1. 基于MPI的并行计算—矩阵向量乘

    以前没接触过MPI编程,对并行计算也没什么了解.朋友的期末课程作业让我帮忙写一写,哎,实现结果很一般啊.最终也没完整完成任务,惭愧惭愧. 问题大概是利用MPI完成矩阵和向量相乘.输入:Am×n,Bn× ...

  2. MPI编程——分块矩阵乘法(cannon算法)

    https://blog.csdn.net/a429367172/article/details/88933877

  3. 基于OpenMP的矩阵乘法实现及效率提升分析

    一.  矩阵乘法串行实现 例子选择两个1024*1024的矩阵相乘,根据矩阵乘法运算得到运算结果.其中,两个矩阵中的数为double类型,初值由随机数函数产生.代码如下: #include <i ...

  4. 矩阵乘法的MPI并行计算

    1.问题描述 矩阵乘法问题描述如下: 给定矩阵A和B,其中A是m*p大小矩阵,B是p*n大小的矩阵.求C = A*B. 求解这个问题最简单的算法是遍历A的行和B的列,求得C的相应元素,时间复杂度O(m ...

  5. [转]OpenBLAS项目与矩阵乘法优化

    课程内容 OpenBLAS项目介绍 矩阵乘法优化算法 一步步调优实现 以下为公开课完整视频,共64分钟: 以下为公开课内容的文字及 PPT 整理. 雷锋网的朋友们大家好,我是张先轶,今天主要介绍一下我 ...

  6. 【BZOJ-4386】Wycieczki DP + 矩阵乘法

    4386: [POI2015]Wycieczki Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 197  Solved: 49[Submit][Sta ...

  7. OpenGL学习进程(12)第九课:矩阵乘法实现3D变换

    本节是OpenGL学习的第九个课时,下面将详细介绍OpenGL的多种3D变换和如何操作矩阵堆栈.     (1)3D变换: OpenGL中绘制3D世界的空间变换包括:模型变换.视图变换.投影变换和视口 ...

  8. MapReduce实现矩阵乘法

    简单回想一下矩阵乘法: 矩阵乘法要求左矩阵的列数与右矩阵的行数相等.m×n的矩阵A,与n×p的矩阵B相乘,结果为m×p的矩阵C.具体内容能够查看:矩阵乘法. 为了方便描写叙述,先进行如果: 矩阵A的行 ...

  9. MapReduce实现大矩阵乘法

    来自:http://blog.csdn.net/xyilu/article/details/9066973 引言 何 为大矩阵?Excel.SPSS,甚至SAS处理不了或者处理起来非常困难,需要设计巧 ...

随机推荐

  1. AutoCompleteExtender 使用示例

    绑定 KeyValuePair,网上很多例子,没有找到绑定键值对的,msdn上有例子,备忘一下. using FirstElite.Verify.Entity; using System; using ...

  2. JNI学习笔记_Java调用C —— 非Android中使用的方法

    一.学习笔记 1.java源码中的JNI函数本机方法声明必须使用native修饰. 2.相对反编译 Java 的 class 字节码文件来说,反汇编.so动态库来分析程序的逻辑要复杂得多,为了应用的安 ...

  3. 2018-2019-2 网络对抗技术 20165308 Exp4 恶意代码分析

    2018-2019-2 网络对抗技术 20165308 Exp4 恶意代码分析 实验过程 一.系统运行监控 (1)使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP是哪里.运行一 ...

  4. win2008安装并配置zabbix3.4 agent

    agent 下载地址: https://www.zabbix.com/download_agents 下载解压后有2个文件夹,一个是bin,存放32位和64位执行程序,一个是conf目录存放着配置文件 ...

  5. Oracle触发bug(cursor: mutex S),造成数据库服务器CPU接近100%---SQL子游标多版本问题

    问题现象: 项目反馈系统反应非常缓慢,数据库服务器CPU接近100%! INSERT INTO GSPAudit1712(ID,TypeID,CategoryID,DateTime,UserID,Us ...

  6. what is MAC address

    MAC Address:media access control address A media access control address (MAC address) is a unique id ...

  7. 解决spring-boot配置文件使用加密方式保存敏感数据启动报错No decryption for FailsafeTextEncryptor. Did you configure the keystore correctly

    spring-boot配置文件使用加密方式保存敏感数据 application.yml spring: datasource: username: dbuser password: '{cipher} ...

  8. 学习笔记《Java多线程编程实战指南》四

    JAVA线程同步机制 线程同步机制:是一套用于协调线程间的数据访问及活动的机制,该机制用于保障线程安全以及实现这些线程的共同目标.java平台提供的线程同步机制包括锁.volatile关键字.fina ...

  9. g2opy 记录

    20190429 10:31 之前安装了g2opy,g2o也一直没好好学,跑通了slam14讲第13章的单目稠密重建.想要改写成 python版,开始仔细研究g2opy的用法.

  10. 深度优先搜索DFS(一)

      实例一  0/1背包问题:   有n件物品,每件物品的重量为w[i],价值为c[i].现在需要选出若干件物品放入一个容量为V的背包中,使得在选入背包的物品重量和不超过容量V的前提下,让背包中的物品 ...