matrix4

//Writed by YaoPu, Oct 10,2016
//if any problem,send email [email protected]
#include"mpi.h"
#include"stdio.h"
#include<stdlib.h>
void matgen(float *a,int Width)
{
int i,j;
for(i=0;i<Width;i++){
for(j=0;j<Width;j++){
a[i*Width+j]=1.00;
}
}
}


int main(int argc,char **argv)
{
float *M,*N,*P,*buffer,*ans;
int Width=1000;
int myid,numprocs;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
int line = Width/numprocs;
M = (float *)malloc(sizeof(float)*Width*Width);
N = (float *)malloc(sizeof(float)*Width*Width);
P = (float *)malloc(sizeof(float)*Width*Width);
buffer = (float *)malloc(sizeof(float)*Width*line);
ans = (float *)malloc(sizeof(float)*Width*line);
if(myid==0)
{
matgen(M,Width);
matgen(N,Width);
for(int i=1;i<numprocs;i++){
MPI_Send(N,Width*Width,MPI_FLOAT,i,0,MPI_COMM_WORLD);
}

for(int m=1;m<numprocs;m++){
MPI_Send(M+(m-1)*line*Width,Width*line,MPI_FLOAT,m,m,MPI_COMM_WORLD);
}

//receive result
for(int k=1;k<numprocs;k++)
{
MPI_Recv(ans,line*Width,MPI_FLOAT,k,3,MPI_COMM_WORLD,&status);
for(int i=0;i<line;i++){
for(int j=0;j<Width;j++){
P[((k-1)*line+i)*Width+j]=ans[i*Width+j];
}
}
}

for(int i=(numprocs-1)*line;i<Width;i++){
for(int j=0;j<Width;j++){
float temp=0.0;
for(int k=0;k<Width;k++)
temp+=M[i*Width+k]*N[k*Width+j];
P[i*Width+j]=temp;
}
}

///test
float sum1=0;
float sum2=0;
for(int i=0;i<Width;i++){
sum1+=M[i];
sum2+=P[600*Width+i];
}
printf("sum1=%f sum2=%f\n",sum1,sum2);
}
else{
MPI_Recv(N,Width*Width,MPI_FLOAT,0,0,MPI_COMM_WORLD,&status);
MPI_Recv(buffer,Width*Width,MPI_FLOAT,0,1,MPI_COMM_WORLD,&status);
for (int i=0;i<line;i++){
for(int j=0;j<Width;j++){
float temp=0.0;
for(int k=0;k<Width;k++)
temp+=buffer[i*Width+k]*N[k*Width+j];
ans[i*Width+j]=temp;
}
}
MPI_Send(ans,line*Width,MPI_FLOAT,0,3,MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章