69#define NATIVE_EVENT_CHUNKSIZE 1024
94 INTDBG(
"event_string: %s\n", event_string);
99 if (event_string != NULL) {
123 if (update_flag < 0) {
143 INTDBG(
"ENTER: papi_evt_code: %#x\n", papi_evt_code);
148 if (papi_evt_code == 0) {
149 INTDBG(
"EXIT: PAPI_ENOEVNT, invalid papi event code\n");
155 INTDBG(
"EXIT: PAPI_ENOEVNT, invalid index into native event array\n");
176 int component_name = 0;
185 if ((wptr = strstr(
event_name,
":::")) != NULL) {
187 }
else if ((wptr = strstr(
event_name,
"::")) != NULL) {
190 INTDBG(
"EXIT: No Component or PMU name in event string, try this component\n");
199 wptr[name_len] =
'\0';
202 if (component_name) {
219 INTDBG(
"EXIT: Component %s supports PMU %s and this event\n",
_papi_hwd[
cidx]->cmp_info.name, wptr);
227 INTDBG(
"EXIT: Component does not support this event\n");
250 size2 = strlen(component_name);
257 if ( size1 >= out_len )
265 sprintf(out,
"%s%c", temp,
'\0' );
270 if ( strstr(component_name,
"pe") ||
271 strstr(component_name,
"bgq") ||
272 strstr(component_name,
"bgp") ) {
273 sprintf( out,
"%s%c", temp,
'\0');
278 if ( size1+size2+3+1 > out_len )
281 sprintf( out,
"%s:::%s%c" , component_name, temp,
'\0');
297 const char *
start = NULL;
321 INTDBG(
"EXIT: PAPI_ENOEVNT\n");
336 INTDBG(
"EXIT: event: %#x, component_event: %#x, ntv_idx: %d, event_name: %s\n",
343 INTDBG(
"EXIT: PAPI_ENOEVNT\n");
351 int new_native_event;
362 goto native_alloc_early_out;
378native_alloc_early_out:
383 return new_native_event;
395 INTDBG(
"Adding a new Error message |%s|\n", error);
473 return (-error_code);
492 _papi_hwi_add_error(
"Event exists, but cannot be counted due to hardware resource limits");
511 _papi_hwi_add_error(
"Event exists, but cannot be counted due to multiple passes required by hardware");
523 INTDBG(
"ENTER: event_code: %#x\n", event_code);
530 INTDBG(
"EXIT: Event %#x is a PRESET, assigning component %d\n", event_code,0);
536 INTDBG(
"EXIT: Event %#x is USER DEFINED, assigning component %d\n", event_code,0);
554 INTDBG(
"EXIT: Found cidx: %d event_index: %d, event_code: %#x\n",
cidx, event_index, event_code);
567 INTDBG(
"EXIT: papi_event_code: %#x set by the component\n",
result);
584 INTDBG(
"ENTER: event_code: %#x\n", event_code);
591 INTDBG(
"EXIT: PAPI_ENOEVNT\n");
612 ( getenv(
"PAPI_VERBOSE" ) ) ) {
614 fprintf(
stderr,
"PAPI Error: " );
615 vfprintf(
stderr, format, args );
626 ( getenv(
"PAPI_VERBOSE" ) ) ) {
628 fprintf(
stderr,
"PAPI Warning: " );
629 vfprintf(
stderr, format, args );
641 return ( errorCode );
657 sprintf( str + strlen( str ),
": %s", strerror(
errno ) );
785 sizeof (
long long ) );
787 sizeof (
long long ) );
804 sizeof (
int ) * 3 ) * (
size_t ) max_counters );
808 (
size_t ) max_counters *
sizeof (
int ) * 4 ) );
836 ptr += sizeof (
long long ) * max_counters;
838 ptr +=
sizeof (
int ) * max_counters;
840 ptr +=
sizeof (
int ) * max_counters;
847 ptr +=
sizeof (
int ) * max_counters;
849 ptr +=
sizeof (
int ) * max_counters;
851 ptr +=
sizeof (
int ) * max_counters;
856 for (
i = 0;
i < max_counters;
i++ ) {
866 for(
i = 0;
i < max_counters;
i++ ) {
917 return ( errorCode );
971 INTDBG(
"(%p,%p): new EventSet in slot %d\n",
990 for ( k = 0; k < limit; k++ ) {
1008 unsigned int EventCode )
1013 for (
i = 0;
i < limit;
i++ ) {
1055 INTDBG(
"ENTER: ESI: %p, papi_event: %#x\n", ESI, papi_event);
1067 INTDBG(
"EXIT: event: %#x already mapped at index: %d\n", papi_event,
i);
1072 INTDBG(
"EXIT: PAPI_ENOEVNT\n");
1091 int i, event, k, n, preset_index = 0, nevt;
1095 for(
i = 0;
i < total_events;
i++ ) {
1114 INTDBG(
"Looking for subevent %#x\n",nevt);
1119 INTDBG(
"Found papi event: %#x, &ESI->NativeInfoArray[%d]: %p, ni_event: %#x, ni_position %d\n",
1135 INTDBG(
"EXIT: needed event not found\n");
1147 INTDBG(
"nevt: %#x, user_defined_events[%d].code[%d]: %#x, code[%d]: %#x\n",
1172 INTDBG(
"ENTER: ESI: %p, nevt: %#x\n", ESI, nevt);
1174 int i, max_counters;
1183 for(
i = 0;
i < max_counters;
i++ ) {
1195 INTDBG(
"EXIT: nevt: %#x, returned: %d\n", nevt,
i);
1199 INTDBG(
"EXIT: returned: -1\n");
1237 INTDBG (
"ENTER: ESI: %p, nevt: %p, size: %d, out: %p\n", ESI, nevt, size, out);
1238 int nidx,
i, j, added_events = 0;
1246 for(
i = 0;
i < size;
i++ ) {
1263 for( j = 0; j <
i; j++ ) {
1268 INTDBG(
"should not happen!\n" );
1270 INTDBG(
"EXIT: counters are full!\n" );
1276 INTDBG(
"Adding nevt[%d]: %#x, ESI->NativeInfoArray[%d]: %p, Component: %d\n",
1287 INTDBG(
"added_events: %d\n", added_events);
1291 if ( added_events ) {
1303 for(
i = 0;
i < size;
i++ ) {
1308 INTDBG(
"should not happen!\n" );
1317 PAPIERROR(
"update_control_state failed to re-establish working events!" );
1318 INTDBG(
"EXIT: update_control_state returned: %d\n", retval2);
1321 INTDBG(
"EXIT: update_control_state returned: %d\n",
retval);
1324 INTDBG(
"EXIT: update_control_state returned: %d, we return: 1 (need remap)\n",
retval);
1331 INTDBG(
"EXIT: PAPI_OK\n");
1359 INTDBG(
"EXIT: Error assigning eventset to component index %d\n",
cidx);
1364 INTDBG(
"EXIT: Event is not valid for component index %d\n",
cidx);
1424 (
unsigned int ) EventCode;
1463 (
unsigned int ) EventCode;
1539 INTDBG(
"Entry: ESI: %p, nevt: %p, size: %d\n", ESI, nevt, size);
1548 for(
i = 0;
i < size;
i++ ) {
1552 if ((
native[j].ni_event == cevt) && (
native[j].ni_papi_code == nevt[
i]) ) {
1556 if (
native[j].ni_owners == 0 ) {
1569 if (
native[
i].ni_event == -1 )
continue;
1571 if (
native[
i].ni_owners == 0 ) {
1575 if (
native[j].ni_event == -1 ||
native[j].ni_owners == 0 )
continue;
1582 memcpy(
native[
i].ni_bits,
native[j].ni_bits, (
size_t ) sz );
1585 native[j].ni_position = -1;
1624 int j = 0,
retval, thisindex;
1630 return ( thisindex );
1646 if ( ( preset_index < 0 ) ||
1697 array[thisindex].ops = NULL;
1708 INTDBG(
"ENTER: context: %p, ESI: %p, values: %p\n", context, ESI,
values);
1710 long long *dp = NULL;
1735 INTDBG(
"ESI->EventInfoArray: %p, pos[%d]: %d, dp[%d]: %lld, derived[%d]: %#x\n", ESI->
EventInfoArray,
i, index, index, dp[index],
i, ESI->
EventInfoArray[
i].
derived );
1745 if (
values[
i] < (
long long ) 0 ) {
1753 INTDBG(
"EXIT: PAPI_OK\n");
1767 for(
i=0;
i<num_cntrs;
i++) {
1790 native[j].ni_position = -1;
1872 int retval,
i, j = 0, *mpxlist = NULL;
1874 int flags = mpx->
flags;
1884 if ( mpxlist == NULL )
1949 if (strcmp(
_papi_hwd[
i]->cmp_info.name,
"perf_event") == 0) is_pe_peu=1;
1950 if (strcmp(
_papi_hwd[
i]->cmp_info.name,
"perf_event_uncore") == 0) is_pe_peu=1;
1957 if (!
_papi_hwd[
i]->cmp_info.disabled && (PE_OR_PEU == is_pe_peu)) {
1964 fprintf(
stderr,
"Warning! num_cntrs %d is more than num_mpx_cntrs %d for component %s\n",
2047 ( void ) overflow_vector;
2060 pos = position[
i++];
2063 INTDBG(
"Compound event, adding %lld to %lld\n", from[pos],
retval );
2073 long long retval = from[position[0]];
2077 pos = position[
i++];
2080 INTDBG(
"Compound event, subtracting pos=%d %lld from %lld\n", pos,
2091 (
long long) 1000000 ) / cycles );
2117 char *point = evi->
ops, operand[16];
2119 int i, val, top = 0;
2121 INTDBG(
"ENTER: evi: %p, evi->ops: %p (%s), evi->pos[0]: %d, evi->pos[1]: %d, hw_counter: %p (%lld %lld)\n",
2122 evi, evi->
ops, evi->
ops, evi->
pos[0], evi->
pos[1], hw_counter, hw_counter[0], hw_counter[1]);
2126 while ( *point !=
'\0' ) {
2127 if ( *point ==
'|' ) {
2129 }
else if ( *point ==
'N' ) {
2132 while ( isdigit(*point) ) {
2134 operand[
i] = *point;
2138 assert(0<
i &&
i<16);
2140 val = atoi( operand );
2143 stack[top] = ( double ) hw_counter[evi->
pos[val]];
2145 }
else if ( *point ==
'#' ) {
2150 }
else if ( isdigit( *point ) ) {
2152 while ( isdigit(*point) ) {
2154 operand[
i] = *point;
2158 assert(0<
i &&
i<16);
2161 stack[top] = atoi( operand );
2163 }
else if ( *point ==
'+' ) {
2168 }
else if ( *point ==
'-' ) {
2173 }
else if ( *point ==
'*' ) {
2178 }
else if ( *point ==
'/' ) {
2186 return (
long long )
stack[0];
2190 INTDBG(
"EXIT: stack[0]: %lld\n", (
long long)
stack[0]);
2191 return (
long long )
stack[0];
2197 INTDBG(
"ENTER: evi: %p, evi->derived: %d, from: %p\n", evi, evi->
derived, from);
2213 return ( from[evi->
pos[0]] );
2217 return ( (
long long ) 0 );
2229 "Divide by the cycle counter and convert to seconds"},
2231 "Add 2 counters then divide by the cycle counter and xl8 to secs."},
2233 "Event lives in first counter but takes 2 or more codes"},
2234 {
DERIVED_SUB,
"DERIVED_SUB",
"Sub all counters from first counter"},
2236 "Process counters based on specified postfix string"},
2238 "Process counters based on specified infix string"},
2257 INTDBG(
"Invalid derived string %s\n",
tmp );
2293 INTDBG(
"ENTER: EventCode: %#x, info: %p\n", EventCode, info);
2326 for(j=0;j < info->
count; j++) {
2329 sizeof(info->
name[j])-1);
2334 sizeof ( info->
note )-1 );
2353 INTDBG(
"ENTER: EventCode: %#x, info: %p\n", EventCode, info);
2365 INTDBG(
"EXIT: Event symbol for this event is NULL\n");
2394 for(j=0;j < info->
count; j++) {
2396 INTDBG(
"info->code[%d]: %#x\n", j, info->
code[j]);
2414 INTDBG(
"ENTER: EventCode: %#x\n", EventCode);
2422 INTDBG(
"EXIT: PAPI_ENOCMP\n");
2430 INTDBG(
"EXIT: nevt_code: %d\n", nevt_code);
2435 INTDBG(
"EXIT: ret: %d\n", ret);
2445 INTDBG(
"ENTER: in: %s, out: %p\n", in, out);
2452 char *full_event_name;
2455 INTDBG(
"EXIT: PAPI_EINVAL\n");
2459 full_event_name = strdup(in);
2476 INTDBG(
"cidx: %d, name: %s, event: %s\n",
2491 free (full_event_name);
2492 INTDBG(
"EXIT: PAPI_OK event: %s code: %#x\n", in, *out);
2505 free (full_event_name);
2518 if ( strcasecmp(
name, in ) == 0 ) {
2520 free (full_event_name);
2521 INTDBG(
"EXIT: PAPI_OK, event: %s, code: %#x\n", in, *out);
2536 free (full_event_name);
2546 char *hwi_name,
int len )
2548 INTDBG(
"ENTER: EventCode: %#x, hwi_name: %p, len: %d\n", EventCode, hwi_name, len);
2561 INTDBG(
"EXIT: nevt_code: %d\n", nevt_code);
2565 (
unsigned int)nevt_code,
2566 hwi_name, len) ) ==
PAPI_OK ) {
2568 hwi_name, hwi_name, len);
2575 INTDBG(
"EXIT: PAPI_ENOEVNT\n");
2586 INTDBG(
"ENTER: EventCode: %#x, info: %p\n", EventCode, info);
2614 INTDBG(
"missing NTV_CODE_TO_INFO, faking\n");
2618 INTDBG(
"EXIT: nevt_code: %d\n", nevt_code);
2622 (
unsigned int)nevt_code,
2632 INTDBG(
"EXIT: nevt_code: %d\n", nevt_code);
2636 (
unsigned int)nevt_code,
2640 INTDBG(
"Failed ntv_code_to_descr()\n");
2654 INTDBG(
"EXIT: PAPI_ENOEVNT\n");
2664 if ( ( eventset < 0 ) || ( eventset > map->
totalSlots ) )
2704 INTDBG(
"Entry: ESI: %p, is_dirty: %p\n", ESI, is_dirty);
2717 if (is_dirty != NULL) {
2718 if (ESI->
CpuInfo->from_esi != ESI) {
2721 *is_dirty = dirty_ctx;
2731 if (is_dirty != NULL) {
2732 if (ESI->
master->from_esi != ESI) {
2735 *is_dirty = dirty_ctx;
2737 ESI->
master->from_esi = ESI;
static papi_handle_t handle
papi_os_vector_t _papi_os_vector
Prefixes a component's name to each of its events.
Strip off cmp_name::: from an event name.
struct papi_vectors * _papi_hwd[]
int _papi_hwi_shutdown_cpu(CpuInfo_t *cpu)
char event_name[2][PAPI_MAX_STR_LEN]
char * evt_name(evstock *stock, int index)
#define PAPI_ECMP_DISABLED
#define PAPI_MULTIPLEXING
#define PAPI_CPU_ATTACHED
#define PAPI_MULTIPLEX_FORCE_SW
#define PAPI_OVERFLOW_HARDWARE
#define PAPI_HUGE_STR_LEN
static long long values[NUM_EVENTS]
static struct timeval start
#define PAPI_NATIVE_AND_MASK
#define PAPI_MAX_USER_EVENTS
#define PAPI_PRESET_AND_MASK
#define PAPI_MAX_PRESET_EVENTS
Return codes and api definitions.
int(* PAPI_debug_handler_t)(int code)
#define IS_USER_DEFINED(EventCode)
#define IS_NATIVE(EventCode)
#define IS_PRESET(EventCode)
hwi_presets_t _papi_hwi_presets[PAPI_MAX_PRESET_EVENTS]
#define INTDBG(format, args...)
unsigned long int(* _papi_hwi_thread_id_fn)(void)
static void _papi_hwi_cleanup_errors()
int _papi_hwi_enum_dev_type(int enum_modifier, void **handle)
int _papi_hwi_get_user_event_info(int EventCode, PAPI_event_info_t *info)
static long long handle_derived_ps(int *position, long long *from)
papi_mdi_t _papi_hwi_system_info
int _papi_hwi_get_dev_type_attr(void *handle, PAPI_dev_type_attr_e attr, void *value)
int _papi_hwi_native_to_eventcode(int cidx, int event_code, int ntv_idx, const char *event_name)
int _papi_hwi_add_event(EventSetInfo_t *ESI, int EventCode)
static int expand_dynamic_array(DynamicArray_t *DA)
void _papi_hwi_shutdown_global_internal(void)
int _papi_hwi_get_native_event_info(unsigned int EventCode, PAPI_event_info_t *info)
#define NATIVE_EVENT_CHUNKSIZE
static int num_native_events
void _papi_hwi_free_EventSet(EventSetInfo_t *ESI)
void _papi_hwi_dummy_handler(int EventSet, void *address, long long overflow_vector, void *context)
static int num_native_chunks
static int update_overflow(EventSetInfo_t *ESI)
void PAPIERROR(char *format,...)
THREAD_LOCAL_STORAGE_KEYWORD int _papi_hl_events_running
static int remove_native_events(EventSetInfo_t *ESI, int *nevt, int size)
hwi_presets_t user_defined_events[PAPI_MAX_USER_EVENTS]
static long long handle_derived_add(int *position, long long *from)
int _papi_hwi_is_sw_multiplex(EventSetInfo_t *ESI)
int _papi_hwi_native_code_to_name(unsigned int EventCode, char *hwi_name, int len)
void _papi_hwi_init_errors(void)
int _papi_hwi_derived_type(char *tmp, int *code)
static int add_native_fail_clean(EventSetInfo_t *ESI, int nevt)
static long long handle_derived_subtract(int *position, long long *from)
int _papi_hwi_eventcode_to_native(int event_code)
char * _papi_hwi_get_papi_event_string()
int _papi_hwi_error_level
void _papi_hwi_free_papi_event_string()
static int is_supported_by_component(int cidx, char *event_name)
static int _papi_hwi_derived_string(int type, char *derived, int len)
static long long units_per_second(long long units, long long cycles)
EventSetInfo_t * _papi_hwi_lookup_EventSet(int eventset)
int _papi_hwi_lookup_EventCodeIndex(const EventSetInfo_t *ESI, unsigned int EventCode)
int _papi_hwi_init_global(int PE_OR_PEU)
hwd_context_t * _papi_hwi_get_context(EventSetInfo_t *ESI, int *is_dirty)
int _papi_hwi_get_dev_attr(void *handle, int id, PAPI_dev_attr_e attr, void *value)
int _papi_hwi_init_global_internal(void)
PAPI_debug_handler_t _papi_hwi_debug_handler
static int add_EventSet(EventSetInfo_t *ESI, ThreadInfo_t *master)
int _papi_hwi_remove_EventSet(EventSetInfo_t *ESI)
int _papi_hwi_native_name_to_code(const char *in, int *out)
int _papi_hwi_create_eventset(int *EventSet, ThreadInfo_t *handle)
int _papi_hwi_component_index(int event_code)
static long long _papi_hwi_postfix_calc(EventInfo_t *evi, long long *hw_counter)
static long long handle_derived_add_ps(int *position, long long *from)
static int num_error_chunks
int user_defined_events_count
static int event_already_in_eventset(EventSetInfo_t *ESI, int papi_event)
int _papi_hwi_get_preset_event_info(int EventCode, PAPI_event_info_t *info)
static int _papi_hwi_find_native_event(int cidx, int event, const char *event_name)
unsigned int _papi_hwi_get_papi_event_code()
int _papi_hwi_convert_eventset_to_multiplex(_papi_int_multiplex_t *mpx)
static int create_EventSet(EventSetInfo_t **here)
static long long handle_derived(EventInfo_t *evi, long long *from)
void _papi_hwi_set_papi_event_string(const char *event_string)
static int default_debug_handler(int errorCode)
static int get_component_index(const char *name)
THREAD_LOCAL_STORAGE_KEYWORD int _papi_rate_events_running
static int get_free_EventCodeIndex(const EventSetInfo_t *ESI, unsigned int EventCode)
void PAPIWARN(char *format,...)
int _papi_hwi_read(hwd_context_t *context, EventSetInfo_t *ESI, long long *values)
int _papi_hwi_assign_eventset(EventSetInfo_t *ESI, int cidx)
static int _papi_hwi_lookup_error(char *error)
int _papi_hwi_remove_event(EventSetInfo_t *ESI, int EventCode)
static int _papi_hwi_add_native_event(int cidx, int ntv_event, int ntv_idx, const char *event_name)
static int add_native_events(EventSetInfo_t *ESI, unsigned int *nevt, int size, EventInfo_t *out)
static int EventInfoArrayLength(const EventSetInfo_t *ESI)
int _papi_hwi_invalid_cmp(int cidx)
static int allocate_eventset_map(DynamicArray_t *map)
void _papi_hwi_set_papi_event_code(unsigned int event_code, int update_flag)
static const hwi_describe_t _papi_hwi_derived[]
int _papi_hwi_cleanup_eventset(EventSetInfo_t *ESI)
int _papi_hwi_get_ntv_idx(unsigned int papi_evt_code)
int _papi_hwi_query_native_event(unsigned int EventCode)
static struct native_event_info * _papi_native_events
void _papi_hwi_map_events_to_native(EventSetInfo_t *ESI)
#define PAPI_EVENTS_IN_DERIVED_EVENT
@ PAPI_SYSDETECT_QUERY__DEV_TYPE_ENUM
@ PAPI_SYSDETECT_QUERY__DEV_ATTR
@ PAPI_SYSDETECT_QUERY__DEV_TYPE_ATTR
#define PAPI_ERROR_CODE_str
static double array[ARRAYSIZE]
#define papi_calloc(a, b)
#define papi_realloc(a, b)
int _papi_hwi_cleanup_all_presets(void)
static char stack[2 *PAPI_HUGE_STR_LEN]
int _papi_hwi_innoculate_vector(papi_vector_t *v)
int _papi_hwi_innoculate_os_vector(papi_os_vector_t *v)
char units[MAX_EVENTS][BUFSIZ]
EventSetInfo_t ** dataSlotArray
int pos[PAPI_EVENTS_IN_DERIVED_EVENT]
EventSetInheritInfo_t inherit
EventSetMultiplexInfo_t multiplex
EventSetProfileInfo_t profile
struct _ThreadInfo * master
EventSetAttachInfo_t attach
hwd_register_t * NativeBits
struct _CpuInfo * CpuInfo
EventSetGranularityInfo_t granularity
EventInfo_t * EventInfoArray
hwd_control_state_t * ctl_state
NativeInfo_t * NativeInfoArray
EventSetOverflowInfo_t overflow
EventSetDomainInfo_t domain
char name[PAPI_MAX_INFO_TERMS][PAPI_2MAX_STR_LEN]
char postfix[PAPI_2MAX_STR_LEN]
char note[PAPI_HUGE_STR_LEN]
char short_descr[PAPI_MIN_STR_LEN]
char symbol[PAPI_HUGE_STR_LEN]
char derived[PAPI_MIN_STR_LEN]
unsigned int code[PAPI_MAX_INFO_TERMS]
char long_descr[PAPI_HUGE_STR_LEN]
int tls_papi_event_code_changed
unsigned int tls_papi_event_code
struct _papi_hwi_sysdetect_t::@183::@185 dev_type
PAPI_dev_type_attr_e attr
struct _papi_hwi_sysdetect_t::@183::@186 dev
union _papi_hwi_sysdetect_t::@183 query
struct _papi_hwi_sysdetect_t::@183::@184 enumerate
unsigned int code[PAPI_MAX_INFO_TERMS]
char * name[PAPI_MAX_INFO_TERMS]
DynamicArray_t global_eventset_map
PAPI_shlib_info_t shlib_info
int mpx_remove_event(MPX_EventSet **mpx_events, int EventCode)
int MPX_add_events(MPX_EventSet **mpx_events, int *event_list, int num_events, int domain, int granularity)
int mpx_add_event(MPX_EventSet **mpx_events, int EventCode, int domain, int granularity)
THREAD_LOCAL_STORAGE_KEYWORD ThreadInfo_t * _papi_hwi_my_thread
inline_static int _papi_hwi_lock(int lck)
#define THREAD_LOCAL_STORAGE_KEYWORD
inline_static int _papi_hwi_unlock(int lck)