PAPI3:PAPI add event.3
From PAPIDocs
Jump to: navigation, search


  • PAPI_add_event - add PAPI preset or native hardware event to an event set
  • PAPI_add_events - add PAPI presets or native hardware events to an event set


C Interface

#include <papi.h>
int PAPI_add_event(int  EventSet, int  EventCode );
int PAPI_add_events(int  EventSet, int * EventCodes, int  number );

Fortran Interface

#include fpapi.h
PAPIF_add_event(C_INT  EventSet,  C_INT  EventCode,  C_INT  check )
PAPIF_add_events(C_INT  EventSet,  C_INT(*)  EventCodes,  C_INT  number,  C_INT  check )


PAPI_add_event() adds one event to a PAPI Event Set. PAPI_add_events() does the same, but for an array of events.

A hardware event can be either a PAPI preset or a native hardware event code. For a list of PAPI preset events, see PAPI_presets (3) or run the avail test case in the PAPI distribution. PAPI presets can be passed to PAPI_query_event (3) to see if they exist on the underlying architecture. For a list of native events available on current platform, run native_avail test case in the PAPI distribution. For the encoding of native events, see PAPI_event_name_to_code (3) to learn how to generate native code for the supported native event on the underlying architecture.


EventSet -- an integer handle for a PAPI Event Set as created by PAPI_create_eventset (3)

EventCode -- a defined event such as PAPI_TOT_INS.

*EventCode -- an array of defined events

number -- an integer indicating the number of events in the array *EventCode It should be noted that PAPI_add_events can partially succeed, exactly like PAPI_remove_events.


Positive integer The number of consecutive elements that succeeded before the error.

PAPI_EINVAL One or more of the arguments is invalid.

PAPI_ENOMEM Insufficient memory to complete the operation.

PAPI_ENOEVST The event set specified does not exist.

PAPI_EISRUN The event set is currently counting events.

PAPI_ECNFLCT The underlying counter hardware can not count this event and other events in the event set simultaneously.

PAPI_ENOEVNT The PAPI preset is not available on the underlying hardware.

PAPI_EBUG Internal error, please send mail to the developers.


  1. int EventSet = PAPI_NULL;
  2. unsigned int native = 0x0;
  3. if (PAPI_create_eventset(&EventSet) != PAPI_OK)
  4. handle_error(1);
  5. /* Add Total Instructions Executed to our EventSet */
  6. if (PAPI_add_event(EventSet, PAPI_TOT_INS) != PAPI_OK)
  7. handle_error(1);
  8. /* Add native event PM_CYC to EventSet */
  9. if (PAPI_event_name_to_code("PM_CYC",&native) != PAPI_OK)
  10. handle_error(1);
  11. if (PAPI_add_event(EventSet, native) != PAPI_OK)
  12. handle_error(1);


The vector function should take a pointer to a length argument so a proper return value can be set upon partial success.


Event counters 5 and 6 in the IBM POWER6 are restricted: .br \(bu Each can count just a single, fixed event. .br \(bu They are free-running and so can count only in the combined domain - PAPI_DOM_USER | PAPI_DOM_KERNEL | PAPI_DOM_SUPERVISOR. .br \(bu They cannot interrupt on overflow.

Although counter 6 counts processor cycles gated by the run latch (PM_RUN_CYC), the current implementation maps the PAPI preset event PAPI_TOT_CYC to PM_CYC because of the domain and overflow limitations of counter 6. PM_CYC can be counted with relatively few other events, so it's likely that you will receive PAPI_ECNFLCT if you try to add PAPI_TOT_CYC to an event set that already contains other events. If you can use the above mentioned combined domain and do not need the overflow capability, you should consider adding the native event PM_RUN_CYC instead of PAPI_TOT_CYC.

Counter 5 counts the native event PM_RUN_INST_CMPL, which is instructions completed gated by the run latch. For the same reasons given for counter 6, PAPI_TOT_INS is mapped to PM_INST_CMPL instead of PM_RUN_INST_CMPL. And as above, if you try to add PAPI_TOT_INS to an event group with other events already in it, you are likely to receive PAPI_ECNFLCT. If you can use the above combined domain and do not need the overflow capability, you should consider adding the native event PM_RUN_INST_CMPL instead of PAPI_TOT_INS.

See Also

PAPI_cleanup_eventset(3), PAPI_destroy_eventset(3), PAPI_event_code_to_name(3), PAPI_remove_events(3), PAPI_query_event(3), PAPI_presets(3), PAPI_native(3), PAPI_remove_event(3)