之前一直想写一个关于MPI的例子,之后便想起了矩阵相乘,之后便在网上找资料,结果发现有些地方实现不了,于是便自己参考网上例子,踩了各种各样的雷之后于是才有了这次分享 1.MPI并行运算的思想 MPI并行运算通过由用户指定分配进程,来实现多进程的一种思想。MPI(Message-Passing-Interface 消息传递接口)实现并行是进程级别的,通过通信在进程之间进行消息传递。MPI并不是一种新的开发语言,它是一个定义可以被C、C++和Fortran程序调用的函数库。这些函数库里面主要涉及的是两个进程之间通信的函数。MPI可以在Windows和linux环境中都有相应的库,本篇以Windows10作为演示开发环境。 2.配置MPI环境 Windows为了兼容MPI,自己做了一套基于一般个人电脑的MPI实现。如果要安装正真意义上的MPI的话,请直接去www.mpich.org下载,里面根据对应的系统下载相应的版本。 安装 mpi 我的电脑是64位的,所以安装的是 mpi_x64.msi ,默认安在C:\Program Files\Microsoft HPC Pack 2008 R2,在此,为了之后调试代码方便,最好设置一下环境变量:在用户变量PATH中,加入:C:\Program Files\Microsoft HPC Pack 2008 R2\Bin\。

配置mpi 配置目录,即加载Include和Lib库  加载依赖项

3.编译 根据编程员的习俗先从一个helloworld开始

#include "mpi.h"

#include

int main(int argc, char* argv[])

{

int rank, numproces;

int namelen;

char processor_name[MPI_MAX_PROCESSOR_NAME];

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);//获得进程号

MPI_Comm_size(MPI_COMM_WORLD, &numproces);//返回通信子的进程数

MPI_Get_processor_name(processor_name, &namelen);

fprintf(stderr, "hello world! process %d of %d on %s\n", rank, numproces, processor_name);

MPI_Finalize();

return 0;

}

4.mpi 矩阵相乘 接下来便开始我们的主题 实际的思想是使用0进程将矩阵切分成n份分别发送个其他的进程,再有其他的进程计算完成之后再发回0进程。

0进程进行分发,切分,以及整合矩阵。

if (myid == 0) {

int  **N = NULL;

int *buffer3 = nullptr;

cout << "输入你的值" << endl;

cin >> am;

start2 = MPI_Wtime();

//将am的值广播给每一个进程(除了0进程)

for (int i = 0; i < size; i++) {

MPI_Send(&am, 1, MPI_INT, i + 1, 33, MPI_COMM_WORLD);

}

/*

新建矩阵并初始化

*/

srand((unsigned)time(NULL));

buffer3 = (int*)malloc(sizeof(int)*am);

int* M = new int[am*am];

cout << "-------A类矩形------" << endl;

for (int i = 0; i < am; i++) {

for (int j = 0; j < am; j++) {

M[i*am + j] = (rand() % 9) + 1;

cout << M[i*am + j] << " ";

}

cout << endl;

}

N = (int**)malloc(sizeof(int)*am);

for (int i = 0; i < am; i++) {

N[i] = (int*)malloc(sizeof(int)*am);

}

cout << "-------B类矩形------" << endl;

for (int i = 0; i < am; i++) {

for (int j = 0; j < am; j++) {

N[i][j] = (rand() % 9) + 1;

cout << N[i][j] << " ";

}

cout << endl;

}

/*

判断是否采用单线程

*/

if (numprocs

int temp;

int **P = NULL;

P = (int**)malloc(sizeof(int)*am);

for (int i = 0; i < am; i++) {

P[i] = (int*)malloc(sizeof(int)*am);

}

for (int z = 0; z < am; z++) {

for (int i = 0; i < am; i++) {

P[z][i] = 0;

temp = 0;

for (int j = 0; j < am; j++) {

temp = +M[j*am + i] * N[z][j];

}

P[z][i] = temp;

}

}

cout << endl;

cout << "得到的矩阵为" << endl;

for (int i = 0; i < am; i++) {

for (int j = 0; j < am; j++) {

printf("%-8d", P[i][j]);

}

cout << endl;

}

end = MPI_Wtime();

double time = end - start2;

cout << "单进程需要的时间为" << end - start2 << endl;

}

else

{

/*

向各个进程发送信息

*/

for (int i = 0; i < am; i++) {

for (int j = 0; j < am; j++) {

buffer3[j] = N[j][i];

}

MPI_Send(buffer3, am, MPI_INT, i + 1, 11,MPI_COMM_WORLD);

}

for (int i = 0; i < am; i++) {

MPI_Send(&M[0 + 0], am*am, MPI_INT, i + 1, 22, MPI_COMM_WORLD);

}

free(N);

free(buffer3);

/*

回收各个进程的值

*/

int **P = NULL;

P = (int**)malloc(sizeof(int)*am);

for (int i = 0; i < am; i++) {

P[i] = (int*)malloc(sizeof(int)*am);

}

for (int i = 0; i < am; i++) {

MPI_Recv(&(P[i][0]), am, MPI_INT, i + 1, i + 1, MPI_COMM_WORLD, &status);

}

cout << endl;

cout << "得到的矩阵为" << endl;

for (int i = 0; i < am; i++) {

for (int j = 0; j < am; j++) {

//cout << P[i][j] << " ";

printf("%-8d", P[i][j]);

}

cout << endl;

}

end = MPI_Wtime();

double time = end - start2;

cout << "多进程需要的时间为" << end - start2 << endl;

}

}

``

其他进程则负责接收以及计算在发送给0进程

//接受来自0进程的值 if (myid != 0) { MPI_Recv(&am, 1, MPI_INT, 0, 33, MPI_COMM_WORLD, &status); } if (myid != 0 && myid <= am && numprocs>am) { int temp; int buffer2, m; int buffer = new int[amam]; buffer2 = (int)malloc(sizeof(int)am); m = (int)malloc(sizeof(int)am); / 接受来自0进程的数据 / MPI_Recv(buffer2, am, MPI_INT, 0, 11, MPI_COMM_WORLD, &status); MPI_Recv(buffer, amam, MPI_INT, 0, 22, MPI_COMM_WORLD, &status); for (int i = 0; i < am; i++) { m[i] = 0; temp = 0; for (int j = 0; j < am; j++) { temp = +buffer[jam + i] * buffer2[j]; } m[i] = temp; } /* 将得到的数据进行计算并且将其传回0进程 */ MPI_Send(m, am, MPI_INT, 0, myid, MPI_COMM_WORLD); free(buffer); free(buffer2); free(m); } 在这里我也将头部添上

#include

#include

#include

#include"mpi.h"

#include

#include

#pragma comment(lib,"msmpi.lib")

using namespace std;

int am;

int main(int argc, char **argv) {

int numprocs;

int myid, size;

MPI_Status status;

double start1, start2, end;

MPI_Init(&argc, &argv);//MPI Initialize

MPI_Comm_rank(MPI_COMM_WORLD, &myid);//获得当前进程号

MPI_Comm_size(MPI_COMM_WORLD, &numprocs);//获得进程个数

size = numprocs - 1;

尾部添上

MPI_Finalize();

return 0;

}

矩阵乘法 mpi c语言,MPI实现矩阵相乘相关推荐

  1. python 多线程并行 矩阵乘法_python实现简单的并行矩阵乘法

    python实现简单的并行矩阵乘法 python实现简单的并行矩阵乘法 本文采用的矩阵乘法方式是利用一个矩阵的行和二个矩阵的列相乘时不会互相影响.假设A(m,n)表示矩阵的m行,n列.那么C(m,m) ...

  2. 线性代数知识点总结——矩阵乘法、矩阵运算与性质、矩阵微积分

    线性代数知识点总结 1. 基础概念和符号 1.1 基本符号 2.矩阵乘法 2.1 向量-向量乘法 2.2 矩阵-向量乘法 2.3 矩阵-矩阵乘法 3 运算和属性 3.1 单位矩阵和对角矩阵 3.2 转 ...

  3. MATLAB矩阵乘法为什么快,为什么MATLAB在矩阵乘法中如此之快?

    reverse_engi.. 163 这种问题反复出现,应该比Stackoverflow上的"Matlab使用高度优化的库"或"Matlab使用MKL"一次更清 ...

  4. 两个3×3矩阵乘法例题_两个3×3矩阵相乘 三个矩阵相乘从左向右算还是从右算起...

    两个三乘三矩阵相乘怎么算,在线等 设A为m*p的矩阵,B为p*n的矩阵,那么称m*n的矩阵C为矩阵A与B的乘积,记作C=AB ,其中矩阵C中的第i行第j列元素可以表示为: 例如: 扩展资料: 注意事项 ...

  5. [转]如何理解矩阵乘法的规则(两个矩阵相乘法则的推导,从对方程组解方程演化而来)

    [转]如何理解矩阵乘法的规则 转自(http://news.cnblogs.com/n/528288/) 我加入了自己的理解. 作者: 阮一峰 大多数人在高中,或者大学低年级,都上过一门课<线性 ...

  6. python矩阵乘法算法_纯python进行矩阵的相乘运算的方法示例

    本文介绍了纯python进行矩阵的相乘运算的方法示例,分享给大家,具体如下: def matrixMultiply(A, B): # 获取A的行数和列数 A_row, A_col = shape(A) ...

  7. python矩阵乘法 点乘_Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)

    Tensorflow二维.三维.四维矩阵运算(矩阵相乘,点乘,行/列累加) 1. 矩阵相乘 根据矩阵相乘的匹配原则,左乘矩阵的列数要等于右乘矩阵的行数. 在多维(三维.四维)矩阵的相乘中,需要最后两维 ...

  8. 矩阵乘法c语言蓝桥杯,[蓝桥杯][基础练习VIP]矩阵乘法 (C语言代码)

    解题思路: 矩阵的乘法公式: 注意事项: 矩阵的0次幂是单位矩阵哦. 参考代码:#include int main() { int n,m; int a[32][32]={0},b[32][32]={ ...

  9. c语言 4x4矩阵乘法,C中的快速4x4矩阵乘法

    我试图找到一个函数的优化C或汇编实现,该函数将两个4x4矩阵相乘.平台是基于ARM6或ARM7的iPhone或iPod. 目前,我使用的是一种相当标准的方法--只是展开一个小循环. #define O ...

  10. c语言实现矩阵乘法 函数调用,C语言关于矩阵乘法的函数,,

    满意答案 chuan695032 2013.03.12 采纳率:40%    等级:12 已帮助:18780人 童鞋,不知道你是用的什么测试数据,在我的机器上测试了几组数据,结果都是正确的. 重复下我 ...

最新文章

  1. iOS 中socket的总结
  2. 《用Python进行自然语言处理》第7章 从文本提取信息
  3. android SwipeRefreshLayout 增加上拉加载更多
  4. 嘿,是时候重新认识下海淘了
  5. Log4j 2使用教程
  6. 4-希尔排序C实现(递增递减的简单转换)
  7. (数据分析三板斧)第一斧Numpy-第一节:Numpy基本了解
  8. 怎么用shell ssh,然后再exit?
  9. python 函数篇(2)
  10. android逆向学习路线(适合新手)
  11. 【概率论与数理统计】python实验
  12. 正则表达式测试工具 java,正则表达式测试工具RegexTester
  13. 7.6批量下载网易云歌曲
  14. 安装DCOS,关于docker异常引发的调查
  15. STM32(3)——外部中断的使用
  16. 选股策略与技巧 选股策略报告
  17. 刚子扯谈:未完待续的微信5.0
  18. Chino with Equation
  19. 购房新政:减免住房交易税 放宽还迁房上市条件
  20. “墨子号”实现无中继千公里量子保密通信

热门文章

  1. 2021年P气瓶充装模拟考试及P气瓶充装考试试题
  2. 防火墙---翻译地址(NAT)
  3. SM2/RSA证书工具--简单CA实现
  4. 杭电计算机学院研究生校区,杭州电子科技大学研究生在哪个校区
  5. error: invalid operands to binary == (have ‘uid_t’ {aka ‘unsigned int’} and ‘kuid_t’
  6. 小屏幕android电视,神奇!只需一个方法,让电视当作手机屏幕!
  7. 如何查看自己的qq邮箱服务器地址,怎么看自己设置的qq邮箱帐号
  8. 通过搜狐号引流靠谱吗?
  9. [转]王垠的过去和现状
  10. 小不点浏览器 v1.00 官方