
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<c6x.h>
#include<ti/omp/omp.h>
#define SIZE 1024
#define NITERS 5
double *MatA,*MatB,*MatC;
int main()
{

	int i,j,k,w;
	time_t start,end;
	struct tm *loctime;
	srand(time(NULL));
	MatA=(double *)malloc(SIZE*SIZE*sizeof(double));
	if(MatA==NULL)
	{
		printf("malloc error in A\n");
		exit(1);
	}
	MatB=(double *)malloc(SIZE*SIZE*sizeof(double));
	if(MatB==NULL)
		{
			printf("malloc error in B\n");
			exit(1);
		}
	MatC=(double *)malloc(SIZE*SIZE*sizeof(double));
	if(MatC==NULL)
	{
		printf("malloc error in C\n");
		exit(1);
	}
	/*Initialise Matrices*/
	printf("start\n");
	for(i=0;i<SIZE;i++)
	{
		for(j=0;j<SIZE;j++)
		{
			MatA[i*SIZE+j]=rand()/(RAND_MAX+1.0);
			MatB[i*SIZE+j]=rand()/(RAND_MAX+1.0);
			MatC[i*SIZE+j]=0.0;
		}
	}

	/*printf("Matrix A values are\n");
	for(i=0;i<SIZE;i++)
			{
				for(j=0;j<SIZE;j++)
				{
					printf("%lf ",a[i*SIZE+j]);
				}
				printf("\n");
			}

	printf("Matrix B values are\n");
		for(i=0;i<SIZE;i++)
				{
					for(j=0;j<SIZE;j++)
					{
						printf("%lf ",b[i*SIZE+j]);
					}
					printf("\n");
				}
*/
	for(w=0;w<NITERS;w++)
	{
		start=time(NULL);
			loctime = localtime (&start);
			fputs (asctime (loctime), stdout);
#pragma omp parallel for private(i,j,k)
 		for(i=0;i<SIZE;i++)
		{
		//tid = omp_get_thread_num();
			for(j=0;j<SIZE;j++)
			{
				double sum=0.0;
				for(k=0;k<SIZE;k++)
					{
						sum+=MatA[i*SIZE+k]*MatB[k*SIZE+j];
					}
				MatC[i*SIZE+j]=sum;
			}
		}
 		end=time(NULL);
 			loctime = localtime (&end);
 			fputs (asctime (loctime), stdout);
	printf("iter= %d MatC[3]= %lf\n",w+1,MatC[3]);
	}
	/*for(i=0;i<SIZE;i++)
		{
			for(j=0;j<SIZE;j++)
			{
				printf("%f ",c[i*SIZE+j]);
			}
			printf("\n");
		}*/
	free(MatA);
	free(MatB);
	free(MatC);
}



