|
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 |
}
|