Blame src/examples/multiplex.c

Packit 577717
/****************************************************************************
Packit 577717
 * Multiplexing allows more counters to be used than what is supported by   *
Packit 577717
 * the platform, thus allowing a larger number of events to be counted      *
Packit 577717
 * simultaneously. When a microprocessor has a very limited number of       *
Packit 577717
 * counters that can be counted simultaneously, a large application with    *
Packit 577717
 * many hours of run time may require days of profiling in order to gather  *
Packit 577717
 * enough information to base a performance analysis. Multiplexing overcomes*
Packit 577717
 * this limitation by the usage of the counters over timesharing.           *
Packit 577717
 * This is an example demonstrating how to use PAPI_set_multiplex to        *
Packit 577717
 * convert a standard event set to a multiplexed event set.                 *
Packit 577717
 ****************************************************************************/ 
Packit 577717
#include <stdlib.h>
Packit 577717
#include <stdio.h>
Packit 577717
#include <unistd.h>
Packit 577717
#include "papi.h"
Packit 577717
Packit 577717
#define ERROR_RETURN(retval) { fprintf(stderr, "Error %d %s:line %d: \n", retval,__FILE__,__LINE__);  exit(retval); }
Packit 577717
Packit 577717
#define NUM_ITERS 10000000
Packit 577717
#define MAX_TO_ADD 6
Packit 577717
Packit 577717
double c = 0.11;
Packit 577717
void do_flops(int n)
Packit 577717
{
Packit 577717
    int i;
Packit 577717
    double a = 0.5;
Packit 577717
    double b = 6.2;
Packit 577717
Packit 577717
    for (i=0; i < n; i++)
Packit 577717
        c += a * b;
Packit 577717
    return;
Packit 577717
}
Packit 577717
Packit 577717
/* Tests that we can really multiplex a lot. */
Packit 577717
int multiplex(void)
Packit 577717
{
Packit 577717
   int retval, i, EventSet = PAPI_NULL, j = 0;
Packit 577717
   long long *values;
Packit 577717
   PAPI_event_info_t pset;
Packit 577717
   int events[MAX_TO_ADD], number;
Packit 577717
Packit 577717
   /* Initialize the library */
Packit 577717
   retval = PAPI_library_init(PAPI_VER_CURRENT);
Packit 577717
   if (retval != PAPI_VER_CURRENT)
Packit 577717
   {
Packit 577717
      printf("Library initialization error! \n");
Packit 577717
      exit(1);
Packit 577717
   }
Packit 577717
Packit 577717
   /* initialize multiplex support */
Packit 577717
   retval = PAPI_multiplex_init();
Packit 577717
   if (retval != PAPI_OK)
Packit 577717
      ERROR_RETURN(retval);
Packit 577717
Packit 577717
   retval = PAPI_create_eventset(&EventSet);
Packit 577717
   if (retval != PAPI_OK)
Packit 577717
      ERROR_RETURN(retval);
Packit 577717
Packit 577717
   /* convert the event set to a multiplex event set */
Packit 577717
   retval = PAPI_set_multiplex(EventSet);
Packit 577717
   if (retval != PAPI_OK)
Packit 577717
      ERROR_RETURN(retval);
Packit 577717
/*
Packit 577717
   retval = PAPI_add_event(EventSet, PAPI_TOT_INS);
Packit 577717
   if ((retval != PAPI_OK) && (retval != PAPI_ECNFLCT))
Packit 577717
      ERROR_RETURN(retval);
Packit 577717
   printf("Adding %s\n", "PAPI_TOT_INS");
Packit 577717
*/
Packit 577717
Packit 577717
   for (i = 0; i < PAPI_MAX_PRESET_EVENTS; i++) 
Packit 577717
   {
Packit 577717
      retval = PAPI_get_event_info(i | PAPI_PRESET_MASK, &pset);
Packit 577717
      if (retval != PAPI_OK)
Packit 577717
         ERROR_RETURN(retval);
Packit 577717
Packit 577717
      if ((pset.count) && (pset.event_code != PAPI_TOT_CYC)) 
Packit 577717
      {
Packit 577717
         printf("Adding %s\n", pset.symbol);
Packit 577717
Packit 577717
         retval = PAPI_add_event(EventSet, pset.event_code);
Packit 577717
         if ((retval != PAPI_OK) && (retval != PAPI_ECNFLCT))
Packit 577717
            ERROR_RETURN(retval);
Packit 577717
Packit 577717
	     if (retval == PAPI_OK) 
Packit 577717
            printf("Added %s\n", pset.symbol);
Packit 577717
	     else 
Packit 577717
            printf("Could not add %s due to resource limitation.\n", 
Packit 577717
                  pset.symbol);
Packit 577717
Packit 577717
         if (retval == PAPI_OK) 
Packit 577717
         {
Packit 577717
            if (++j >= MAX_TO_ADD)
Packit 577717
                break;
Packit 577717
         }
Packit 577717
      }
Packit 577717
   }
Packit 577717
Packit 577717
   values = (long long *) malloc(MAX_TO_ADD * sizeof(long long));
Packit 577717
   if (values == NULL)
Packit 577717
   {
Packit 577717
      printf("Not enough memory available. \n");
Packit 577717
      exit(1);
Packit 577717
   }
Packit 577717
Packit 577717
   if ((retval=PAPI_start(EventSet)) != PAPI_OK)
Packit 577717
      ERROR_RETURN(retval);
Packit 577717
Packit 577717
   do_flops(NUM_ITERS);
Packit 577717
Packit 577717
   retval = PAPI_stop(EventSet, values);
Packit 577717
   if (retval != PAPI_OK)
Packit 577717
      ERROR_RETURN(retval);
Packit 577717
Packit 577717
   /* get the number of events in the event set */
Packit 577717
   number=MAX_TO_ADD;
Packit 577717
   if ( (retval = PAPI_list_events(EventSet, events, &number)) != PAPI_OK)
Packit 577717
      ERROR_RETURN(retval);
Packit 577717
Packit 577717
   /* print the read result */
Packit 577717
   for (i = 0; i < MAX_TO_ADD; i++) 
Packit 577717
   {
Packit 577717
      retval = PAPI_get_event_info(events[i], &pset);
Packit 577717
      if (retval != PAPI_OK)
Packit 577717
         ERROR_RETURN(retval);
Packit 577717
      printf("Event name: %s  value: %lld \n", pset.symbol, values[i]);
Packit 577717
   }
Packit 577717
Packit 577717
   retval = PAPI_cleanup_eventset(EventSet); 
Packit 577717
   if (retval != PAPI_OK)
Packit 577717
      ERROR_RETURN(retval);
Packit 577717
Packit 577717
   retval = PAPI_destroy_eventset(&EventSet);
Packit 577717
   if (retval != PAPI_OK)
Packit 577717
      ERROR_RETURN(retval);
Packit 577717
   
Packit 577717
   /* free the resources used by PAPI */
Packit 577717
   PAPI_shutdown();
Packit 577717
Packit 577717
   return (0);
Packit 577717
}
Packit 577717
Packit 577717
int main(int argc, char **argv)
Packit 577717
{
Packit 577717
Packit 577717
   printf("Using %d iterations\n\n", NUM_ITERS);
Packit 577717
   printf("Does PAPI_multiplex_init() handle lots of events?\n");
Packit 577717
   multiplex();
Packit 577717
   exit(0);
Packit 577717
}