#include <stdio.h>
#include "mpi.h"

#define MSIZE 800

int main(int argc, char *argv[])
{
	int rank, nproc, namelen,i,j,k,l;
	int matrix1[MSIZE][MSIZE], matrix2[MSIZE][MSIZE], matrix[MSIZE][MSIZE];
	char processorname[MPI_MAX_PROCESSOR_NAME];
	double starttime = 0.0, endtime = 0.0;

	MPI_Init(&argc,&argv);
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);
	MPI_Comm_size(MPI_COMM_WORLD, &nproc);
	MPI_Get_processor_name(processorname,&namelen);

//	printf("\n Hello, I am process %d of %d on %s", rank,nproc, processorname);
	for(i=0;i<MSIZE;i++){
		for(j=0;j<MSIZE;j++){
			matrix1[i][j] = rand()%100;
			matrix2[i][j] = rand()%100;
			matrix[i][j] = 0;
		}
	}

	printf("\nGenerating Matrix 1.....");
	printf("\nGenerating Matrix 2.....\n");
/*	for(i=0;i<MSIZE;i++){
		for(j=0;j<MSIZE;j++){
			printf("%d ",matrix1[i][j]);
		}
		printf("      ");
		for(j=0;j<MSIZE;j++){	
			printf("%d ",matrix2[i][j]);
		}
	printf("\n");
	}
*/	
	printf("\nMultiplying Matrix 1 and Matrix 2 .....\n");

	starttime = MPI_Wtime();
	for(i=0;i<MSIZE;i++) {
	for(j=0;j<MSIZE;j++) {
	for(k=0;k<MSIZE;k++) {
		matrix[i][j] = matrix[i][j]+(matrix1[i][k] * matrix2[k][j]);
		}
	}
//	printf("%d rows",i+1);
//	printf("\r");
	}
	printf("\n");
/*	for(i=0;i<MSIZE;i++) {
		for(j=0;j<MSIZE;j++) {
			printf(" %d", matrix[i][j]);
		}
		printf("\n");
	}
*/

	endtime = MPI_Wtime();

	printf("\n\n Clock time: %f ",endtime-starttime);

	MPI_Finalize();
	return 0;
	
}
