Blame src/utils/papi_event_chooser.c

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
}