Blame src/examples/PAPI_overflow.c

Packit Service a1973e
/*****************************************************************************
Packit Service a1973e
* This example shows how to use PAPI_overflow to set up an event set to      *
Packit Service a1973e
* begin registering overflows.
Packit Service a1973e
******************************************************************************/
Packit Service a1973e
Packit Service a1973e
#include <stdio.h>
Packit Service a1973e
#include <stdlib.h>
Packit Service a1973e
#include "papi.h"		/* This needs to be included every time you use PAPI */
Packit Service a1973e
#include <pthread.h>
Packit Service a1973e
Packit Service a1973e
#define OVER_FMT    "handler(%d ) Overflow at %p! bit=%#llx \n"
Packit Service a1973e
#define THRESHOLD 100000 
Packit Service a1973e
#define ERROR_RETURN(retval) { fprintf(stderr, "Error %d %s:line %d: \n", retval,__FILE__,__LINE__);  exit(retval); }
Packit Service a1973e
Packit Service a1973e
int total = 0;	/* we use total to track the amount of overflows that occured */
Packit Service a1973e
Packit Service a1973e
/* THis is the handler called by PAPI_overflow*/
Packit Service a1973e
void
Packit Service a1973e
handler(int EventSet, void *address, long long overflow_vector, void *context)
Packit Service a1973e
{
Packit Service a1973e
   fprintf(stderr, OVER_FMT, EventSet, address, overflow_vector);
Packit Service a1973e
   total++;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
int main ()
Packit Service a1973e
{
Packit Service a1973e
   int EventSet = PAPI_NULL;	
Packit Service a1973e
   /* must be set to null before calling PAPI_create_eventset */
Packit Service a1973e
Packit Service a1973e
   char errstring[PAPI_MAX_STR_LEN];
Packit Service a1973e
   long long (values[2])[2];
Packit Service a1973e
   int retval, i;
Packit Service a1973e
   double tmp = 0;
Packit Service a1973e
   int PAPI_event;		/* a place holder for an event preset */
Packit Service a1973e
   char event_name[PAPI_MAX_STR_LEN];
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
   /****************************************************************************
Packit Service a1973e
   *  This part initializes the library and compares the version number of the *
Packit Service a1973e
   * header file, to the version of the library, if these don't match then it  *
Packit Service a1973e
   * is likely that PAPI won't work correctly.If there is an error, retval     *
Packit Service a1973e
   * keeps track of the version number.                                        *
Packit Service a1973e
   ****************************************************************************/
Packit Service a1973e
Packit Service a1973e
   if ((retval = PAPI_library_init (PAPI_VER_CURRENT)) != PAPI_VER_CURRENT)
Packit Service a1973e
   {
Packit Service a1973e
      printf("Library initialization error! \n");
Packit Service a1973e
      exit(1);
Packit Service a1973e
   }
Packit Service a1973e
Packit Service a1973e
   /* Here we create the eventset */
Packit Service a1973e
   if ((retval=PAPI_create_eventset (&EventSet)) != PAPI_OK)
Packit Service a1973e
      ERROR_RETURN(retval);
Packit Service a1973e
Packit Service a1973e
   PAPI_event = PAPI_TOT_INS;
Packit Service a1973e
Packit Service a1973e
   /* Here we are querying for the existence of the PAPI presets  */
Packit Service a1973e
   if (PAPI_query_event (PAPI_TOT_INS) != PAPI_OK)
Packit Service a1973e
   {
Packit Service a1973e
      PAPI_event = PAPI_TOT_CYC;
Packit Service a1973e
Packit Service a1973e
      if ((retval=PAPI_query_event (PAPI_TOT_INS)) != PAPI_OK)
Packit Service a1973e
         ERROR_RETURN(retval);
Packit Service a1973e
Packit Service a1973e
      printf ("PAPI_TOT_INS not available on this platform.");
Packit Service a1973e
      printf (" so subst PAPI_event with PAPI_TOT_CYC !\n\n");
Packit Service a1973e
Packit Service a1973e
   }
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
   /* PAPI_event_code_to_name is used to convert a PAPI preset from 
Packit Service a1973e
     its integer value to its string name. */
Packit Service a1973e
   if ((retval = PAPI_event_code_to_name (PAPI_event, event_name)) != PAPI_OK)
Packit Service a1973e
      ERROR_RETURN(retval);
Packit Service a1973e
Packit Service a1973e
   /* add event to the event set */
Packit Service a1973e
   if ((retval = PAPI_add_event (EventSet, PAPI_event)) != PAPI_OK)
Packit Service a1973e
      ERROR_RETURN(retval);
Packit Service a1973e
Packit Service a1973e
   /* register overflow and set up threshold */
Packit Service a1973e
   /* The threshold "THRESHOLD" was set to 100000 */
Packit Service a1973e
   if ((retval = PAPI_overflow (EventSet, PAPI_event, THRESHOLD, 0,
Packit Service a1973e
		                       handler)) != PAPI_OK)
Packit Service a1973e
      ERROR_RETURN(retval);
Packit Service a1973e
Packit Service a1973e
   printf ("Here are the addresses at which overflows occured and overflow vectors \n");
Packit Service a1973e
  printf ("--------------------------------------------------------------\n");
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
  /* Start counting */
Packit Service a1973e
Packit Service a1973e
   if ( (retval=PAPI_start (EventSet)) != PAPI_OK)
Packit Service a1973e
      ERROR_RETURN(retval);
Packit Service a1973e
Packit Service a1973e
   for (i = 0; i < 2000000; i++)
Packit Service a1973e
   {
Packit Service a1973e
      tmp = 1.01 + tmp;
Packit Service a1973e
      tmp++;
Packit Service a1973e
   }
Packit Service a1973e
Packit Service a1973e
   /* Stops the counters and reads the counter values into the values array */
Packit Service a1973e
   if ( (retval=PAPI_stop (EventSet, values[0])) != PAPI_OK)
Packit Service a1973e
      ERROR_RETURN(retval);
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
   printf ("The total no of overflows was %d\n", total);
Packit Service a1973e
Packit Service a1973e
   /* clear the overflow status */
Packit Service a1973e
   if ((retval = PAPI_overflow (EventSet, PAPI_event, 0, 0,
Packit Service a1973e
		                       handler)) != PAPI_OK)
Packit Service a1973e
      ERROR_RETURN(retval);
Packit Service a1973e
Packit Service a1973e
   /************************************************************************
Packit Service a1973e
    * PAPI_cleanup_eventset can only be used after the counter has been    *
Packit Service a1973e
    * stopped then it remove all events in the eventset                    *
Packit Service a1973e
    ************************************************************************/
Packit Service a1973e
   if ( (retval=PAPI_cleanup_eventset (EventSet)) != PAPI_OK)
Packit Service a1973e
      ERROR_RETURN(retval);
Packit Service a1973e
Packit Service a1973e
   /* Free all memory and data structures, EventSet must be empty. */
Packit Service a1973e
   if ( (retval=PAPI_destroy_eventset(&EventSet)) != PAPI_OK)
Packit Service a1973e
      ERROR_RETURN(retval);
Packit Service a1973e
Packit Service a1973e
   /* free the resources used by PAPI */ 
Packit Service a1973e
   PAPI_shutdown();
Packit Service a1973e
Packit Service a1973e
   exit(0);
Packit Service a1973e
}