|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* A simple example for the use of PAPI, using PAPI_ipc
|
|
Packit |
577717 |
* -Kevin London
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <stdlib.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "papi.h"
|
|
Packit |
577717 |
#include "papi_test.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define INDEX 500
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
main( int argc, char **argv )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
extern void dummy( void * );
|
|
Packit |
577717 |
float matrixa[INDEX][INDEX], matrixb[INDEX][INDEX], mresult[INDEX][INDEX];
|
|
Packit |
577717 |
float real_time, proc_time, ipc;
|
|
Packit |
577717 |
long long ins;
|
|
Packit |
577717 |
int retval;
|
|
Packit |
577717 |
int i, j, k;
|
|
Packit |
577717 |
int quiet;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Set TESTS_QUIET variable */
|
|
Packit |
577717 |
quiet=tests_quiet( argc, argv );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Initialize the Matrix arrays */
|
|
Packit |
577717 |
for( i = 0; i < INDEX; i++ ) {
|
|
Packit |
577717 |
for( j= 0; j < INDEX; j++ ) {
|
|
Packit |
577717 |
mresult[i][j] = 0.0;
|
|
Packit |
577717 |
matrixa[i][j] = matrixb[i][j] = ( float ) rand( ) * ( float ) 1.1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Setup PAPI library and begin collecting data from the counters */
|
|
Packit |
577717 |
retval = PAPI_ipc( &real_time, &proc_time, &ins, &ipc );
|
|
Packit |
577717 |
if (retval < PAPI_OK ) {
|
|
Packit |
577717 |
if (!quiet) printf("Trouble starting IPC\n");
|
|
Packit |
577717 |
test_skip( __FILE__, __LINE__, "PAPI_ipc", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Matrix-Matrix multiply */
|
|
Packit |
577717 |
for ( i = 0; i < INDEX; i++ )
|
|
Packit |
577717 |
for ( j = 0; j < INDEX; j++ )
|
|
Packit |
577717 |
for ( k = 0; k < INDEX; k++ )
|
|
Packit |
577717 |
mresult[i][j] = mresult[i][j] + matrixa[i][k] * matrixb[k][j];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Collect the data into the variables passed in */
|
|
Packit |
577717 |
if ( ( retval = PAPI_ipc( &real_time, &proc_time, &ins, &ipc ) ) < PAPI_OK )
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_ipc", retval );
|
|
Packit |
577717 |
dummy( ( void * ) mresult );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( !quiet ) {
|
|
Packit |
577717 |
printf( "Real_time: %f Proc_time: %f Total ins: ", real_time,
|
|
Packit |
577717 |
proc_time );
|
|
Packit |
577717 |
printf( LLDFMT, ins );
|
|
Packit |
577717 |
printf( " IPC: %f\n", ipc );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* This should not happen unless the optimizer */
|
|
Packit |
577717 |
/* gets too good */
|
|
Packit |
577717 |
if (ins < INDEX*INDEX) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "Instruction count too low.",
|
|
Packit |
577717 |
5 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
/* Something is broken, or else you have a really */
|
|
Packit |
577717 |
/* slow processor */
|
|
Packit |
577717 |
if (ipc<0.01 ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "IPC equals zero.",
|
|
Packit |
577717 |
5 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
test_pass( __FILE__ );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return 0;
|
|
Packit |
577717 |
}
|