转载请注明出处。

/*
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. zabbix4.0离线快速编译安装(编译安装方法)

    本博客已整理更新至第二版.更新与2019.4.17 其实这个主要是想试一下离线编译安装的具体步骤,记得要配置好本地yum云,因为我们需要使用yum,yum能帮我们自动解决很多依赖问题.发现最主要的问题 ...

  2. 正则替换HTML里的style属性

    一个网友问: <p class="a" style="font-size: 12pt;  font-family: ""; color: red ...

  3. rocketmq 4.3.2 解决远程不能消费问题,解决未识别到公网IP问题

    1.解决远程不能消费问题 问题描述: nameserver和broker启动后,用tools(命令如下)能发送消息和消费消息,在局域网服务器能发送消息,消费启动后收不到消息通知问题 sh tools. ...

  4. 如何使用Visual Studio Code开发Django项目

    如何获得 Visual Studio Code 访问 http://code.visualstudio.com 下载并安装. 前提条件 安装Python 2.7 及 Python 3.5,Window ...

  5. 错误界面 SQL2008备份集中的数据库备份与现有的数据库不同,错误号码:3154。

    转载来源  https://blog.csdn.net/zaocha321/article/details/8466735 因为我也用这个方法成功了.所以记录下来 错误界面 SQL2005备份集中的数 ...

  6. 安装.net 服务时出现0x80131515错误的解决办法

    使用InstallUtil.exe安装一个用.NET写的Windows服务时,报错了,错误信息如下: Exception occurred while initializing the install ...

  7. glide 长方形图片显示圆角问题

    目前业务是RecyclerView嵌套RecyclerView,子RecyclerView里面显示图片,图片显示方式又分为 多图和单图显示方式(这个是已经调试好的效果) 测试显示结果只有单张图片不显示 ...

  8. python32模拟鼠标和键盘操作

    前言Windows pywin32允许你像vc一样的形式来使用python开发win32应用.代码风格可以类似win32 sdk,也可以类似MFC,由你选择.如果你仍不放弃vc一样的代码过程在pyth ...

  9. Ehcache3.4 XML配置硬盘存储

    最近开始学习使用Ehcache, 3.4的文档实在过于简单,尤其是对于XML配置,例子太少.相对于硬编码,我更偏爱灵活的XML配置,为了实现xml配置,摸索了两天,终于运行成功. ehcache.xm ...

  10. Git世界历险记

    Git-版本管理器 Git  ||属于分散型版本管理系统,是为版本管理而而设计的软件.(Linux的创始人Linus Torvalds在2005年开发了Git的原型程序,在此之前人们大多选用Subve ...