|
Packit |
577717 |
/** file papi_cost.c
|
|
Packit |
577717 |
* @brief papi_cost utility.
|
|
Packit |
577717 |
* @page papi_cost
|
|
Packit |
577717 |
* @section NAME
|
|
Packit |
577717 |
* papi_cost - computes execution time costs for basic PAPI operations.
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* @section Synopsis
|
|
Packit |
577717 |
* papi_cost [-dhs] [-b bins] [-t threshold]
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* @section Description
|
|
Packit |
577717 |
* papi_cost is a PAPI utility program that computes the min / max / mean / std. deviation
|
|
Packit |
577717 |
* of execution times for PAPI start/stop pairs and for PAPI reads.
|
|
Packit |
577717 |
* This information provides the basic operating cost to a user's program
|
|
Packit |
577717 |
* for collecting hardware counter data.
|
|
Packit |
577717 |
* Command line options control display capabilities.
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* @section Options
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* -b < bins > Define the number of bins into which the results are
|
|
Packit |
577717 |
* partitioned for display. The default is 100.
|
|
Packit |
577717 |
* -d Display a graphical distribution of costs in a vertical histogram.
|
|
Packit |
577717 |
* -h Display help information about this utility.
|
|
Packit |
577717 |
* -s Show the number of iterations in each of the first 10
|
|
Packit |
577717 |
* standard deviations above the mean.
|
|
Packit |
577717 |
* -t < threshold > Set the threshold for the number of iterations to
|
|
Packit |
577717 |
* measure costs. The default is 100,000.
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* @section Bugs
|
|
Packit |
577717 |
* There are no known bugs in this utility. If you find a bug,
|
|
Packit |
577717 |
* it should be reported to the PAPI Mailing List at <ptools-perfapi@icl.utk.edu>.
|
|
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 "cost_utils.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
find_derived( int i , char *type)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
PAPI_event_info_t info;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PAPI_enum_event( &i, PAPI_ENUM_FIRST );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do {
|
|
Packit |
577717 |
if ( PAPI_get_event_info( i, &info ) == PAPI_OK ) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( strcmp( info.derived, type) == 0 )
|
|
Packit |
577717 |
return i;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
} while ( PAPI_enum_event( &i, PAPI_PRESET_ENUM_AVAIL ) == PAPI_OK );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_NULL;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Slight misnomer, find derived event != DERIVED_POSTFIX */
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
find_derived_add( int i )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int ret;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( (ret = find_derived( i, "DERIVED_ADD")) != PAPI_NULL)
|
|
Packit |
577717 |
return ret;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return find_derived( i, "DERIVED_SUB");
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
find_derived_postfix( int i )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return ( find_derived ( i, "DERIVED_POSTFIX" ) );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
print_help( void )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
printf( "This is the PAPI cost program.\n" );
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "It computes min / max / mean / std. deviation for PAPI start/stop pairs; for PAPI reads, and for PAPI_accums. Usage:\n\n" );
|
|
Packit |
577717 |
printf( " cost [options] [parameters]\n" );
|
|
Packit |
577717 |
printf( " cost TESTS_QUIET\n\n" );
|
|
Packit |
577717 |
printf( "Options:\n\n" );
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( " -b BINS set the number of bins for the graphical distribution of costs. Default: 100\n" );
|
|
Packit |
577717 |
printf( " -d show a graphical distribution of costs\n" );
|
|
Packit |
577717 |
printf( " -h print this help message\n" );
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( " -s show number of iterations above the first 10 std deviations\n" );
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( " -t THRESHOLD set the threshold for the number of iterations. Default: 100,000\n" );
|
|
Packit |
577717 |
printf( "\n" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
print_stats( int i, long long min, long long max, double average, double std )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
char *test[] = { "loop latency", "PAPI_start/stop (2 counters)",
|
|
Packit |
577717 |
"PAPI_read (2 counters)", "PAPI_read_ts (2 counters)",
|
|
Packit |
577717 |
"PAPI_accum (2 counters)", "PAPI_reset (2 counters)",
|
|
Packit |
577717 |
"PAPI_read (1 derived_postfix counter)"," PAPI_read (1 derived_[add|sub] counter)"
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
printf( "\nTotal cost for %s over %d iterations\n", test[i], num_iters );
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "min cycles : %lld\nmax cycles : %lld\nmean cycles : %lf\nstd deviation: %lf\n ",
|
|
Packit |
577717 |
min, max, average, std );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
print_std_dev( int *s )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "\n" );
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( " --------# Standard Deviations Above the Mean--------\n" );
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "0-------1-------2-------3-------4-------5-------6-------7-------8-------9-----10\n" );
|
|
Packit |
577717 |
for ( i = 0; i < 10; i++ )
|
|
Packit |
577717 |
printf( " %d\t", s[i] );
|
|
Packit |
577717 |
printf( "\n\n" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
print_dist( long long min, long long max, int bins, int *d )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i, j;
|
|
Packit |
577717 |
int step = ( int ) ( max - min ) / bins;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "\nCost distribution profile\n\n" );
|
|
Packit |
577717 |
for ( i = 0; i < bins; i++ ) {
|
|
Packit |
577717 |
printf( "%8d:", ( int ) min + ( step * i ) );
|
|
Packit |
577717 |
if ( d[i] > 100 ) {
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "**************************** %d counts ****************************",
|
|
Packit |
577717 |
d[i] );
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
for ( j = 0; j < d[i]; j++ )
|
|
Packit |
577717 |
printf( "*" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
printf( "\n" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void
|
|
Packit |
577717 |
do_output( int test_type, long long *array, int bins, int show_std_dev,
|
|
Packit |
577717 |
int show_dist )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int s[10];
|
|
Packit |
577717 |
long long min, max;
|
|
Packit |
577717 |
double average, std;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
std = do_stats( array, &min, &max, &average );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
print_stats( test_type, min, max, average, std );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( show_std_dev ) {
|
|
Packit |
577717 |
do_std_dev( array, s, std, average );
|
|
Packit |
577717 |
print_std_dev( s );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( show_dist ) {
|
|
Packit |
577717 |
int *d;
|
|
Packit |
577717 |
d = calloc( bins , sizeof ( int ) );
|
|
Packit |
577717 |
do_dist( array, min, max, bins, d );
|
|
Packit |
577717 |
print_dist( min, max, bins, d );
|
|
Packit |
577717 |
free( d );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
main( int argc, char **argv )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i, retval, EventSet = PAPI_NULL;
|
|
Packit |
577717 |
int retval_start,retval_stop;
|
|
Packit |
577717 |
int bins = 100;
|
|
Packit |
577717 |
int show_dist = 0, show_std_dev = 0;
|
|
Packit |
577717 |
long long totcyc, values[2];
|
|
Packit |
577717 |
long long *array;
|
|
Packit |
577717 |
int event;
|
|
Packit |
577717 |
PAPI_event_info_t info;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 1; i < argc; i++ ) {
|
|
Packit |
577717 |
if ( !strcmp( argv[i], "-b" ) ) {
|
|
Packit |
577717 |
i++;
|
|
Packit |
577717 |
if ( i >= argc || (bins = atoi( argv[i] ) > 0 ) ) {
|
|
Packit |
577717 |
printf( "-b requires a positive bin count!\n" );
|
|
Packit |
577717 |
exit( 1 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
else if ( !strcmp( argv[i], "-d" ) )
|
|
Packit |
577717 |
show_dist = 1;
|
|
Packit |
577717 |
else if ( !strcmp( argv[i], "-h" ) ) {
|
|
Packit |
577717 |
print_help( );
|
|
Packit |
577717 |
exit( 1 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
else if ( !strcmp( argv[i], "-s" ) )
|
|
Packit |
577717 |
show_std_dev = 1;
|
|
Packit |
577717 |
else if ( !strcmp( argv[i], "-t" ) ) {
|
|
Packit |
577717 |
i++;
|
|
Packit |
577717 |
if ( i >= argc || (num_iters = ( int ) atol( argv[i] ) > 0) ) {
|
|
Packit |
577717 |
printf( "-t requires a positive threshold value!\n" );
|
|
Packit |
577717 |
exit( 1 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
else {
|
|
Packit |
577717 |
/* If not a valid option, print out some help information */
|
|
Packit |
577717 |
print_help( );
|
|
Packit |
577717 |
exit( 1 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "Cost of execution for PAPI start/stop, read and accum.\n" );
|
|
Packit |
577717 |
printf( "This test takes a while. Please be patient...\n" );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_library_init( PAPI_VER_CURRENT );
|
|
Packit |
577717 |
if (retval != PAPI_VER_CURRENT ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_library_init\n");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
retval = PAPI_set_debug( PAPI_VERB_ECONT );
|
|
Packit |
577717 |
if (retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_set_debug\n");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
retval = PAPI_query_event( PAPI_TOT_CYC );
|
|
Packit |
577717 |
if (retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_query_event\n");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
retval = PAPI_query_event( PAPI_TOT_INS );
|
|
Packit |
577717 |
if (retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_query_event\n");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
retval = PAPI_create_eventset( &EventSet );
|
|
Packit |
577717 |
if (retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_create_eventset\n");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
retval = PAPI_add_event( EventSet, PAPI_TOT_CYC );
|
|
Packit |
577717 |
if (retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_add_event\n");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
retval = PAPI_add_event( EventSet, PAPI_TOT_INS );
|
|
Packit |
577717 |
if (retval != PAPI_OK ) {
|
|
Packit |
577717 |
retval = PAPI_add_event( EventSet, PAPI_TOT_IIS );
|
|
Packit |
577717 |
if (retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_add_event\n");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Make sure no errors and warm up */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
totcyc = PAPI_get_real_cyc( );
|
|
Packit |
577717 |
if ( ( retval = PAPI_start( EventSet ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_start");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if ( ( retval = PAPI_stop( EventSet, NULL ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_stop");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
array =
|
|
Packit |
577717 |
( long long * ) malloc( ( size_t ) num_iters * sizeof ( long long ) );
|
|
Packit |
577717 |
if ( array == NULL ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_stop");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Determine clock latency */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "\nPerforming loop latency test...\n" );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < num_iters; i++ ) {
|
|
Packit |
577717 |
totcyc = PAPI_get_real_cyc( );
|
|
Packit |
577717 |
totcyc = PAPI_get_real_cyc( ) - totcyc;
|
|
Packit |
577717 |
array[i] = totcyc;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_output( 0, array, bins, show_std_dev, show_dist );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Start the start/stop eval */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "\nPerforming start/stop test...\n" );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < num_iters; i++ ) {
|
|
Packit |
577717 |
totcyc = PAPI_get_real_cyc( );
|
|
Packit |
577717 |
retval_start=PAPI_start( EventSet );
|
|
Packit |
577717 |
retval_stop=PAPI_stop( EventSet, values );
|
|
Packit |
577717 |
totcyc = PAPI_get_real_cyc( ) - totcyc;
|
|
Packit |
577717 |
array[i] = totcyc;
|
|
Packit |
577717 |
if (retval_start || retval_stop) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI start/stop\n");
|
|
Packit |
577717 |
exit(retval_start );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_output( 1, array, bins, show_std_dev, show_dist );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Start the read eval */
|
|
Packit |
577717 |
printf( "\nPerforming read test...\n" );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_start( EventSet ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_start");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
PAPI_read( EventSet, values );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < num_iters; i++ ) {
|
|
Packit |
577717 |
totcyc = PAPI_get_real_cyc( );
|
|
Packit |
577717 |
PAPI_read( EventSet, values );
|
|
Packit |
577717 |
totcyc = PAPI_get_real_cyc( ) - totcyc;
|
|
Packit |
577717 |
array[i] = totcyc;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if ( ( retval = PAPI_stop( EventSet, values ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_stop");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_output( 2, array, bins, show_std_dev, show_dist );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Start the read with timestamp eval */
|
|
Packit |
577717 |
printf( "\nPerforming read with timestamp test...\n" );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_start( EventSet ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_start");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
PAPI_read_ts( EventSet, values, &totcyc );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < num_iters; i++ ) {
|
|
Packit |
577717 |
PAPI_read_ts( EventSet, values, &array[i] );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if ( ( retval = PAPI_stop( EventSet, values ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_stop");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* post-process the timing array */
|
|
Packit |
577717 |
for ( i = num_iters - 1; i > 0; i-- ) {
|
|
Packit |
577717 |
array[i] -= array[i - 1];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
array[0] -= totcyc;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_output( 3, array, bins, show_std_dev, show_dist );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Start the accum eval */
|
|
Packit |
577717 |
printf( "\nPerforming accum test...\n" );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_start( EventSet ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_start");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
PAPI_accum( EventSet, values );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < num_iters; i++ ) {
|
|
Packit |
577717 |
totcyc = PAPI_get_real_cyc( );
|
|
Packit |
577717 |
PAPI_accum( EventSet, values );
|
|
Packit |
577717 |
totcyc = PAPI_get_real_cyc( ) - totcyc;
|
|
Packit |
577717 |
array[i] = totcyc;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if ( ( retval = PAPI_stop( EventSet, values ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_stop");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_output( 4, array, bins, show_std_dev, show_dist );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Start the reset eval */
|
|
Packit |
577717 |
printf( "\nPerforming reset test...\n" );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_start( EventSet ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_start");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < num_iters; i++ ) {
|
|
Packit |
577717 |
totcyc = PAPI_get_real_cyc( );
|
|
Packit |
577717 |
PAPI_reset( EventSet );
|
|
Packit |
577717 |
totcyc = PAPI_get_real_cyc( ) - totcyc;
|
|
Packit |
577717 |
array[i] = totcyc;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if ( ( retval = PAPI_stop( EventSet, values ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_stop");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_output( 5, array, bins, show_std_dev, show_dist );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Derived POSTFIX event test */
|
|
Packit |
577717 |
PAPI_cleanup_eventset( EventSet );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
event = 0 | PAPI_PRESET_MASK;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
event = find_derived_postfix( event );
|
|
Packit |
577717 |
if ( event != PAPI_NULL ) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PAPI_get_event_info(event, &info;;
|
|
Packit |
577717 |
printf( "\nPerforming DERIVED_POSTFIX "
|
|
Packit |
577717 |
"PAPI_read(%d counters) test (%s)...",
|
|
Packit |
577717 |
info.count, info.symbol );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_add_event( EventSet, event);
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_add_event");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_start( EventSet );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_start");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PAPI_read( EventSet, values );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < num_iters; i++ ) {
|
|
Packit |
577717 |
totcyc = PAPI_get_real_cyc( );
|
|
Packit |
577717 |
PAPI_read( EventSet, values );
|
|
Packit |
577717 |
totcyc = PAPI_get_real_cyc( ) - totcyc;
|
|
Packit |
577717 |
array[i] = totcyc;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_stop( EventSet, values );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_stop");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_output( 6, array, bins, show_std_dev, show_dist );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
printf("\tI was unable to find a DERIVED_POSTFIX preset event "
|
|
Packit |
577717 |
"to test on this architecture, skipping.\n");
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Find a derived ADD event */
|
|
Packit |
577717 |
PAPI_cleanup_eventset( EventSet );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
event = 0 | PAPI_PRESET_MASK;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
event = find_derived_add( event );
|
|
Packit |
577717 |
if ( event != PAPI_NULL ) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PAPI_get_event_info(event, &info;;
|
|
Packit |
577717 |
printf( "\nPerforming DERIVED_[ADD|SUB] "
|
|
Packit |
577717 |
"PAPI_read(%d counters) test (%s)...",
|
|
Packit |
577717 |
info.count, info.symbol );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_add_event( EventSet, event);
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_add_event\n");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_start( EventSet );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_start");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PAPI_read( EventSet, values );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < num_iters; i++ ) {
|
|
Packit |
577717 |
totcyc = PAPI_get_real_cyc( );
|
|
Packit |
577717 |
PAPI_read( EventSet, values );
|
|
Packit |
577717 |
totcyc = PAPI_get_real_cyc( ) - totcyc;
|
|
Packit |
577717 |
array[i] = totcyc;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_stop( EventSet, values );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"PAPI_stop");
|
|
Packit |
577717 |
exit(retval);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do_output( 7, array, bins, show_std_dev, show_dist );
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
printf("\tI was unable to find a suitable DERIVED_[ADD|SUB] "
|
|
Packit |
577717 |
"event to test, skipping.\n");
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
free( array );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return 0;
|
|
Packit |
577717 |
}
|