#include<stdio.h>
#include<stdlib.h>
#include"mpi.h"
#define N 9
#define M 20
int A[M][N];
int B[N];
int BB[N];
int C[M];
int buf[N];
int bufr[N];
int bufc;
int tagB=100;
int main(int argc, char **argv)
{
int id;
int size;
MPI_Status status;
MPI_Init(&argc,&argv);
//MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD,&id);
MPI_Comm_size(MPI_COMM_WORLD,&size);
if(0==id){
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
A[j][i]=i+j;
C[j]=0;
}
B[i]=i;
}
//MPI_Bcast(B,N,MPI_INT,0,MPI_COMM_WORLD);
//hand out B to all procs except 0
printf("test 1,id=%d\n",id);
for(int k=1;k<size;k++)
{
MPI_Send(B,N,MPI_INT,k,tagB,MPI_COMM_WORLD);
}
printf("test 2,id=%d\n",id);
// hand out A to all processors except 0
for(int k=1;k<size;k++){
for(int j=M*(k-1)/(size-1);j<M*k/(size-1);j++){
for(int i=0;i<N;i++){
buf[i]=A[j][i];
}
MPI_Send(buf,N,MPI_INT,k,j,MPI_COMM_WORLD);
}
}
printf("test 3,id=%d\n",id);
}
else{
// receive B
printf("test 4,id=%d\n",id);
MPI_Recv(BB,N,MPI_INT,0,tagB,MPI_COMM_WORLD,&status);
//receive A
printf("test 5,id=%d\n",id);
for(int j=0;j<M;j++){
MPI_Recv(bufr,N,MPI_INT,0,j,MPI_COMM_WORLD,&status);
for(int i=0;i<N;i++)
{
bufc+=bufr[i]*B[i];
}
//MPI_Send(&bufc,1,MPI_INT,0,j,MPI_COMM_WORLD);
printf("%d %d",j,bufc);
}
}
printf("test 6,id=%d\n",id);
MPI_Finalize();
return 0;
}