mpi矩阵相乘.docVIP

  • 12
  • 0
  • 约5.77千字
  • 约 8页
  • 2017-12-19 发布于河南
  • 举报
mpi矩阵相乘

mpi矩阵相乘 Romi-知行合一 轻轻的风轻轻的梦,轻轻的晨晨昏昏, 淡淡的云淡淡的泪,淡淡的年年岁岁。 一介布衣兮,乐享学习之心得 1.准备 使用MPI做并行计算时,根据程序的具体要求,可按任务进行分配或数据进行分配。根据矩阵乘积的特点,这里按数据进行分配,即每个计算机节点计算不同的数据,由于矩阵数据的特点,这里按行进行数据分块。因为本人使用的是C语言,数组在C语言的表示下行间数据地址是连续的(注:若是Fortran语言,则列是连续的)。 2.mpi程序的框架 mpi程序运行是靠输入dos命令执行的,因此,mpi程序一般都在main函数内,也即程序入口函数中。一般都会有MPI_Init、MPI_Comm_rank、MPI_Comm_size、MPI_Finalize这四个函数。用法如下: 记得要加上mpi.lib 复制代码 1 #include “mpi.h” 2 3 int main(int argc,char *argv[]) 4 { 5 int myid,numprocs; 6 MPI_Init(argc,argv);//MPI Initialize 7 MPI_Comm_rank(MPI_COMM_WORLD,myid);//获得当前进程号 8 MPI_Comm_size(MPI_COMM_WORLD,numprocs);//获得进程个数 9 //mpi计算过程 10 MPI_Finalize();//结束 11 } 复制代码 3.矩阵乘法 矩阵乘法在于对矩阵进行分块,然后交由各进程执行,最后将计算结果传递给主进程。 假设是M*N,计算前,将矩阵N发送给所有从进程,然后将矩阵M分块,将M中数据按行分给各从进程,在从进程中计算M中部分行数据和N的乘积,最后将结果发送给主进程。这里为了方便,有多少进程,就将M分了多少块,除最后一块外的其他数据块大小都相等,最后一块是剩下的数据,大小大于等于其他数据块大小,因为矩阵行数不一定整除进程数。最后一块数据在主进程中计算,其他的在从进程中计算。 定义两个矩阵M和N,N所有进程都需要,M可以只在主进程中定义。其他的变量视主进程和从进程需要按要求定义在合适的位置。 代码如下,包括矩阵初始化,数据传递,矩阵乘积计算等。 复制代码 1 void matgen(float* a,int Width); 2 //产生矩阵 3 void matgen(float* a,int Width) 4 { 5 int i,j; 6 for (i=0;iWidth;i++) 7 { 8 for (j=0;jWidth;j++) 9 { 10 //a[i*Width+j]=(float)rand()/RAND_MAX + (float)rand()/(RAND_MAX*RAND_MAX); //产生矩阵,矩阵中元素0~1 11 a[i*Width+j]=1.00; 12 } 13 } 14 } 15 16 void main(int argc,char *argv[]) 17 { 18 float *M,*N,*P,*buffer,*ans; 19 int Width=1000; 20 int myid,numprocs; 21 MPI_Status status; 22 23 MPI_Init(argc,argv);//MPI Initialize 24 MPI_Comm_rank(MPI_COMM_WORLD,myid);//获得当前进程号 25 MPI_Comm_size(MPI_COMM_WORLD,numprocs);//获得进程个数 26 27 int line = Width/numprocs;//将数据分为(进程数)个块,主进程也要处理数据 28 M = (float*)malloc(sizeof(float)*Width*Width); 29 N = (float*)malloc(sizeof(float)*Width*Width); 30 P = (float*)malloc(sizeof(float)*Width*Width); 31 //缓存大小大于等于要处理的数据大小,大于时只需关注实际数据那部分 32 buffer = (float*)malloc(sizeof(float)*Width*

文档评论(0)

1亿VIP精品文档

相关文档