/***************************************************************************** * This example code shows how to use most of PAPI's High level functions * * to start,count,read and stop on an event set. We use two preset events * * here: * * PAPI_TOT_INS: Total instructions executed in a period of time * * PAPI_TOT_CYC: Total cpu cycles in a period of time * ******************************************************************************/ #include #include #include "papi.h" #define NUM_EVENTS 2 #define THRESHOLD 10000 #define ERROR_RETURN(retval) { fprintf(stderr, "Error %d %s:line %d: \n", retval,__FILE__,__LINE__); exit(retval); } /* stupid codes to be monitored */ void computation_mult() { double tmp=1.0; int i=1; for( i = 1; i < THRESHOLD; i++ ) { tmp = tmp*i; } } /* stupid codes to be monitored */ void computation_add() { int tmp = 0; int i=0; for( i = 0; i < THRESHOLD; i++ ) { tmp = tmp + i; } } int main() { /*Declaring and initializing the event set with the presets*/ int Events[2] = {PAPI_TOT_INS, PAPI_TOT_CYC}; /*The length of the events array should be no longer than the value returned by PAPI_num_counters.*/ /*declaring place holder for no of hardware counters */ int num_hwcntrs = 0; int retval; char errstring[PAPI_MAX_STR_LEN]; /*This is going to store our list of results*/ long long values[NUM_EVENTS]; /*************************************************************************** * This part initializes the library and compares the version number of the* * header file, to the version of the library, if these don't match then it * * is likely that PAPI won't work correctly.If there is an error, retval * * keeps track of the version number. * ***************************************************************************/ if((retval = PAPI_library_init(PAPI_VER_CURRENT)) != PAPI_VER_CURRENT ) { fprintf(stderr, "Error: %d %s\n",retval, errstring); exit(1); } /************************************************************************** * PAPI_num_counters returns the number of hardware counters the platform * * has or a negative number if there is an error * **************************************************************************/ if ((num_hwcntrs = PAPI_num_counters()) < PAPI_OK) { printf("There are no counters available. \n"); exit(1); } printf("There are %d counters in this system\n",num_hwcntrs); /************************************************************************** * PAPI_start_counters initializes the PAPI library (if necessary) and * * starts counting the events named in the events array. This function * * implicitly stops and initializes any counters running as a result of * * a previous call to PAPI_start_counters. * **************************************************************************/ if ( (retval = PAPI_start_counters(Events, NUM_EVENTS)) != PAPI_OK) ERROR_RETURN(retval); printf("\nCounter Started: \n"); /* Your code goes here*/ computation_add(); /********************************************************************** * PAPI_read_counters reads the counter values into values array * **********************************************************************/ if ( (retval=PAPI_read_counters(values, NUM_EVENTS)) != PAPI_OK) ERROR_RETURN(retval); printf("Read successfully\n"); printf("The total instructions executed for addition are %lld \n",values[0]); printf("The total cycles used are %lld \n", values[1] ); printf("\nNow we try to use PAPI_accum to accumulate values\n"); /* Do some computation here */ computation_add(); /************************************************************************ * What PAPI_accum_counters does is it adds the running counter values * * to what is in the values array. The hardware counters are reset and * * left running after the call. * ************************************************************************/ if ( (retval=PAPI_accum_counters(values, NUM_EVENTS)) != PAPI_OK) ERROR_RETURN(retval); printf("We did an additional %d times addition!\n", THRESHOLD); printf("The total instructions executed for addition are %lld \n", values[0] ); printf("The total cycles used are %lld \n", values[1] ); /*********************************************************************** * Stop counting events(this reads the counters as well as stops them * ***********************************************************************/ printf("\nNow we try to do some multiplications\n"); computation_mult(); /******************* PAPI_stop_counters **********************************/ if ((retval=PAPI_stop_counters(values, NUM_EVENTS)) != PAPI_OK) ERROR_RETURN(retval); printf("The total instruction executed for multiplication are %lld \n", values[0] ); printf("The total cycles used are %lld \n", values[1] ); exit(0); }