转载请注明出处。

/*
Function:C++实现并行矩阵乘法;
Time: 19/03/25;
Writer:ZhiHong Cc;
*/

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

mpiexec -n N Project.exe NUM

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

具体代码:

1.头文件:

#include<stdio.h>
#include <iostream>
#include<math.h>
#include<mpi.h>
#include<time.h>

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

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

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

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

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

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

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

for (int i = 0; i<size; i++)
{
for (int j = 0; j<size; j++)
{
//随机两个相乘的矩阵a,b
a[i*size + j] = random(10);
b[i*size + j] = random(10);
}
}
for (int i = 1; i<numprocess; i++)
{
//将b矩阵传递给各进程
MPI_Send(b, size*size, MPI_INT, i, 0, MPI_COMM_WORLD);
}
for (int i = 1; i<numprocess; i++)
{
//将a矩阵分成块矩阵,传递给各进程
MPI_Send(a + (i - 1)*line*size, size*line, MPI_INT, i, 1, MPI_COMM_WORLD);
}
for (int k = 1; k<numprocess; k++)
{
MPI_Recv(ans, line*size, MPI_INT, k, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
//接收传递结果到数组c
for (int i = 0; i<line; i++)
{
for (int j = 0; j<size; j++)
{
c[((k - 1)*line + i)*size + j] = ans[i*size + j];
}
}
}
for (int i = (numprocess - 1)*line; i<size; i++)
{
//计算分配给主进程的块矩阵
for (int j = 0; j<size; j++)
{
int temp = 0;
for (int k = 0; k<size; k++)
      {
temp += a[i*size + k] * b[k*size + j];
      }
c[i*size + j] = temp;
}
}
for (int i = 0; i < size; i++)
{
//打印显示
for (int j = 0; j<size; j++) { printf("%d ", a[size*i + j]); }printf(" ");
for (int j = 0; j<size; j++) { printf("%d ", b[size*i + j]); }printf(" ");
for (int j = 0; j<size; j++) { printf("%d ", c[size*i + j]); }printf("\n");
}
endtime = MPI_Wtime();
printf("Took %f secodes.\n", endtime - starttime);
}

  

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

MPI_Recv(b, size*size, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
//接收b矩阵
MPI_Recv(pce, size*line, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
//接收块矩阵
for (int i = 0; i<line; i++)
{
//计算块矩阵与b矩阵相乘的结果
for (int j = 0; j<size; j++)
{
int temp = 0;
for (int k = 0; k<size; k++)
temp += pce[i*size + k] * b[k*size + j];
ans[i*size + j] = temp;
}
}
MPI_Send(ans, line*size, MPI_INT, 0, 2, MPI_COMM_WORLD);
//将结果传递到主进程

运行:开启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. leetcode中的python学习

    list.extend() list1.extend(list2(or string)) 将list2(or string)的所有元素添加到list1中: list1.append(list2(or ...

  2. 游戏编程模式 Game Programming Patterns (Robert Nystrom 著)

    第1篇 概述 第1章 架构,性能和游戏 (已看) 第2篇 再探设计模式 第2章 命令模式 (已看) 第3章 享元模式 (已看) 第4章 观察者模式 (已看) 第5章 原型模式 (已看) 第6章 单例模 ...

  3. python selenium TouchAction模拟移动端触摸操作(十八)

    最近做移动端H5页面的自动化测试时候,需要模拟一些上拉,下滑的操作,最初考虑使用使用selenium ActionChains来模拟操作,但是ActionChains 只是针对PC端程序鼠标模拟的一系 ...

  4. elasticsearch -- Logstash实现mysql同步数据到elasticsearch

    配置 安装插件由于这里是从mysql同步数据到elasticsearch,所以需要安装jdbc的入插件和elasticsearch的出插件:logstash-input-jdbc.logstash-o ...

  5. 在Vue组件中获取全局的点击事件

    // 定义全局点击函数 Vue.prototype.globalClick = function (callback) { document.getElementById('main').onclic ...

  6. 廖雪峰Java9正则表达式-2正则表达式进阶-3分组匹配

    1.使用括号可以提取字符串 不加括号匹配电话号码 匹配成功后,如何提取想要的字符串? 使用(...)可以分组:"^(\d{3,4})\-(\d{6,8})$" 2.String.m ...

  7. vscode中使用beautify插件格式化vue文件

    1.点击设置,找到beautify.language并在html一栏里加上vue "beautify.language": { "js": { "ty ...

  8. http/https协议

    HTTP 1. 概念 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览 ...

  9. python with as的用法

    With语句是什么? 有一些任务,可能事先需要设置,事后做清理工作.对于这种场景,Python的with语句提供了一种非常方便的处理方式.一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取 ...

  10. eclipse--常见问题

    学习java的都知道这个编辑器,但这个编辑器的有很多功能很多人不知道怎么用,我系统的整理一下我学习过程中遇到的过的问题 1.eclipse如何导入external jar包?        参考:ht ...