|
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 |
|