|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* File: overflow_values.c
|
|
Packit Service |
a1973e |
* CVS: $Id$
|
|
Packit Service |
a1973e |
* Author: Harald Servat
|
|
Packit Service |
a1973e |
* harald@cepba.upc.edu
|
|
Packit Service |
a1973e |
* Mods: <your name here>
|
|
Packit Service |
a1973e |
* <your email address>
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* This file performs the following test: overflow values check
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
The Eventset contains:
|
|
Packit Service |
a1973e |
+ PAPI_TOT_INS (overflow monitor)
|
|
Packit Service |
a1973e |
+ PAPI_TOT_CYC
|
|
Packit Service |
a1973e |
+ PAPI_L1_DCM
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
- Start eventset
|
|
Packit Service |
a1973e |
- Read and report event counts mod 1000
|
|
Packit Service |
a1973e |
- report overflow event counts
|
|
Packit Service |
a1973e |
- visually inspect for consistency
|
|
Packit Service |
a1973e |
- Stop eventset
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#include "papi_test.h"
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#define OVRFLOW 5000000
|
|
Packit Service |
a1973e |
#define LOWERFLOW (OVRFLOW - (OVRFLOW/100))
|
|
Packit Service |
a1973e |
#define UPPERFLOW (OVRFLOW/100)
|
|
Packit Service |
a1973e |
#define ERRORFLOW (UPPERFLOW/5)
|
|
Packit Service |
a1973e |
static long long ovrflow = 0;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
void
|
|
Packit Service |
a1973e |
handler( int EventSet, void *address, long long overflow_vector, void *context )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
int ret;
|
|
Packit Service |
a1973e |
int i;
|
|
Packit Service |
a1973e |
long long vals[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
printf( "\nOverflow at %p! bit=%#llx \n", address, overflow_vector );
|
|
Packit Service |
a1973e |
ret = PAPI_read( EventSet, vals );
|
|
Packit Service |
a1973e |
printf( "Overflow read vals :" );
|
|
Packit Service |
a1973e |
for ( i = 0; i < 3 /* 8 */ ; i++ )
|
|
Packit Service |
a1973e |
printf( "%lld ", vals[i] );
|
|
Packit Service |
a1973e |
printf( "\n\n" );
|
|
Packit Service |
a1973e |
ovrflow = vals[0];
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int
|
|
Packit Service |
a1973e |
main( int argc, char *argv[] )
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
int EventSet = PAPI_NULL;
|
|
Packit Service |
a1973e |
int retval, i, dash = 0, evt3 = PAPI_L1_DCM;
|
|
Packit Service |
a1973e |
PAPI_option_t options;
|
|
Packit Service |
a1973e |
PAPI_option_t options2;
|
|
Packit Service |
a1973e |
const PAPI_hw_info_t *hwinfo;
|
|
Packit Service |
a1973e |
long long lwrflow = 0, error, max_error = 0;
|
|
Packit Service |
a1973e |
long long vals[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
tests_quiet( argc, argv ); /* Set TESTS_QUIET variable */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = PAPI_library_init( PAPI_VER_CURRENT );
|
|
Packit Service |
a1973e |
if ( retval != PAPI_VER_CURRENT && retval > 0 )
|
|
Packit Service |
a1973e |
test_fail( __FILE__, __LINE__, "PAPI_library_init", retval );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = PAPI_get_opt( PAPI_HWINFO, &options );
|
|
Packit Service |
a1973e |
if ( retval < 0 )
|
|
Packit Service |
a1973e |
test_fail( __FILE__, __LINE__, "PAPI_get_opt", retval );
|
|
Packit Service |
a1973e |
printf( "ovf_info = %d (%#x)\n", options.ovf_info.type,
|
|
Packit Service |
a1973e |
options.ovf_info.type );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = PAPI_get_opt( PAPI_SUBSTRATEINFO, &options2 );
|
|
Packit Service |
a1973e |
if ( retval < 0 )
|
|
Packit Service |
a1973e |
test_fail( __FILE__, __LINE__, "PAPI_get_opt", retval );
|
|
Packit Service |
a1973e |
printf( "sub_info->hardware_intr = %d\n\n",
|
|
Packit Service |
a1973e |
options2.sub_info->hardware_intr );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
if ( ( hwinfo = PAPI_get_hardware_info( ) ) == NULL )
|
|
Packit Service |
a1973e |
test_fail( __FILE__, __LINE__, "PAPI_get_hardware_info", PAPI_EMISC );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
printf( "Architecture %s, %d\n", hwinfo->model_string, hwinfo->model );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* processing exceptions is a pain */
|
|
Packit Service |
a1973e |
#if ((defined(linux) && (defined(__i386__) || (defined __x86_64__))) )
|
|
Packit Service |
a1973e |
if ( !strncmp( hwinfo->model_string, "Intel Pentium 4", 15 ) ) {
|
|
Packit Service |
a1973e |
evt3 = PAPI_L2_TCM;
|
|
Packit Service |
a1973e |
} else if ( !strncmp( hwinfo->model_string, "AMD K7", 6 ) ) {
|
|
Packit Service |
a1973e |
/* do nothing */
|
|
Packit Service |
a1973e |
} else if ( !strncmp( hwinfo->model_string, "AMD K8", 6 ) ) {
|
|
Packit Service |
a1973e |
/* do nothing */
|
|
Packit Service |
a1973e |
} else if ( !strncmp( hwinfo->model_string, "Intel Core", 10 ) ) {
|
|
Packit Service |
a1973e |
evt3 = 0;
|
|
Packit Service |
a1973e |
} else
|
|
Packit Service |
a1973e |
evt3 = 0; /* for default PIII */
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = PAPI_create_eventset( &EventSet );
|
|
Packit Service |
a1973e |
if ( retval < 0 )
|
|
Packit Service |
a1973e |
test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = PAPI_add_event( EventSet, PAPI_TOT_INS );
|
|
Packit Service |
a1973e |
if ( retval < 0 )
|
|
Packit Service |
a1973e |
test_fail( __FILE__, __LINE__, "PAPI_add_event:PAPI_TOT_INS", retval );
|
|
Packit Service |
a1973e |
retval = PAPI_add_event( EventSet, PAPI_TOT_CYC );
|
|
Packit Service |
a1973e |
if ( retval < 0 )
|
|
Packit Service |
a1973e |
test_fail( __FILE__, __LINE__, "PAPI_add_event:PAPI_TOT_CYC", retval );
|
|
Packit Service |
a1973e |
if ( evt3 ) {
|
|
Packit Service |
a1973e |
retval = PAPI_add_event( EventSet, evt3 );
|
|
Packit Service |
a1973e |
if ( retval < 0 )
|
|
Packit Service |
a1973e |
test_fail( __FILE__, __LINE__, "PAPI_add_event:evt3", retval );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
retval = PAPI_overflow( EventSet, PAPI_TOT_INS, OVRFLOW, 0, handler );
|
|
Packit Service |
a1973e |
if ( retval < 0 )
|
|
Packit Service |
a1973e |
test_fail( __FILE__, __LINE__, "PAPI_overflow", retval );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = PAPI_start( EventSet );
|
|
Packit Service |
a1973e |
if ( retval < 0 )
|
|
Packit Service |
a1973e |
test_fail( __FILE__, __LINE__, "PAPI_start", retval );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
for ( i = 0; i < 1000000; i++ ) {
|
|
Packit Service |
a1973e |
if ( i % 1000 == 0 ) {
|
|
Packit Service |
a1973e |
int i;
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
PAPI_read( EventSet, vals );
|
|
Packit Service |
a1973e |
if ( vals[0] % OVRFLOW > LOWERFLOW ||
|
|
Packit Service |
a1973e |
vals[0] % OVRFLOW < UPPERFLOW ) {
|
|
Packit Service |
a1973e |
dash = 0;
|
|
Packit Service |
a1973e |
printf( "Main loop read vals :" );
|
|
Packit Service |
a1973e |
for ( i = 0; i < 3 /* 8 */ ; i++ )
|
|
Packit Service |
a1973e |
printf( "%lld ", vals[i] );
|
|
Packit Service |
a1973e |
printf( "\n" );
|
|
Packit Service |
a1973e |
if ( ovrflow ) {
|
|
Packit Service |
a1973e |
error = ovrflow - ( lwrflow + vals[0] ) / 2;
|
|
Packit Service |
a1973e |
printf( "Difference: %lld\n", error );
|
|
Packit Service |
a1973e |
ovrflow = 0;
|
|
Packit Service |
a1973e |
if ( abs( error ) > max_error )
|
|
Packit Service |
a1973e |
max_error = abs( error );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
lwrflow = vals[0];
|
|
Packit Service |
a1973e |
} else if ( vals[0] % OVRFLOW > UPPERFLOW && !dash ) {
|
|
Packit Service |
a1973e |
dash = 1;
|
|
Packit Service |
a1973e |
printf( "---------------------\n" );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = PAPI_stop( EventSet, vals );
|
|
Packit Service |
a1973e |
if ( retval != PAPI_OK )
|
|
Packit Service |
a1973e |
test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = PAPI_cleanup_eventset( EventSet );
|
|
Packit Service |
a1973e |
if ( retval != PAPI_OK )
|
|
Packit Service |
a1973e |
test_fail( __FILE__, __LINE__, "PAPI_cleanup_eventset", retval );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
retval = PAPI_destroy_eventset( &EventSet );
|
|
Packit Service |
a1973e |
if ( retval != PAPI_OK )
|
|
Packit Service |
a1973e |
test_fail( __FILE__, __LINE__, "PAPI_destroy_eventset", retval );
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
printf( "Verification:\n" );
|
|
Packit Service |
a1973e |
printf
|
|
Packit Service |
a1973e |
( "Maximum absolute difference between overflow value\nand adjacent measured values is: %lld\n",
|
|
Packit Service |
a1973e |
max_error );
|
|
Packit Service |
a1973e |
if ( max_error >= ERRORFLOW ) {
|
|
Packit Service |
a1973e |
printf( "This exceeds the error limit: %d\n", ERRORFLOW );
|
|
Packit Service |
a1973e |
test_fail( __FILE__, __LINE__, "Overflows", 1 );
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
printf( "This is within the error limit: %d\n", ERRORFLOW );
|
|
Packit Service |
a1973e |
test_pass( __FILE__, NULL, 0 );
|
|
Packit Service |
a1973e |
exit( 1 );
|
|
Packit Service |
a1973e |
}
|