Blame src/utils/papi_command_line.c

Packit 577717
/* file papi_command_line.c
Packit 577717
 * This simply tries to add the events listed on the command line one at a time
Packit 577717
 * then starts and stops the counters and prints the results
Packit 577717
*/
Packit 577717
Packit 577717
/**
Packit 577717
  *	@page papi_command_line
Packit 577717
  * @brief executes PAPI preset or native events from the command line.
Packit 577717
  *
Packit 577717
  *	@section Synopsis
Packit 577717
  *		papi_command_line < event > < event > ...
Packit 577717
  *
Packit 577717
  *	@section Description
Packit 577717
  *		papi_command_line is a PAPI utility program that adds named events from the 
Packit 577717
  *		command line to a PAPI EventSet and does some work with that EventSet. 
Packit 577717
  *		This serves as a handy way to see if events can be counted together, 
Packit 577717
  *		and if they give reasonable results for known work.
Packit 577717
  *
Packit 577717
  *	@section Options
Packit 577717
  * 
    Packit 577717
      *		
  • -u Display output values as unsigned integers
  • Packit 577717
      *		
  • -x Display output values as hexadecimal
  • Packit 577717
      *		
  • -h Display help information about this utility.
  • Packit 577717
      *	
    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 "do_loops.h"
    Packit 577717
    Packit 577717
    static void
    Packit 577717
    print_help( char **argv )
    Packit 577717
    {
    Packit 577717
    	printf( "Usage: %s [options] [EVENTNAMEs]\n", argv[0] );
    Packit 577717
    	printf( "Options:\n\n" );
    Packit 577717
    	printf( "General command options:\n" );
    Packit 577717
    	printf( "\t-u          Display output values as unsigned integers\n" );
    Packit 577717
    	printf( "\t-x          Display output values as hexadecimal\n" );
    Packit 577717
    	printf( "\t-h          Print this help message\n" );
    Packit 577717
    	printf( "\tEVENTNAMEs  Specify one or more preset or native events\n" );
    Packit 577717
    	printf( "\n" );
    Packit 577717
    	printf( "This utility performs work while measuring the specified events.\n" );
    Packit 577717
    	printf( "It can be useful for sanity checks on given events and sets of events.\n" );
    Packit 577717
    }
    Packit 577717
    Packit 577717
    Packit 577717
    int
    Packit 577717
    main( int argc, char **argv )
    Packit 577717
    {
    Packit 577717
    	int retval;
    Packit 577717
    	int num_events;
    Packit 577717
    	long long *values;
    Packit 577717
    	char *success;
    Packit 577717
    	PAPI_event_info_t info;
    Packit 577717
    	int EventSet = PAPI_NULL;
    Packit 577717
    	int i, j, event, data_type = PAPI_DATATYPE_INT64;
    Packit 577717
    	int u_format = 0;
    Packit 577717
    	int hex_format = 0;
    Packit 577717
    Packit 577717
    	printf( "\nThis utility lets you add events from the command line "
    Packit 577717
    		"interface to see if they work.\n\n" );
    Packit 577717
    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
    		exit(retval );
    Packit 577717
    	}
    Packit 577717
    Packit 577717
    	retval = PAPI_create_eventset( &EventSet );
    Packit 577717
    	if (retval != PAPI_OK ) {
    Packit 577717
    		fprintf(stderr,"Error! PAPI_create_eventset\n");
    Packit 577717
    		exit(retval );
    Packit 577717
    	}
    Packit 577717
    Packit 577717
    	values =
    Packit 577717
    		( long long * ) malloc( sizeof ( long long ) * ( size_t ) argc );
    Packit 577717
    	success = ( char * ) malloc( ( size_t ) argc );
    Packit 577717
    Packit 577717
    	if ( success == NULL || values == NULL ) {
    Packit 577717
    		fprintf(stderr,"Error allocating memory!\n");
    Packit 577717
    		exit(1);
    Packit 577717
    	}
    Packit 577717
    Packit 577717
    	for ( num_events = 0, i = 1; i < argc; i++ ) {
    Packit 577717
    		if ( !strcmp( argv[i], "-h" ) ) {
    Packit 577717
    			print_help( argv );
    Packit 577717
    			exit( 1 );
    Packit 577717
    		} else if ( !strcmp( argv[i], "-u" ) ) {
    Packit 577717
    			u_format = 1;
    Packit 577717
    		} else if ( !strcmp( argv[i], "-x" ) ) {
    Packit 577717
    			hex_format = 1;
    Packit 577717
    		} else {
    Packit 577717
    			if ( ( retval = PAPI_add_named_event( EventSet, argv[i] ) ) != PAPI_OK ) {
    Packit 577717
    				printf( "Failed adding: %s\nbecause: %s\n", argv[i], 
    Packit 577717
    					PAPI_strerror(retval));
    Packit 577717
    			} else {
    Packit 577717
    				success[num_events++] = i;
    Packit 577717
    				printf( "Successfully added: %s\n", argv[i] );
    Packit 577717
    			}
    Packit 577717
    		}
    Packit 577717
    	}
    Packit 577717
    Packit 577717
    	/* Automatically pass if no events, for run_tests.sh */
    Packit 577717
    	if ( num_events == 0 ) {
    Packit 577717
    		printf("No events specified!\n");
    Packit 577717
    		printf("Try running something like: %s PAPI_TOT_CYC\n\n",
    Packit 577717
    			argv[0]);
    Packit 577717
    		return 0;
    Packit 577717
    	}
    Packit 577717
    Packit 577717
    Packit 577717
    	printf( "\n" );
    Packit 577717
    Packit 577717
    	do_flops( 1 );
    Packit 577717
    	do_flush(  );
    Packit 577717
    Packit 577717
    	retval = PAPI_start( EventSet );
    Packit 577717
    	if (retval != PAPI_OK ) {
    Packit 577717
    		fprintf(stderr,"Error! PAPI_start\n");
    Packit 577717
    		exit( retval );
    Packit 577717
    	}
    Packit 577717
    Packit 577717
    	do_flops( NUM_FLOPS );
    Packit 577717
    	do_misses( 1, L1_MISS_BUFFER_SIZE_INTS );
    Packit 577717
    Packit 577717
    	retval = PAPI_stop( EventSet, values );
    Packit 577717
    	if (retval != PAPI_OK ) {
    Packit 577717
    		fprintf(stderr,"Error! PAPI_stop\n");
    Packit 577717
    		exit( retval );
    Packit 577717
    	}
    Packit 577717
    Packit 577717
    	for ( j = 0; j < num_events; j++ ) {
    Packit 577717
    		i = success[j];
    Packit 577717
    		if (! (u_format || hex_format) ) {
    Packit 577717
    			retval = PAPI_event_name_to_code( argv[i], &event );
    Packit 577717
    			if (retval == PAPI_OK) {
    Packit 577717
    				retval = PAPI_get_event_info(event, &info;;
    Packit 577717
    				if (retval == PAPI_OK) data_type = info.data_type;
    Packit 577717
    				else data_type = PAPI_DATATYPE_INT64;
    Packit 577717
    			}
    Packit 577717
    			switch (data_type) {
    Packit 577717
    			  case PAPI_DATATYPE_UINT64:
    Packit 577717
    				printf( "%s : \t%llu(u)", argv[i], (unsigned long long)values[j] );
    Packit 577717
    				break;
    Packit 577717
    			  case PAPI_DATATYPE_FP64:
    Packit 577717
    				printf( "%s : \t%0.3f", argv[i], *((double *)(&values[j])) );
    Packit 577717
    				break;
    Packit 577717
    			  case PAPI_DATATYPE_BIT64:
    Packit 577717
    				printf( "%s : \t%#llX", argv[i], values[j] );
    Packit 577717
    				break;
    Packit 577717
    			  case PAPI_DATATYPE_INT64:
    Packit 577717
    			  default:
    Packit 577717
    				printf( "%s : \t%lld", argv[i], values[j] );
    Packit 577717
    				break;
    Packit 577717
    			}
    Packit 577717
    			if (retval == PAPI_OK)  printf( " %s", info.units );
    Packit 577717
    			printf( "\n" );
    Packit 577717
    		}
    Packit 577717
    		if (u_format) printf( "%s : \t%llu(u)\n", argv[i], (unsigned long long)values[j] );
    Packit 577717
    		if (hex_format) printf( "%s : \t%#llX\n", argv[i], values[j] );
    Packit 577717
    	}
    Packit 577717
    Packit 577717
    	printf( "\n----------------------------------\n" );
    Packit 577717
    Packit 577717
    	return 0;
    Packit 577717
    Packit 577717
    }