Blame src/validation_tests/flops_testcode.c

Packit 577717
/* This includes various workloads that had been scattered all over */
Packit 577717
/* the various ctests.  The goal is to have them in one place, and */
Packit 577717
/* share them, as well as maybe have only one file that has to be */
Packit 577717
/* compiled with reduced optimizations */
Packit 577717
Packit 577717
#include <stdio.h>
Packit 577717
#include <stdlib.h>
Packit 577717
Packit 577717
#include "testcode.h"
Packit 577717
Packit 577717
#define ROWS	1000
Packit 577717
#define COLUMNS	1000
Packit 577717
Packit 577717
static float float_matrixa[ROWS][COLUMNS],
Packit 577717
		float_matrixb[ROWS][COLUMNS],
Packit 577717
		float_mresult[ROWS][COLUMNS];
Packit 577717
Packit 577717
static double double_matrixa[ROWS][COLUMNS],
Packit 577717
		double_matrixb[ROWS][COLUMNS],
Packit 577717
		double_mresult[ROWS][COLUMNS];
Packit 577717
Packit 577717
Packit 577717
int flops_float_init_matrix(void) {
Packit 577717
Packit 577717
	int i,j;
Packit 577717
Packit 577717
	/* Initialize the Matrix arrays */
Packit 577717
	/* Non-optimail row major.  Intentional? */
Packit 577717
	for ( i = 0; i < ROWS; i++ ) {
Packit 577717
		for ( j = 0; j < COLUMNS; j++) {
Packit 577717
			float_mresult[j][i] = 0.0;
Packit 577717
			float_matrixa[j][i] = ( float ) rand() * ( float ) 1.1;
Packit 577717
			float_matrixb[j][i] = ( float ) rand() * ( float ) 1.1;
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
#if defined(__powerpc__)
Packit 577717
	/* Has fused multiply-add */
Packit 577717
	return ROWS*ROWS*ROWS;
Packit 577717
#else
Packit 577717
	return ROWS*ROWS*ROWS*2;
Packit 577717
#endif
Packit 577717
Packit 577717
}
Packit 577717
Packit 577717
float flops_float_matrix_matrix_multiply(void) {
Packit 577717
Packit 577717
	int i,j,k;
Packit 577717
Packit 577717
	/* Matrix-Matrix multiply */
Packit 577717
	for ( i = 0; i < ROWS; i++ ) {
Packit 577717
		for ( j = 0; j < COLUMNS; j++ ) {
Packit 577717
			for ( k = 0; k < COLUMNS; k++ ) {
Packit 577717
				float_mresult[i][j] += float_matrixa[i][k] * float_matrixb[k][j];
Packit 577717
			}
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	return float_mresult[10][10];
Packit 577717
}
Packit 577717
Packit 577717
float flops_float_swapped_matrix_matrix_multiply(void) {
Packit 577717
Packit 577717
	int i, j, k;
Packit 577717
Packit 577717
	/* Matrix-Matrix multiply */
Packit 577717
	/* With inner loops swapped */
Packit 577717
Packit 577717
	for (i = 0; i < ROWS; i++) {
Packit 577717
		for (k = 0; k < COLUMNS; k++) {
Packit 577717
			for (j = 0; j < COLUMNS; j++) {
Packit 577717
				float_mresult[i][j] += float_matrixa[i][k] * float_matrixb[k][j];
Packit 577717
			}
Packit 577717
		}
Packit 577717
	}
Packit 577717
	return float_mresult[10][10];
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
Packit 577717
int flops_double_init_matrix(void) {
Packit 577717
Packit 577717
	int i,j;
Packit 577717
Packit 577717
	/* Initialize the Matrix arrays */
Packit 577717
	/* Non-optimail row major.  Intentional? */
Packit 577717
	for ( i = 0; i < ROWS; i++ ) {
Packit 577717
		for ( j = 0; j < COLUMNS; j++) {
Packit 577717
			double_mresult[j][i] = 0.0;
Packit 577717
			double_matrixa[j][i] = ( double ) rand() * ( double ) 1.1;
Packit 577717
			double_matrixb[j][i] = ( double ) rand() * ( double ) 1.1;
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
#if defined(__powerpc__)
Packit 577717
		/* has fused multiply-add */
Packit 577717
		return ROWS*ROWS*ROWS;
Packit 577717
#else
Packit 577717
	return ROWS*ROWS*ROWS*2;
Packit 577717
#endif
Packit 577717
Packit 577717
}
Packit 577717
Packit 577717
double flops_double_matrix_matrix_multiply(void) {
Packit 577717
Packit 577717
	int i,j,k;
Packit 577717
Packit 577717
	/* Matrix-Matrix multiply */
Packit 577717
	for ( i = 0; i < ROWS; i++ ) {
Packit 577717
		for ( j = 0; j < COLUMNS; j++ ) {
Packit 577717
			for ( k = 0; k < COLUMNS; k++ ) {
Packit 577717
				double_mresult[i][j] += double_matrixa[i][k] * double_matrixb[k][j];
Packit 577717
			}
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	return double_mresult[10][10];
Packit 577717
}
Packit 577717
Packit 577717
double flops_double_swapped_matrix_matrix_multiply(void) {
Packit 577717
Packit 577717
	int i, j, k;
Packit 577717
Packit 577717
	/* Matrix-Matrix multiply */
Packit 577717
	/* With inner loops swapped */
Packit 577717
Packit 577717
	for (i = 0; i < ROWS; i++) {
Packit 577717
		for (k = 0; k < COLUMNS; k++) {
Packit 577717
			for (j = 0; j < COLUMNS; j++) {
Packit 577717
				double_mresult[i][j] += double_matrixa[i][k] * double_matrixb[k][j];
Packit 577717
			}
Packit 577717
		}
Packit 577717
	}
Packit 577717
	return double_mresult[10][10];
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
/* This was originally called "dummy3" in the various sdsc tests */
Packit 577717
/* Does a lot of floating point ops near 1.0 */
Packit 577717
/* In theory returns a value roughly equal to the number of flops */
Packit 577717
double
Packit 577717
do_flops3( double x, int iters, int quiet )
Packit 577717
{
Packit 577717
	int i;
Packit 577717
	double w, y, z, a, b, c, d, e, f, g, h;
Packit 577717
	double result;
Packit 577717
	double one;
Packit 577717
	one = 1.0;
Packit 577717
	w = x;
Packit 577717
	y = x;
Packit 577717
	z = x;
Packit 577717
	a = x;
Packit 577717
	b = x;
Packit 577717
	c = x;
Packit 577717
	d = x;
Packit 577717
	e = x;
Packit 577717
	f = x;
Packit 577717
	g = x;
Packit 577717
	h = x;
Packit 577717
	for ( i = 1; i <= iters; i++ ) {
Packit 577717
		w = w * 1.000000000001 + one;
Packit 577717
		y = y * 1.000000000002 + one;
Packit 577717
		z = z * 1.000000000003 + one;
Packit 577717
		a = a * 1.000000000004 + one;
Packit 577717
		b = b * 1.000000000005 + one;
Packit 577717
		c = c * 0.999999999999 + one;
Packit 577717
		d = d * 0.999999999998 + one;
Packit 577717
		e = e * 0.999999999997 + one;
Packit 577717
		f = f * 0.999999999996 + one;
Packit 577717
		g = h * 0.999999999995 + one;
Packit 577717
		h = h * 1.000000000006 + one;
Packit 577717
	}
Packit 577717
	result = 2.0 * ( a + b + c + d + e + f + w + x + y + z + g + h );
Packit 577717
Packit 577717
	if (!quiet) printf("Result = %lf\n", result);
Packit 577717
Packit 577717
	return result;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
volatile double a = 0.5, b = 2.2;
Packit 577717
Packit 577717
double
Packit 577717
do_flops( int n, int quiet )
Packit 577717
{
Packit 577717
        int i;
Packit 577717
        double c = 0.11;
Packit 577717
Packit 577717
        for ( i = 0; i < n; i++ ) {
Packit 577717
                c += a * b;
Packit 577717
        }
Packit 577717
Packit 577717
	if (!quiet) printf("%lf\n",c);
Packit 577717
Packit 577717
	return c;
Packit 577717
}
Packit 577717