利用MPI计算矩阵相乘的简单算法_第1页
利用MPI计算矩阵相乘的简单算法_第2页
利用MPI计算矩阵相乘的简单算法_第3页
利用MPI计算矩阵相乘的简单算法_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、利用MPICH2计算矩阵相乘的简单算法ysni HYPERLINK mailto:clevervsnignKHclevervsnignKHMPICH2是用来进行并行运算的平台,而对矩阵算浓的分解应该是并行运算应用中很常见的。今天在这里就用MPICH2写一个矩阵乘法的并行计算程序来学习一下MPICH2的使用。首先要复习一下矩阵乘法的算法,我们在线性代数里都学过。假设矩阵A为m行,k列。m=4,k=3。B是k行,n列,k=3,n=2,计算一个矩阵与列数据,或者叫做一个向量vector的乘积,结果矩阵C应当是m行,n列。A:1,2,34,5,67,8,98亿6B:5,43,2A,B,C都按照行主序表

2、示。即A(0,0尸1以0,1尸2,织0,3尸3。x=0女UC(l,0尸AU,0hB(0+A(1,1)xB(1,0)+AU,2)xE(2,0尸4x5+5x3+6x1=41。C:14,841,2668,4467,46那如何将这个算法进行分解,分配到参与计算的各进程上去呢?简单的做法是可以将矩阵A进行划分,每个计算进程分配若干行,每次与E的一列数据计算的时候分别计算其进程所分配的行与E的这一列相乘的结果。比如有两个进程计算,分别为进程1和进程2。1分配A的0,和2行,2分配A的1和3行,与E的0列计算的时候,1进程将只计算得到C的一列的0和2位置两个数据,而2进程则算得1和3位置的数据。两个进程个子

3、计算完成相应位置的数据后组合起来就是C的一列结果数据。在此,我使用MPI构建一种主-从(imsteir-sbve)模式的程序,也就是有一个进程是主进程,负贵分发A矩阵的数据,并收集从进程的计算结果,将这些结果合并为最终的结呆数据。这样整个程序需要一个主进程和若干个从进程,也就是至少要两个进程。主进程的代码如下:/主进程intmaster()intmyid;/intnumprocs;/MPI_Statusstatus;/获取当前进程的进程编号,保存在myid中MPI_Comm_rank(MPI_COMM_WORLDz&myid);/彘当前进程的进程直数,祁存在numprocs中MPI_Comm_

4、size(MPI_COMM_WORLD,&numprocs);intconstM(4)ZK(3),N(2);/结果矩阵CintCM*N;intVM;/将结果矩阵各元素初始化为0for(inti=0;iM*N;i+)Ci=0;)/C矩阵共N列数据for(inti=0;iN;i+)&status);/从各从进程接受数据for(intj=l;jnumprocs;j+)MPI_Recv(V,M,MPI_INT,j,izMPI_COMM_WORLD,/届从进程的部分数藏合成完整的一个向量for(intij=O;ijM;ij+)Cij*N+i=Cij*N+i+Vij;)/打卬结果for(inti=0;iM

5、;i+)for(intj=0;jN;j+)coutCi*N+jntn;coutendl;)return0;)从进程代码:/从进程intslave()intmyid;/intnumprocs;/MPI_Statusstatus;/获取当前进程的进程编号,保存在myid中MPI_Comm_rank(MPI_COMM_WORLD,&myid);/彘当前进程的进程直数,祁存在numprocs中MPI_Comm_size(MPI_COMM_WORLD,&numprocs);intconstM(4)ZK(3),N(2);vectorindexes;intVM;intAM*K=1/2/3/4,5z6/7z8

6、/9/8z7/6;intBK*N=5Z4,3,2,1,0;/计算本进程分配A矩阵中哪些行,保存在indexes中/比如2个从进程,A是4行数据,id为1的从进程分配的是0和2行for(inti=myid-l;iM;i+=numprocs-l)indexespush_back(i);/依次计算B的N列数据for(inti=0;iN;i+)/将保存列数据的向量V各元素初始化为0for(intj=0;j0)for(intj=0;jindexessize();j+)for(intij=0;ijK;ij+)Vindexesj+=Aindexesj*K+ij*Bij*N+i;MPI-SencKV,M,MP

7、I_INTZ0,izMPI_COMM_WORLD);else/发送全0的VMPI_Send(VzMzMPI_INT,0,izMPI_COMM_WORLD);return0;mam函数代码:#undefSEEK_SET#undefSEEK_END#undefSEEK_CUR#include#include#includeusingnamespacestd;intmaster();intslave();intmain(void)intmyid;/intnumprocs;/MPI_Statusstatus;/MPI程序的初始化MPI_Init(NULLzNULL);/顽当前进程的进程编号,保存在my

8、id中MPI_Comm_rank(MPI_COMM_WORLD,&myid);/戀当前进程的进程直数,祁存在numprocs中MPI_Comm_size(MPI_COMM_WORLD,&numprocs);/如果进程数小于2个,则退出程序if(numprocs2)coutnTooFewProcesses!nendl;MPI_Abort(MPI_COMM_WORLDZ99);)if(myid=0)/id是0的进程作为主进程master();)else/id是非0的进程作为从进程slave();/MPI程序释放资源MPI_Finalize();returnEXIT_SUCCESS;)以上算法是按照行划分A矩阵,也可以按照A的列来分配矩阵。算法如下:将第一列中的所有元素与向量中的第一个元素相乘,第二列的元素与向量中的第二个元素相乘,依此类推。采用这种方法,就可以得到一个新的矩阵。然后,将每一行中的所有元素相加,得

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论