|
Packit |
577717 |
/** file event_chooser.c
|
|
Packit |
577717 |
* @brief papi_event_chooser utility.
|
|
Packit |
577717 |
* @page papi_event_chooser
|
|
Packit |
577717 |
* @section NAME
|
|
Packit |
577717 |
* papi_event_chooser - given a list of named events,
|
|
Packit |
577717 |
* lists other events that can be counted with them.
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* @section Synopsis
|
|
Packit |
577717 |
* papi_event_chooser NATIVE | PRESET < event > < event > ...
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* @section Description
|
|
Packit |
577717 |
* papi_event_chooser is a PAPI utility program that reports information
|
|
Packit |
577717 |
* about the current PAPI installation and supported preset events.
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* @section Options
|
|
Packit |
577717 |
* This utility has no command line options.
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* @section Bugs
|
|
Packit |
577717 |
* There are no known bugs in this utility.
|
|
Packit |
577717 |
* If you find a bug, it should be reported to the
|
|
Packit |
577717 |
* 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 "print_header.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int EventSet = PAPI_NULL;
|
|
Packit |
577717 |
int retval;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static char *
|
|
Packit |
577717 |
is_derived( PAPI_event_info_t * info )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
if ( strlen( info->derived ) == 0 )
|
|
Packit |
577717 |
return ( "No" );
|
|
Packit |
577717 |
else if ( strcmp( info->derived, "NOT_DERIVED" ) == 0 )
|
|
Packit |
577717 |
return ( "No" );
|
|
Packit |
577717 |
else if ( strcmp( info->derived, "DERIVED_CMPD" ) == 0 )
|
|
Packit |
577717 |
return ( "No" );
|
|
Packit |
577717 |
else
|
|
Packit |
577717 |
return ( "Yes" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
add_remove_event( int EventSet, int evt )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int retval;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_add_event( EventSet, evt ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
//printf( "Error adding event.\n" );
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
if ( ( retval = PAPI_remove_event( EventSet, evt ) ) != PAPI_OK ) {
|
|
Packit |
577717 |
printf( "Error removing event.\n" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return retval;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
show_event_info( int evt )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int k;
|
|
Packit |
577717 |
int retval;
|
|
Packit |
577717 |
PAPI_event_info_t info;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( retval = PAPI_get_event_info( evt, &info ) ) == PAPI_OK ) {
|
|
Packit |
577717 |
printf( "%s\t%#x\n |%s|\n",
|
|
Packit |
577717 |
info.symbol, info.event_code, info.long_descr );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for( k = 0; k < ( int ) info.count; k++ ) {
|
|
Packit |
577717 |
if ( strlen( info.name[k] ) ) {
|
|
Packit |
577717 |
printf( " |Register Value[%d]: %#-10x %s|\n",
|
|
Packit |
577717 |
k, info.code[k], info.name[k] );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return retval;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
native( int cidx )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i, j, k;
|
|
Packit |
577717 |
int retval, added;
|
|
Packit |
577717 |
PAPI_event_info_t info;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
j = 0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* For platform independence, always ASK FOR the first event */
|
|
Packit |
577717 |
/* Don't just assume it'll be the first numeric value */
|
|
Packit |
577717 |
i = 0 | PAPI_NATIVE_MASK;
|
|
Packit |
577717 |
retval=PAPI_enum_cmp_event( &i, PAPI_ENUM_FIRST, cidx );
|
|
Packit |
577717 |
if (retval==PAPI_ENOEVNT) {
|
|
Packit |
577717 |
printf("Cannot find first event in component %d\n",cidx);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do {
|
|
Packit |
577717 |
k = i;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( PAPI_enum_cmp_event( &k, PAPI_NTV_ENUM_UMASKS, cidx) == PAPI_OK ) {
|
|
Packit |
577717 |
if ( ( added = add_remove_event( EventSet, k ) ) == PAPI_OK ) {
|
|
Packit |
577717 |
show_event_info( i );
|
|
Packit |
577717 |
do {
|
|
Packit |
577717 |
retval = PAPI_get_event_info( k, &info );
|
|
Packit |
577717 |
if ( retval == PAPI_OK ) {
|
|
Packit |
577717 |
printf( " %#-10x%s |%s|\n", info.event_code,
|
|
Packit |
577717 |
strchr( info.symbol, ':' ),
|
|
Packit |
577717 |
strchr( info.long_descr, ':' ) + 1 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
} while ( PAPI_enum_cmp_event( &k, PAPI_NTV_ENUM_UMASKS, cidx ) ==
|
|
Packit |
577717 |
PAPI_OK );
|
|
Packit |
577717 |
j++;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
if ( ( added = add_remove_event( EventSet, i ) ) == PAPI_OK ) {
|
|
Packit |
577717 |
show_event_info( i );
|
|
Packit |
577717 |
j++;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( added == PAPI_OK ) {
|
|
Packit |
577717 |
/* modifier = PAPI_NTV_ENUM_GROUPS returns event codes with a
|
|
Packit |
577717 |
groups id for each group in which this
|
|
Packit |
577717 |
native event lives, in bits 16 - 23 of event code
|
|
Packit |
577717 |
terminating with PAPI_ENOEVNT at the end of the list.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
k = i;
|
|
Packit |
577717 |
if ( PAPI_enum_cmp_event( &k, PAPI_NTV_ENUM_GROUPS, cidx ) == PAPI_OK ) {
|
|
Packit |
577717 |
printf( "Groups: " );
|
|
Packit |
577717 |
do {
|
|
Packit |
577717 |
printf( "%4d", ( ( k & PAPI_NTV_GROUP_AND_MASK ) >>
|
|
Packit |
577717 |
PAPI_NTV_GROUP_SHIFT ) - 1 );
|
|
Packit |
577717 |
} while ( PAPI_enum_cmp_event( &k, PAPI_NTV_ENUM_GROUPS, cidx ) ==
|
|
Packit |
577717 |
PAPI_OK );
|
|
Packit |
577717 |
printf( "\n" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "---------------------------------------------"
|
|
Packit |
577717 |
"----------------------------\n" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
} while ( PAPI_enum_cmp_event( &i, PAPI_ENUM_EVENTS, cidx ) == PAPI_OK );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( "------------------------------------------"
|
|
Packit |
577717 |
"-------------------------------\n" );
|
|
Packit |
577717 |
printf( "Total events reported: %d\n", j );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
exit( 0 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
preset( void )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i, j = 0;
|
|
Packit |
577717 |
int retval;
|
|
Packit |
577717 |
PAPI_event_info_t info;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf( " Name Code " );
|
|
Packit |
577717 |
printf( "Deriv Description (Note)\n" );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* For consistency, always ASK FOR the first event */
|
|
Packit |
577717 |
i = 0 | PAPI_PRESET_MASK;
|
|
Packit |
577717 |
PAPI_enum_event( &i, PAPI_ENUM_FIRST );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
do {
|
|
Packit |
577717 |
retval = PAPI_add_event( EventSet, i );
|
|
Packit |
577717 |
if ( retval == PAPI_OK ) {
|
|
Packit |
577717 |
if ( PAPI_get_event_info( i, &info ) == PAPI_OK ) {
|
|
Packit |
577717 |
printf( "%-13s%#x %-5s%s",
|
|
Packit |
577717 |
info.symbol,
|
|
Packit |
577717 |
info.event_code, is_derived( &info ), info.long_descr );
|
|
Packit |
577717 |
if ( info.note[0] )
|
|
Packit |
577717 |
printf( " (%s)", info.note );
|
|
Packit |
577717 |
printf( "\n" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if ( ( retval = PAPI_remove_event( EventSet, i ) ) != PAPI_OK )
|
|
Packit |
577717 |
printf( "Error in PAPI_remove_event\n" );
|
|
Packit |
577717 |
j++;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
} while ( PAPI_enum_event( &i, PAPI_PRESET_ENUM_AVAIL ) == PAPI_OK );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
printf
|
|
Packit |
577717 |
( "-------------------------------------------------------------------------\n" );
|
|
Packit |
577717 |
printf( "Total events reported: %d\n", j );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
exit( 0 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
main( int argc, char **argv )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
int pevent,cevent;
|
|
Packit |
577717 |
int cidx;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
const PAPI_hw_info_t *hwinfo = NULL;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( argc < 3 ) {
|
|
Packit |
577717 |
goto use_exit;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Init PAPI library */
|
|
Packit |
577717 |
retval = PAPI_library_init( PAPI_VER_CURRENT );
|
|
Packit |
577717 |
if ( retval != PAPI_VER_CURRENT ) {
|
|
Packit |
577717 |
fprintf(stderr,"Error! PAPI_library_init\n");
|
|
Packit |
577717 |
return retval;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_set_debug( PAPI_VERB_ECONT );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr,"Error! PAPI_set_debug\n");
|
|
Packit |
577717 |
return retval;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = papi_print_header( "Event Chooser: Available events "
|
|
Packit |
577717 |
"which can be added with given events.\n",
|
|
Packit |
577717 |
&hwinfo );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf(stderr, "Error! PAPI_get_hardware_info\n");
|
|
Packit |
577717 |
return 2;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_create_eventset( &EventSet );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf( stderr, "PAPI_create_eventset error\n" );
|
|
Packit |
577717 |
return 1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval = PAPI_event_name_to_code( argv[2], &cevent );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf( stderr, "Event %s can't be found\n", argv[2] );
|
|
Packit |
577717 |
return 1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
cidx = PAPI_get_event_component(cevent);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for( i = 2; i < argc; i++ ) {
|
|
Packit |
577717 |
retval = PAPI_event_name_to_code( argv[i], &pevent );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf( stderr, "Event %s can't be found\n", argv[i] );
|
|
Packit |
577717 |
return 1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
retval = PAPI_add_event( EventSet, pevent );
|
|
Packit |
577717 |
if ( retval != PAPI_OK ) {
|
|
Packit |
577717 |
fprintf( stderr, "Event %s can't be counted with others %d\n",
|
|
Packit |
577717 |
argv[i], retval );
|
|
Packit |
577717 |
return 1;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( !strcmp( "NATIVE", argv[1] ) ) {
|
|
Packit |
577717 |
native( cidx );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
else if ( !strcmp( "PRESET", argv[1] ) ) {
|
|
Packit |
577717 |
preset( );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
else {
|
|
Packit |
577717 |
goto use_exit;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return 0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
use_exit:
|
|
Packit |
577717 |
fprintf( stderr,
|
|
Packit |
577717 |
"Usage: papi_event_chooser NATIVE|PRESET evt1 evt2 ... \n" );
|
|
Packit |
577717 |
return 1;
|
|
Packit |
577717 |
}
|