【MPI】矩阵向量乘法
输入作乘法的次数K
然后输入矩阵和向量的维度n
然后输入一个n维向量
然后输入K个n阶方阵
程序会给出该向量连续与此K个方阵做乘法后的结果
主要用了MPI_Gather, MPI_Allgather, MPI_Bcast, MPI_Scatter 等
注意printf在终端中打印的时机会很玄学 往往会在程序完全执行完毕之后才会打印
注意 本程序将矩阵的所有行划分成一些段,分别分配给各个进程 仍然没有处理进程数无法整除维度n的情况
typedef long long __int64;
#include "mpi.h"
#include <cstdio>
#include <cmath>
using namespace std;
int main(int argc, char* argv[]){
int my_rank=0, comm_sz=0, local_int=0, total_int=0;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
int n,zongci;
int* x;
if(my_rank==0){
scanf("%d%d",&zongci,&n);
}
MPI_Bcast(&zongci,1,MPI_INT,0,MPI_COMM_WORLD);
MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);
x=new int[n];
if(my_rank==0){
for(int i=0;i<n;++i){
scanf("%d",&x[i]);
}
}
MPI_Bcast(x,n,MPI_INT,0,MPI_COMM_WORLD);
if(my_rank==0){
printf("第0次与%d*%d矩阵相乘后的x向量:\n",n,n);
for(int i=0;i<n;++i){
printf("%d\n",x[i]);
}
puts("");
}
for(int ci=1;ci<=zongci;++ci){
int* local_A=new int[n*n/comm_sz];
int* A=new int[n*n];
if(my_rank==0){
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
scanf("%d",&A[i*n+j]);
}
}
MPI_Scatter(A,n*n/comm_sz,MPI_INT,local_A,n*n/comm_sz,MPI_INT,0,MPI_COMM_WORLD);
delete[] A;
}
else{
MPI_Scatter(A,n*n/comm_sz,MPI_INT,local_A,n*n/comm_sz,MPI_INT,0,MPI_COMM_WORLD);
}
int* local_x=new int[n/comm_sz];
for(int i=0;i<n/comm_sz;++i){
local_x[i]=0;
for(int j=0;j<n;++j){
local_x[i]+=local_A[i*n+j]*x[j];
}
}
if(ci<zongci){
MPI_Allgather(local_x,n/comm_sz,MPI_INT,x,n/comm_sz,MPI_INT,MPI_COMM_WORLD);
}
else{
MPI_Gather(local_x,n/comm_sz,MPI_INT,x,n/comm_sz,MPI_INT,0,MPI_COMM_WORLD);
}
if(my_rank==0){
printf("第%d次与%d*%d矩阵相乘后的x向量:\n",ci,n,n);
for(int i=0;i<n;++i){
printf("%d\n",x[i]);
}
puts("");
}
delete[] local_x;
}
delete[] x;
MPI_Finalize();
return 0;
}
【MPI】矩阵向量乘法的更多相关文章
- Matlab:Toeplitz矩阵-向量乘法的快速傅里叶(FFT)算法
一.$\tt Toeplitz$矩阵与循环($\tt Circulant$)矩阵 定义 为$n\times n$阶循环矩阵. 定义 $T_n(i,j)=t_{j-i} $ 为$n\times n$ ...
- MPI学习笔记(二):矩阵相乘的两种实现方法
mpi矩阵乘法(C=αAB+βC) 最近领导让把之前安装的软件lapack.blas里的dgemm运算提取出来独立作为一套程序,然后把这段程序改为并行的,并测试一下进程规模扩展到128时的并行效率. ...
- MPI学习笔记(三):矩阵相乘的分块并行(行列划分法)
mpi矩阵乘法:C=αAB+βC 一.主从模式的行列划分并行法 1.实现方法 将可用于计算的进程数comm_sz分解为a*b,然后将矩阵A全体行划分为a个部分,将矩阵B全体列划分为b个部分,从而将整个 ...
- 【并行计算】用MPI进行分布式内存编程(二)
通过上一篇中,知道了基本的MPI编写并行程序,最后的例子中,让使用0号进程做全局的求和的所有工作,而其他的进程却都不工作,这种方式也许是某种特定情况下的方案,但明显不是最好的方案.举个例子,如果我们让 ...
- 1.2 eigen中矩阵和向量的运算
1.2 矩阵和向量的运算 1.介绍 eigen给矩阵和向量的算术运算提供重载的c++算术运算符例如+,-,*或这一些点乘dot(),叉乘cross()等等.对于矩阵类(矩阵和向量,之后统称为矩阵 类) ...
- sparkmllib矩阵向量
Spark MLlib底层的向量.矩阵运算使用了Breeze库,Breeze库提供了Vector/Matrix的实现以及相应计算的接口(Linalg).但是在MLlib里面同时也提供了Vector和L ...
- Linux系统下C语言如何调用scalapack中的函数
在并行计算中经常需要调用scalapck(并行化的lapack)函数库里面的函数进行编程,这里简单介绍在C语言如何调用scalapck中的矩阵向量乘的函数. 注意:scalapack中的函数是用for ...
- Breeze库API总结(Spark线性代数库)(转载)
导入 import breeze.linalg._ import breeze.numerics._ Spark Mllib底层的向量.矩阵运算使用了Breeze库,Breeze库提供了Vector/ ...
- 斯坦福第三课:线性代数回顾(Linear Algebra Review)
3.1 矩阵和向量 3.2 加法和标量乘法 3.3 矩阵向量乘法 3.4 矩阵乘法 3.5 矩阵乘法的性质 3.6 逆.转置 3.1 矩阵和向量 如图:这个是 4×2 矩阵,即 4 行 ...
随机推荐
- js刷题:leecode 25
原题:https://leetcode.com/problems/reverse-nodes-in-k-group/ 题意就是给你一个有序链表.如1->2->3->4->5,还 ...
- 【译】Linux提权基础
英文原文: Basic Linux Privilege Escalation 在开始之前,我想指出 - 我不是专家. 据我所知,在这个巨大的领域没有一个“魔法”的答案. 这只是我的发现,写出来,共享而 ...
- 深入理解Spring系列之七:web应用自动装配Spring配置
转载 https://mp.weixin.qq.com/s/Lf4akWFmcyn9ZVGUYNi0Lw 在<深入理解Spring系列之一:开篇>的示例代码中使用如下方式去加载Spring ...
- Aragorn's Story 树链剖分+线段树 && 树链剖分+树状数组
Aragorn's Story 来源:http://www.fjutacm.com/Problem.jsp?pid=2710来源:http://acm.hdu.edu.cn/showproblem.p ...
- Spring 控制台运行及RestTemplate实现Eurka负载均衡
spring使用控制台运行方式 spring.main.web-application-type=none新老版本的配置有点差异 Maven的modules只是实现了一个顺序编译,一次多个项目一起生成 ...
- Java Web 远程调试
Java Web 远程 调试 Tomcat 下载压缩版服务器 环境:Tomcat.Eclipse,做远程调试我们并不需要其他特殊插件 1.配置Tomcat/bin/startup.bat 在前面增加代 ...
- C/C++——C语言跳出多重循环方法
c语言的break语句只能跳出离它最近的一层循环,但是我们有时候需要跳出多层循环,以下有几种跳出多重循环的方法: 1. 使用goto ; i < MAX1; i++) { ; j < MA ...
- web项目更改文件后缀,隐藏编程语言
从Java EE5.0开始,<servlet-mapping>标签就可以配置多个<url-pattern>.例如可以同时将urlServlet配置一下多个映射方式: <s ...
- /bin、/sbin、/usr/bin、/usr/sbin目录Linux执行文档的区别
/bin./sbin./usr/bin./usr/sbin目录的区别 在linux下我们经常用到的四个应用程序的目录是/bin./sbin./usr/bin./usr/sbin .而四者存放的文件 ...
- error: expected expression before ‘struct
Linux C/C++编程时常会遇到“error: expected expression before ‘struct’”错误,此错误一般是由未定义的宏(宏里套宏)或参量引起,导致编译器判断当前语句 ...