#include <stdio.h>
#include <mpi.h>
#include <stdlib.h>
#include <time.h>
#include "timer.h"
#include <cmath>
int number;
#define size 1000
int a[size][size], b[size][size], c[size][size];
void fill ( )
{
srand (time (NULL));
for (int i=0; i<size; i++)
{
for (int j=0; j<size; j++)
{
a[i][j] = rand ()%100;
b[i][j] = rand ()%100;
c[i][j] = 0;
}
}
}void mult (int start, int interval)
{
int i, j, k;
for (i=start; i<start+interval; i++)
{
for (j=0; j<size; j++)
{
c[i][j] = 0;
for (k=0; k<size; k++)
{
c[i][j] += a[i][k]*b[k][j];
}
}
}
}
int main (int argc, char **argv)
{
int i, j, k;
timer watch;
double time;
int interval, remainder;;
int myID, numProcs;
MPI_Status status;
MPI_Init (&argc, &argv); MPI_Comm_size (MPI_COMM_WORLD, &numProcs);
MPI_Comm_rank (MPI_COMM_WORLD, &myID); number = numProcs;
time = 0.0f; interval = size/numProcs;
remainder = size%numProcs; time = 0.0f; for (j=0; j<100; j++)
{ if (myID == 0)
{ fill (); MPI_Bcast (b, size*size, MPI_INT, 0, MPI_COMM_WORLD); for (i=1; i<numProcs; i++)
{
MPI_Send (a+i*interval, interval*size, MPI_INT, i, i, MPI_COMM_WORLD);
}
}
else
{ MPI_Bcast (b, size*size, MPI_INT, 0, MPI_COMM_WORLD); MPI_Recv (a+(myID*interval), interval*size, MPI_INT, 0, myID, MPI_COMM_WORLD, &status);
} MPI_Barrier (MPI_COMM_WORLD); if (myID == 0)
{ watch.start (); mult (myID*interval, interval);
mult (numProcs*interval, remainder); for (i=1; i<numProcs; i++)
{
MPI_Recv (c+(i*interval), interval*size, MPI_INT, i, i, MPI_COMM_WORLD, &status);
}
} else
{ mult (myID*interval, interval); MPI_Send (c+(myID*interval), interval*size, MPI_INT, 0, myID, MPI_COMM_WORLD);
} MPI_Barrier (MPI_COMM_WORLD); if (myID == 0)
{ watch.stop (); if (j > 10 && j < 90)
{
time += watch.read ();
}
}
} if (myID == 0)
printf("%i\t%.3f\n", number, time/80.0f); MPI_Finalize ();
return 0;
}