|
Packit |
577717 |
/*
|
|
Packit |
577717 |
Calibrate.c
|
|
Packit |
577717 |
A program to perform one or all of three tests to count flops.
|
|
Packit |
577717 |
Test 1. Inner Product: 2*n operations
|
|
Packit |
577717 |
for i = 1:n; a = a + x(i)*y(i); end
|
|
Packit |
577717 |
Test 2. Matrix Vector Product: 2*n^2 operations
|
|
Packit |
577717 |
for i = 1:n; for j = 1:n; x(i) = x(i) + a(i,j)*y(j); end; end;
|
|
Packit |
577717 |
Test 3. Matrix Matrix Multiply: 2*n^3 operations
|
|
Packit |
577717 |
for i = 1:n; for j = 1:n; for k = 1:n; c(i,j) = c(i,j) + a(i,k)*b(k,j); end; end; end;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
Supply a command line argument of 1, 2, or 3 to perform each test, or
|
|
Packit |
577717 |
no argument to perform all three.
|
|
Packit |
577717 |
|
|
Packit |
577717 |
Each test initializes PAPI and presents a header with processor information.
|
|
Packit |
577717 |
Then it performs 500 iterations, printing result lines containing:
|
|
Packit |
577717 |
n, measured counts, theoretical counts, (measured - theory), % error
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <stdlib.h>
|
|
Packit |
577717 |
#include <string.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "papi.h"
|
|
Packit |
577717 |
#include "papi_test.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define INDEX1 100
|
|
Packit |
577717 |
#define INDEX5 500
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define MAX_WARN 10
|
|
Packit |
577717 |
#define MAX_ERROR 80
|
|
Packit |
577717 |
#define MAX_DIFF 14
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
Extract and display hardware information for this processor.
|
|
Packit |
577717 |
(Re)Initialize PAPI_flops() and begin counting floating ops.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
headerlines( const char *title, int quiet )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( !quiet ) {
|
|
Packit |
577717 |
printf( "\n%s:\n%8s %12s %12s %8s %8s\n", title, "i", "papi", "theory",
|
|
Packit |
577717 |
"diff", "%error" );
|
|
Packit |
577717 |
printf( "-------------------------------------------------------------------------\n" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
Read PAPI_flops.
|
|
Packit |
577717 |
Format and display results.
|
|
Packit |
577717 |
Compute error without using floating ops.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#if defined(mips)
|
|
Packit |
577717 |
#define FMA 1
|
|
Packit |
577717 |
#elif (defined(sparc) && defined(sun))
|
|
Packit |
577717 |
#define FMA 1
|
|
Packit |
577717 |
#else
|
|
Packit |
577717 |
#define FMA 0
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
resultline( int i, int j, int EventSet, int fail, int quiet )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
float ferror = 0;
|
|
Packit |
577717 |
long long flpins = 0;
|
|
Packit |
577717 |
long long papi, theory;
|
|
Packit |
577717 |
int diff, retval;
|
|
Packit |
577717 |
char err_str[PAPI_MAX_STR_LEN];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_stop( EventSet, &flpins );
|
|
Packit |
577717 |
if ( retval != PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
i++; /* convert to 1s base */
|
|
Packit |
577717 |
theory = 2;
|
|
Packit |
577717 |
while ( j-- )
|
|
Packit |
577717 |
theory *= i; /* theoretical ops */
|
|
Packit |
577717 |
papi = flpins << FMA;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
diff = ( int ) ( papi - theory );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
ferror = ( ( float ) abs( diff ) ) / ( ( float ) theory ) * 100;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) {
|
|
Packit |
577717 |
printf( "%8d %12lld %12lld %8d %10.4f\n", i, papi, theory, diff, ferror );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ferror > MAX_WARN && abs( diff ) > MAX_DIFF && i > 20 ) {
|
|
Packit |
577717 |
sprintf( err_str, "Calibrate: difference exceeds %d percent", MAX_WARN );
|
|
Packit |
577717 |
test_warn( __FILE__, __LINE__, err_str, 0 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if (fail) {
|
|
Packit |
577717 |
if ( ferror > MAX_ERROR && abs( diff ) > MAX_DIFF && i > 20 ) {
|
|
Packit |
577717 |
sprintf( err_str, "Calibrate: error exceeds %d percent", MAX_ERROR );
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, err_str, PAPI_EMISC );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
print_help( char **argv )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
printf( "Usage: %s [-ivmdh] [-e event]\n", argv[0] );
|
|
Packit |
577717 |
printf( "Options:\n\n" );
|
|
Packit |
577717 |
printf( "\t-i Inner Product test.\n" );
|
|
Packit |
577717 |
printf( "\t-v Matrix-Vector multiply test.\n" );
|
|
Packit |
577717 |
printf( "\t-m Matrix-Matrix multiply test.\n" );
|
|
Packit |
577717 |
printf( "\t-d Double precision data. Default is float.\n" );
|
|
Packit |
577717 |
printf( "\t-e event Use <event> as PAPI event instead of PAPI_FP_OPS\n" );
|
|
Packit |
577717 |
printf( "\t-f Suppress failures\n" );
|
|
Packit |
577717 |
printf( "\t-h Print this help message\n" );
|
|
Packit |
577717 |
printf( "\n" );
|
|
Packit |
577717 |
printf( "This test measures floating point operations for the specified test.\n" );
|
|
Packit |
577717 |
printf( "Operations can be performed in single or double precision.\n" );
|
|
Packit |
577717 |
printf( "Default operation is all three tests in single precision.\n" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static float
|
|
Packit |
577717 |
inner_single( int n, float *x, float *y )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
float aa = 0.0;
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i <= n; i++ )
|
|
Packit |
577717 |
aa = aa + x[i] * y[i];
|
|
Packit |
577717 |
return ( aa );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static double
|
|
Packit |
577717 |
inner_double( int n, double *x, double *y )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
double aa = 0.0;
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i <= n; i++ )
|
|
Packit |
577717 |
aa = aa + x[i] * y[i];
|
|
Packit |
577717 |
return ( aa );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
vector_single( int n, float *a, float *x, float *y )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i, j;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i <= n; i++ )
|
|
Packit |
577717 |
for ( j = 0; j <= n; j++ )
|
|
Packit |
577717 |
y[i] = y[i] + a[i * n + j] * x[i];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
vector_double( int n, double *a, double *x, double *y )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i, j;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i <= n; i++ )
|
|
Packit |
577717 |
for ( j = 0; j <= n; j++ )
|
|
Packit |
577717 |
y[i] = y[i] + a[i * n + j] * x[i];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
matrix_single( int n, float *c, float *a, float *b )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i, j, k;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i <= n; i++ )
|
|
Packit |
577717 |
for ( j = 0; j <= n; j++ )
|
|
Packit |
577717 |
for ( k = 0; k <= n; k++ )
|
|
Packit |
577717 |
c[i * n + j] = c[i * n + j] + a[i * n + k] * b[k * n + j];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
matrix_double( int n, double *c, double *a, double *b )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i, j, k;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i <= n; i++ )
|
|
Packit |
577717 |
for ( j = 0; j <= n; j++ )
|
|
Packit |
577717 |
for ( k = 0; k <= n; k++ )
|
|
Packit |
577717 |
c[i * n + j] = c[i * n + j] + a[i * n + k] * b[k * n + j];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
reset_flops( const char *title, int EventSet )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int retval;
|
|
Packit |
577717 |
char err_str[PAPI_MAX_STR_LEN];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_start( EventSet );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
sprintf( err_str, "%s: PAPI_start", title );
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, err_str, retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
main( int argc, char *argv[] )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
extern void dummy( void * );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
float aa, *a=NULL, *b=NULL, *c=NULL, *x=NULL, *y=NULL;
|
|
Packit |
577717 |
double aad, *ad=NULL, *bd=NULL, *cd=NULL, *xd=NULL, *yd=NULL;
|
|
Packit |
577717 |
int i, j, n;
|
|
Packit |
577717 |
int inner = 0;
|
|
Packit |
577717 |
int vector = 0;
|
|
Packit |
577717 |
int matrix = 0;
|
|
Packit |
577717 |
int double_precision = 0;
|
|
Packit |
577717 |
int fail = 1;
|
|
Packit |
577717 |
int retval = PAPI_OK;
|
|
Packit |
577717 |
char papi_event_str[PAPI_MIN_STR_LEN] = "PAPI_FP_OPS";
|
|
Packit |
577717 |
int papi_event;
|
|
Packit |
577717 |
int EventSet = PAPI_NULL;
|
|
Packit |
577717 |
int quiet;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Parse the input arguments */
|
|
Packit |
577717 |
for ( i = 0; i < argc; i++ ) {
|
|
Packit |
577717 |
if ( strstr( argv[i], "-i" ) )
|
|
Packit |
577717 |
inner = 1;
|
|
Packit |
577717 |
else if ( strstr( argv[i], "-f" ) )
|
|
Packit |
577717 |
fail = 0;
|
|
Packit |
577717 |
else if ( strstr( argv[i], "-v" ) )
|
|
Packit |
577717 |
vector = 1;
|
|
Packit |
577717 |
else if ( strstr( argv[i], "-m" ) )
|
|
Packit |
577717 |
matrix = 1;
|
|
Packit |
577717 |
else if ( strstr( argv[i], "-e" ) ) {
|
|
Packit |
577717 |
if ( ( argv[i + 1] == NULL ) || ( strlen( argv[i + 1] ) == 0 ) ) {
|
|
Packit |
577717 |
print_help( argv );
|
|
Packit |
577717 |
exit( 1 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
strncpy( papi_event_str, argv[i + 1], sizeof ( papi_event_str ) - 1);
|
|
Packit |
577717 |
papi_event_str[sizeof ( papi_event_str )-1] = '\0';
|
|
Packit |
577717 |
i++;
|
|
Packit |
577717 |
} else if ( strstr( argv[i], "-d" ) )
|
|
Packit |
577717 |
double_precision = 1;
|
|
Packit |
577717 |
else if ( strstr( argv[i], "-h" ) ) {
|
|
Packit |
577717 |
print_help( argv );
|
|
Packit |
577717 |
exit( 1 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* if no options specified, set all tests to TRUE */
|
|
Packit |
577717 |
if ( inner + vector + matrix == 0 )
|
|
Packit |
577717 |
inner = vector = matrix = 1;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Set TESTS_QUIET variable */
|
|
Packit |
577717 |
quiet = tests_quiet( argc, argv );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( !quiet ) {
|
|
Packit |
577717 |
printf( "Initializing..." );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Initialize PAPI */
|
|
Packit |
577717 |
retval = PAPI_library_init( PAPI_VER_CURRENT );
|
|
Packit |
577717 |
if ( retval != PAPI_VER_CURRENT ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_library_init", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Translate name */
|
|
Packit |
577717 |
retval = PAPI_event_name_to_code( papi_event_str, &papi_event );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_event_name_to_code", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( PAPI_query_event( papi_event ) != PAPI_OK ) {
|
|
Packit |
577717 |
test_skip( __FILE__, __LINE__, "PAPI_query_event", PAPI_ENOEVNT );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_create_eventset( &EventSet ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_add_event( EventSet, papi_event ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_add_event", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) printf( "\n" );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_OK;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Inner Product test */
|
|
Packit |
577717 |
if ( inner ) {
|
|
Packit |
577717 |
/* Allocate the linear arrays */
|
|
Packit |
577717 |
if (double_precision) {
|
|
Packit |
577717 |
xd = malloc( INDEX5 * sizeof(double) );
|
|
Packit |
577717 |
yd = malloc( INDEX5 * sizeof(double) );
|
|
Packit |
577717 |
if ( !( xd && yd ) )
|
|
Packit |
577717 |
retval = PAPI_ENOMEM;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
else {
|
|
Packit |
577717 |
x = malloc( INDEX5 * sizeof(float) );
|
|
Packit |
577717 |
y = malloc( INDEX5 * sizeof(float) );
|
|
Packit |
577717 |
if ( !( x && y ) )
|
|
Packit |
577717 |
retval = PAPI_ENOMEM;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( retval == PAPI_OK ) {
|
|
Packit |
577717 |
headerlines( "Inner Product Test", quiet );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* step through the different array sizes */
|
|
Packit |
577717 |
for ( n = 0; n < INDEX5; n++ ) {
|
|
Packit |
577717 |
if ( n < INDEX1 || ( ( n + 1 ) % 50 ) == 0 ) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Initialize the needed arrays at this size */
|
|
Packit |
577717 |
if ( double_precision ) {
|
|
Packit |
577717 |
for ( i = 0; i <= n; i++ ) {
|
|
Packit |
577717 |
xd[i] = ( double ) rand( ) * ( double ) 1.1;
|
|
Packit |
577717 |
yd[i] = ( double ) rand( ) * ( double ) 1.1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
for ( i = 0; i <= n; i++ ) {
|
|
Packit |
577717 |
x[i] = ( float ) rand( ) * ( float ) 1.1;
|
|
Packit |
577717 |
y[i] = ( float ) rand( ) * ( float ) 1.1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* reset PAPI flops count */
|
|
Packit |
577717 |
reset_flops( "Inner Product Test", EventSet );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* do the multiplication */
|
|
Packit |
577717 |
if ( double_precision ) {
|
|
Packit |
577717 |
aad = inner_double( n, xd, yd );
|
|
Packit |
577717 |
dummy( ( void * ) &aad );
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
aa = inner_single( n, x, y );
|
|
Packit |
577717 |
dummy( ( void * ) &aa );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
resultline( n, 1, EventSet, fail, quiet );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if (double_precision) {
|
|
Packit |
577717 |
free( xd );
|
|
Packit |
577717 |
free( yd );
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
free( x );
|
|
Packit |
577717 |
free( y );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Matrix Vector test */
|
|
Packit |
577717 |
if ( vector && retval != PAPI_ENOMEM ) {
|
|
Packit |
577717 |
/* Allocate the needed arrays */
|
|
Packit |
577717 |
if (double_precision) {
|
|
Packit |
577717 |
ad = malloc( INDEX5 * INDEX5 * sizeof(double) );
|
|
Packit |
577717 |
xd = malloc( INDEX5 * sizeof(double) );
|
|
Packit |
577717 |
yd = malloc( INDEX5 * sizeof(double) );
|
|
Packit |
577717 |
if ( !( ad && xd && yd ) )
|
|
Packit |
577717 |
retval = PAPI_ENOMEM;
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
a = malloc( INDEX5 * INDEX5 * sizeof(float) );
|
|
Packit |
577717 |
x = malloc( INDEX5 * sizeof(float) );
|
|
Packit |
577717 |
y = malloc( INDEX5 * sizeof(float) );
|
|
Packit |
577717 |
if ( !( a && x && y ) )
|
|
Packit |
577717 |
retval = PAPI_ENOMEM;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( retval == PAPI_OK ) {
|
|
Packit |
577717 |
headerlines( "Matrix Vector Test", quiet );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* step through the different array sizes */
|
|
Packit |
577717 |
for ( n = 0; n < INDEX5; n++ ) {
|
|
Packit |
577717 |
if ( n < INDEX1 || ( ( n + 1 ) % 50 ) == 0 ) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Initialize the needed arrays at this size */
|
|
Packit |
577717 |
if ( double_precision ) {
|
|
Packit |
577717 |
for ( i = 0; i <= n; i++ ) {
|
|
Packit |
577717 |
yd[i] = 0.0;
|
|
Packit |
577717 |
xd[i] = ( double ) rand( ) * ( double ) 1.1;
|
|
Packit |
577717 |
for ( j = 0; j <= n; j++ )
|
|
Packit |
577717 |
ad[i * n + j] =
|
|
Packit |
577717 |
( double ) rand( ) * ( double ) 1.1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
for ( i = 0; i <= n; i++ ) {
|
|
Packit |
577717 |
y[i] = 0.0;
|
|
Packit |
577717 |
x[i] = ( float ) rand( ) * ( float ) 1.1;
|
|
Packit |
577717 |
for ( j = 0; j <= n; j++ )
|
|
Packit |
577717 |
a[i * n + j] =
|
|
Packit |
577717 |
( float ) rand( ) * ( float ) 1.1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* reset PAPI flops count */
|
|
Packit |
577717 |
reset_flops( "Matrix Vector Test", EventSet );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* compute the resultant vector */
|
|
Packit |
577717 |
if ( double_precision ) {
|
|
Packit |
577717 |
vector_double( n, ad, xd, yd );
|
|
Packit |
577717 |
dummy( ( void * ) yd );
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
vector_single( n, a, x, y );
|
|
Packit |
577717 |
dummy( ( void * ) y );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
resultline( n, 2, EventSet, fail, quiet );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if (double_precision) {
|
|
Packit |
577717 |
free( ad );
|
|
Packit |
577717 |
free( xd );
|
|
Packit |
577717 |
free( yd );
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
free( a );
|
|
Packit |
577717 |
free( x );
|
|
Packit |
577717 |
free( y );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Matrix Multiply test */
|
|
Packit |
577717 |
if ( matrix && retval != PAPI_ENOMEM ) {
|
|
Packit |
577717 |
/* Allocate the needed arrays */
|
|
Packit |
577717 |
if (double_precision) {
|
|
Packit |
577717 |
ad = malloc( INDEX5 * INDEX5 * sizeof(double) );
|
|
Packit |
577717 |
bd = malloc( INDEX5 * INDEX5 * sizeof(double) );
|
|
Packit |
577717 |
cd = malloc( INDEX5 * INDEX5 * sizeof(double) );
|
|
Packit |
577717 |
if ( !( ad && bd && cd ) )
|
|
Packit |
577717 |
retval = PAPI_ENOMEM;
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
a = malloc( INDEX5 * INDEX5 * sizeof(float) );
|
|
Packit |
577717 |
b = malloc( INDEX5 * INDEX5 * sizeof(float) );
|
|
Packit |
577717 |
c = malloc( INDEX5 * INDEX5 * sizeof(float) );
|
|
Packit |
577717 |
if ( !( a && b && c ) )
|
|
Packit |
577717 |
retval = PAPI_ENOMEM;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( retval == PAPI_OK ) {
|
|
Packit |
577717 |
headerlines( "Matrix Multiply Test", quiet );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* step through the different array sizes */
|
|
Packit |
577717 |
for ( n = 0; n < INDEX5; n++ ) {
|
|
Packit |
577717 |
if ( n < INDEX1 || ( ( n + 1 ) % 50 ) == 0 ) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Initialize the needed arrays at this size */
|
|
Packit |
577717 |
if ( double_precision ) {
|
|
Packit |
577717 |
for ( i = 0; i <= n * n + n; i++ ) {
|
|
Packit |
577717 |
cd[i] = 0.0;
|
|
Packit |
577717 |
ad[i] = ( double ) rand( ) * ( double ) 1.1;
|
|
Packit |
577717 |
bd[i] = ( double ) rand( ) * ( double ) 1.1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
for ( i = 0; i <= n * n + n; i++ ) {
|
|
Packit |
577717 |
c[i] = 0.0;
|
|
Packit |
577717 |
a[i] = ( float ) rand( ) * ( float ) 1.1;
|
|
Packit |
577717 |
b[i] = ( float ) rand( ) * ( float ) 1.1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* reset PAPI flops count */
|
|
Packit |
577717 |
reset_flops( "Matrix Multiply Test", EventSet );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* compute the resultant matrix */
|
|
Packit |
577717 |
if ( double_precision ) {
|
|
Packit |
577717 |
matrix_double( n, cd, ad, bd );
|
|
Packit |
577717 |
dummy( ( void * ) c );
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
matrix_single( n, c, a, b );
|
|
Packit |
577717 |
dummy( ( void * ) c );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
resultline( n, 3, EventSet, fail, quiet );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if (double_precision) {
|
|
Packit |
577717 |
free( ad );
|
|
Packit |
577717 |
free( bd );
|
|
Packit |
577717 |
free( cd );
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
free( a );
|
|
Packit |
577717 |
free( b );
|
|
Packit |
577717 |
free( c );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* exit with status code */
|
|
Packit |
577717 |
if ( retval == PAPI_ENOMEM ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "malloc", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
test_pass( __FILE__ );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return 0;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|