Blame src/validation_tests/matrix_multiply.c

Packit 577717
#include <stdio.h>
Packit 577717
Packit 577717
#define NUM_RUNS 3
Packit 577717
Packit 577717
#define MATRIX_SIZE 512
Packit 577717
static double a[MATRIX_SIZE][MATRIX_SIZE];
Packit 577717
static double b[MATRIX_SIZE][MATRIX_SIZE];
Packit 577717
static double c[MATRIX_SIZE][MATRIX_SIZE];
Packit 577717
Packit 577717
long long naive_matrix_multiply_estimated_flops(int quiet) {
Packit 577717
Packit 577717
	long long muls,divs,adds;
Packit 577717
Packit 577717
	/* setup */
Packit 577717
	muls=MATRIX_SIZE*MATRIX_SIZE;
Packit 577717
	divs=MATRIX_SIZE*MATRIX_SIZE;
Packit 577717
	adds=MATRIX_SIZE*MATRIX_SIZE;
Packit 577717
Packit 577717
	/* multiply */
Packit 577717
	muls+=MATRIX_SIZE*MATRIX_SIZE*MATRIX_SIZE;
Packit 577717
	adds+=MATRIX_SIZE*MATRIX_SIZE*MATRIX_SIZE;
Packit 577717
Packit 577717
	/* sum */
Packit 577717
	adds+=MATRIX_SIZE*MATRIX_SIZE;
Packit 577717
Packit 577717
	if (!quiet) {
Packit 577717
		printf("Estimated flops: adds: %lld muls: %lld divs: %lld\n",
Packit 577717
			adds,muls,divs);
Packit 577717
	}
Packit 577717
Packit 577717
	return adds+muls+divs;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
long long naive_matrix_multiply_estimated_loads(int quiet) {
Packit 577717
Packit 577717
	long long loads=0;
Packit 577717
Packit 577717
	/* setup */
Packit 577717
	loads+=0;
Packit 577717
Packit 577717
	/* multiply */
Packit 577717
	loads+=MATRIX_SIZE*MATRIX_SIZE*MATRIX_SIZE*2;
Packit 577717
Packit 577717
	/* sum */
Packit 577717
	loads+=MATRIX_SIZE*MATRIX_SIZE;
Packit 577717
Packit 577717
	if (!quiet) {
Packit 577717
		printf("Estimated loads: %lld\n",loads);
Packit 577717
	}
Packit 577717
Packit 577717
	return loads;
Packit 577717
}
Packit 577717
Packit 577717
long long naive_matrix_multiply_estimated_stores(int quiet) {
Packit 577717
Packit 577717
	long long stores=0;
Packit 577717
Packit 577717
	/* setup */
Packit 577717
	stores+=MATRIX_SIZE*MATRIX_SIZE*2;
Packit 577717
Packit 577717
	/* multiply */
Packit 577717
	stores+=MATRIX_SIZE*MATRIX_SIZE;
Packit 577717
Packit 577717
	/* sum */
Packit 577717
	stores+=1;
Packit 577717
Packit 577717
	if (!quiet) {
Packit 577717
		printf("Estimated stores: %lld\n",stores);
Packit 577717
	}
Packit 577717
Packit 577717
	return stores;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
double naive_matrix_multiply(int quiet) {
Packit 577717
Packit 577717
	double s;
Packit 577717
	int i,j,k;
Packit 577717
Packit 577717
	for(i=0;i
Packit 577717
		for(j=0;j
Packit 577717
			a[i][j]=(double)i*(double)j;
Packit 577717
			b[i][j]=(double)i/(double)(j+5);
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	for(j=0;j
Packit 577717
		for(i=0;i
Packit 577717
			s=0;
Packit 577717
			for(k=0;k
Packit 577717
				s+=a[i][k]*b[k][j];
Packit 577717
			}
Packit 577717
			c[i][j] = s;
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	s=0.0;
Packit 577717
Packit 577717
	for(i=0;i
Packit 577717
		for(j=0;j
Packit 577717
			s+=c[i][j];
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	if (!quiet) printf("Matrix multiply sum: s=%lf\n",s);
Packit 577717
Packit 577717
	return s;
Packit 577717
}
Packit 577717