66 #define NATIVE_EVENT_CHUNKSIZE 1024 91 INTDBG(
"event_string: %s\n", event_string);
96 if (event_string != NULL) {
120 INTDBG(
"new event_code: %#x, update_flag: %d, previous event_code: %#x\n", event_code, update_flag,
papi_event_code);
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");
161 INTDBG(
"EXIT: result: %d\n", result);
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;
378 native_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");
521 INTDBG(
"ENTER: event_code: %#x\n", event_code);
528 INTDBG(
"EXIT: Event %#x is a PRESET, assigning component %d\n", event_code,0);
534 INTDBG(
"EXIT: Event %#x is USER DEFINED, assigning component %d\n", event_code,0);
552 INTDBG(
"EXIT: Found cidx: %d event_index: %d, event_code: %#x\n",
cidx, event_index, event_code);
565 INTDBG(
"EXIT: papi_event_code: %#x set by the component\n", result);
575 INTDBG(
"EXIT: result: %#x\n", result);
582 INTDBG(
"ENTER: event_code: %#x\n", event_code);
589 INTDBG(
"EXIT: PAPI_ENOEVNT\n");
595 INTDBG(
"EXIT: result: %#x\n", result);
610 (
getenv(
"PAPI_VERBOSE" ) ) ) {
612 fprintf( stderr,
"PAPI Error: " );
613 vfprintf( stderr, format, args );
614 fprintf( stderr,
"\n" );
624 (
getenv(
"PAPI_VERBOSE" ) ) ) {
626 fprintf( stderr,
"PAPI Warning: " );
627 vfprintf( stderr, format, args );
628 fprintf( stderr,
"\n" );
639 return ( errorCode );
655 sprintf( str + strlen( str ),
": %s", strerror(
errno ) );
783 sizeof (
long long ) );
785 sizeof (
long long ) );
802 sizeof (
int ) * 3 ) * (
size_t ) max_counters );
806 (
size_t ) max_counters *
sizeof ( int ) * 4 ) );
834 ptr += sizeof (
long long ) * max_counters;
836 ptr +=
sizeof ( int ) * max_counters;
838 ptr +=
sizeof ( int ) * max_counters;
845 ptr +=
sizeof ( int ) * max_counters;
847 ptr +=
sizeof ( int ) * max_counters;
849 ptr +=
sizeof ( int ) * max_counters;
854 for (
i = 0;
i < max_counters;
i++ ) {
864 for(
i = 0;
i < max_counters;
i++ ) {
915 return ( errorCode );
944 if ( (
EventSet == NULL ) || ( handle == NULL ) )
969 INTDBG(
"(%p,%p): new EventSet in slot %d\n",
988 for ( k = 0; k < limit; k++ ) {
1006 unsigned int EventCode )
1011 for (
i = 0;
i < limit;
i++ ) {
1053 INTDBG(
"ENTER: ESI: %p, papi_event: %#x\n", ESI, papi_event);
1065 INTDBG(
"EXIT: event: %#x already mapped at index: %d\n", papi_event,
i);
1070 INTDBG(
"EXIT: PAPI_ENOEVNT\n");
1089 int i, event, k, n, preset_index = 0, nevt;
1093 for(
i = 0;
i < total_events;
i++ ) {
1112 INTDBG(
"Looking for subevent %#x\n",nevt);
1117 INTDBG(
"Found papi event: %#x, &ESI->NativeInfoArray[%d]: %p, ni_event: %#x, ni_position %d\n",
1133 INTDBG(
"EXIT: needed event not found\n");
1145 INTDBG(
"nevt: %#x, user_defined_events[%d].code[%d]: %#x, code[%d]: %#x\n",
1170 INTDBG(
"ENTER: ESI: %p, nevt: %#x\n", ESI, nevt);
1172 int i, max_counters;
1181 for(
i = 0;
i < max_counters;
i++ ) {
1193 INTDBG(
"EXIT: nevt: %#x, returned: %d\n", nevt,
i);
1197 INTDBG(
"EXIT: returned: -1\n");
1235 INTDBG (
"ENTER: ESI: %p, nevt: %p, size: %d, out: %p\n", ESI, nevt, size, out);
1236 int nidx,
i, j, added_events = 0;
1244 for(
i = 0;
i < size;
i++ ) {
1261 for( j = 0; j <
i; j++ ) {
1266 INTDBG(
"should not happen!\n" );
1268 INTDBG(
"EXIT: counters are full!\n" );
1274 INTDBG(
"Adding nevt[%d]: %#x, ESI->NativeInfoArray[%d]: %p, Component: %d\n",
1285 INTDBG(
"added_events: %d\n", added_events);
1289 if ( added_events ) {
1301 for(
i = 0;
i < size;
i++ ) {
1306 INTDBG(
"should not happen!\n" );
1315 PAPIERROR(
"update_control_state failed to re-establish working events!" );
1316 INTDBG(
"EXIT: update_control_state returned: %d\n", retval2);
1319 INTDBG(
"EXIT: update_control_state returned: %d\n",
retval);
1322 INTDBG(
"EXIT: update_control_state returned: %d, we return: 1 (need remap)\n",
retval);
1329 INTDBG(
"EXIT: PAPI_OK\n");
1356 INTDBG(
"EXIT: Error assigning eventset to component index %d\n",
cidx);
1361 INTDBG(
"EXIT: Event is not valid for component index %d\n",
cidx);
1421 (
unsigned int ) EventCode;
1460 (
unsigned int ) EventCode;
1536 INTDBG(
"Entry: ESI: %p, nevt: %p, size: %d\n", ESI, nevt, size);
1545 for(
i = 0;
i < size;
i++ ) {
1549 if ((
native[j].ni_event == cevt) && (
native[j].ni_papi_code == nevt[
i]) ) {
1553 if (
native[j].ni_owners == 0 ) {
1566 if (
native[
i].ni_event == -1 )
continue;
1568 if (
native[
i].ni_owners == 0 ) {
1572 if (
native[j].ni_event == -1 ||
native[j].ni_owners == 0 )
continue;
1582 native[j].ni_position = -1;
1621 int j = 0,
retval, thisindex;
1627 return ( thisindex );
1643 if ( ( preset_index < 0 ) ||
1694 array[thisindex].ops = NULL;
1705 INTDBG(
"ENTER: context: %p, ESI: %p, values: %p\n", context, ESI,
values);
1707 long long *dp = NULL;
1732 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 );
1742 if (
values[
i] < (
long long ) 0 ) {
1750 INTDBG(
"EXIT: PAPI_OK\n");
1764 for(
i=0;
i<num_cntrs;
i++) {
1787 native[j].ni_position = -1;
1869 int retval,
i, j = 0, *mpxlist = NULL;
1871 int flags = mpx->
flags;
1881 if ( mpxlist == NULL )
1958 fprintf(stderr,
"Warning! num_cntrs %d is more than num_mpx_cntrs %d for component %s\n",
2042 ( void ) overflow_vector;
2055 pos = position[
i++];
2058 INTDBG(
"Compound event, adding %lld to %lld\n", from[pos],
retval );
2068 long long retval = from[position[0]];
2072 pos = position[
i++];
2075 INTDBG(
"Compound event, subtracting pos=%d %lld from %lld\n", pos,
2086 (
long long) 1000000 ) / cycles );
2112 char *point = evi->
ops, operand[16];
2114 int i,
val, top = 0;
2116 INTDBG(
"ENTER: evi: %p, evi->ops: %p (%s), evi->pos[0]: %d, evi->pos[1]: %d, hw_counter: %p (%lld %lld)\n",
2117 evi, evi->
ops, evi->
ops, evi->
pos[0], evi->
pos[1], hw_counter, hw_counter[0], hw_counter[1]);
2121 while ( *point !=
'\0' ) {
2122 if ( *point ==
'|' ) {
2124 }
else if ( *point ==
'N' ) {
2127 while ( isdigit(*point) ) {
2129 operand[
i] = *point;
2133 assert(0<
i &&
i<16);
2138 stack[top] = ( double ) hw_counter[evi->
pos[
val]];
2140 }
else if ( *point ==
'#' ) {
2145 }
else if ( isdigit( *point ) ) {
2147 while ( isdigit(*point) ) {
2149 operand[
i] = *point;
2153 assert(0<
i &&
i<16);
2158 }
else if ( *point ==
'+' ) {
2163 }
else if ( *point ==
'-' ) {
2168 }
else if ( *point ==
'*' ) {
2173 }
else if ( *point ==
'/' ) {
2181 return (
long long )
stack[0];
2185 INTDBG(
"EXIT: stack[0]: %lld\n", (
long long)
stack[0]);
2186 return (
long long )
stack[0];
2192 INTDBG(
"ENTER: evi: %p, evi->derived: %d, from: %p\n", evi, evi->
derived, from);
2208 return ( from[evi->
pos[0]] );
2212 return ( (
long long ) 0 );
2224 "Divide by the cycle counter and convert to seconds"},
2226 "Add 2 counters then divide by the cycle counter and xl8 to secs."},
2228 "Event lives in first counter but takes 2 or more codes"},
2229 {
DERIVED_SUB,
"DERIVED_SUB",
"Sub all counters from first counter"},
2231 "Process counters based on specified postfix string"},
2233 "Process counters based on specified infix string"},
2252 INTDBG(
"Invalid derived string %s\n",
tmp );
2274 INTDBG(
"Invalid derived type %d\n", type );
2288 INTDBG(
"ENTER: EventCode: %#x, info: %p\n", EventCode, info);
2299 info->
event_code = (
unsigned int ) EventCode;
2321 for(j=0;j < info->
count; j++) {
2324 sizeof(info->
name[j])-1);
2329 sizeof ( info->
note )-1 );
2348 INTDBG(
"ENTER: EventCode: %#x, info: %p\n", EventCode, info);
2360 INTDBG(
"EXIT: Event symbol for this event is NULL\n");
2367 info->
event_code = (
unsigned int ) EventCode;
2389 for(j=0;j < info->
count; j++) {
2391 INTDBG(
"info->code[%d]: %#x\n", j, info->
code[j]);
2409 INTDBG(
"ENTER: EventCode: %#x\n", EventCode);
2417 INTDBG(
"EXIT: PAPI_ENOCMP\n");
2425 INTDBG(
"EXIT: nevt_code: %d\n", nevt_code);
2440 INTDBG(
"ENTER: in: %s, out: %p\n", in, out);
2447 char *full_event_name;
2450 INTDBG(
"EXIT: PAPI_EINVAL\n");
2454 full_event_name = strdup(in);
2469 INTDBG(
"cidx: %d, name: %s, event: %s\n",
2484 free (full_event_name);
2485 INTDBG(
"EXIT: PAPI_OK event: %s code: %#x\n", in, *out);
2498 free (full_event_name);
2511 if ( strcasecmp(
name, in ) == 0 ) {
2513 free (full_event_name);
2514 INTDBG(
"EXIT: PAPI_OK, event: %s, code: %#x\n", in, *out);
2529 free (full_event_name);
2539 char *hwi_name,
int len )
2541 INTDBG(
"ENTER: EventCode: %#x, hwi_name: %p, len: %d\n", EventCode, hwi_name, len);
2554 INTDBG(
"EXIT: nevt_code: %d\n", nevt_code);
2558 (
unsigned int)nevt_code,
2559 hwi_name, len) ) ==
PAPI_OK ) {
2561 hwi_name, hwi_name, len);
2568 INTDBG(
"EXIT: PAPI_ENOEVNT\n");
2579 INTDBG(
"ENTER: EventCode: %#x, info: %p\n", EventCode, info);
2595 info->
event_code = (
unsigned int ) EventCode;
2605 INTDBG(
"missing NTV_CODE_TO_INFO, faking\n");
2609 INTDBG(
"EXIT: nevt_code: %d\n", nevt_code);
2613 (
unsigned int)nevt_code,
2623 INTDBG(
"EXIT: nevt_code: %d\n", nevt_code);
2627 (
unsigned int)nevt_code,
2631 INTDBG(
"Failed ntv_code_to_descr()\n");
2645 INTDBG(
"EXIT: PAPI_ENOEVNT\n");
2655 if ( ( eventset < 0 ) || ( eventset > map->
totalSlots ) )
2695 INTDBG(
"Entry: ESI: %p, is_dirty: %p\n", ESI, is_dirty);
2708 if (is_dirty != NULL) {
2709 if (ESI->
CpuInfo->from_esi != ESI) {
2712 *is_dirty = dirty_ctx;
2722 if (is_dirty != NULL) {
2723 if (ESI->
master->from_esi != ESI) {
2726 *is_dirty = dirty_ctx;
2728 ESI->
master->from_esi = ESI;
char event_name[2][PAPI_MAX_STR_LEN]
int _papi_hwi_is_sw_multiplex(EventSetInfo_t *ESI)
int _papi_hwi_convert_eventset_to_multiplex(_papi_int_multiplex_t *mpx)
int _papi_hwi_get_ntv_idx(unsigned int papi_evt_code)
static unsigned int papi_event_code
int _papi_hwi_init_global_internal(void)
#define PAPI_CPU_ATTACHED
#define IS_PRESET(EventCode)
unsigned int _papi_hwi_get_papi_event_code()
char * _papi_hwi_get_papi_event_string()
static struct native_event_info * _papi_native_events
#define PAPI_EVENTS_IN_DERIVED_EVENT
int _papi_hwi_innoculate_os_vector(papi_os_vector_t *v)
unsigned long int(* _papi_hwi_thread_id_fn)(void)
static int EventInfoArrayLength(const EventSetInfo_t *ESI)
static int is_supported_by_component(int cidx, char *event_name)
#define IS_USER_DEFINED(EventCode)
int _papi_hwi_query_native_event(unsigned int EventCode)
int _papi_hwi_cleanup_eventset(EventSetInfo_t *ESI)
void PAPIWARN(char *format,...)
PAPI_debug_handler_t _papi_hwi_debug_handler
#define PAPI_MULTIPLEX_FORCE_SW
static double array[ARRAYSIZE]
int _papi_hwi_native_code_to_name(unsigned int EventCode, char *hwi_name, int len)
void _papi_hwi_dummy_handler(int EventSet, void *address, long long overflow_vector, void *context)
EventSetAttachInfo_t attach
static int _papi_hwi_find_native_event(int cidx, int event, const char *event_name)
hwd_register_t * NativeBits
void _papi_hwi_free_papi_event_string()
static long long handle_derived_subtract(int *position, long long *from)
static int _papi_hwi_derived_string(int type, char *derived, int len)
char long_descr[PAPI_HUGE_STR_LEN]
EventSetDomainInfo_t domain
int _papi_hwi_remove_EventSet(EventSetInfo_t *ESI)
int _papi_hwi_derived_type(char *tmp, int *code)
static long long _papi_hwi_postfix_calc(EventInfo_t *evi, long long *hw_counter)
#define PAPI_ECMP_DISABLED
static struct timeval start
char units[MAX_EVENTS][BUFSIZ]
unsigned int code[PAPI_MAX_INFO_TERMS]
char derived[PAPI_MIN_STR_LEN]
void _papi_hwi_init_errors(void)
int _papi_hwi_remove_event(EventSetInfo_t *ESI, int EventCode)
EventSetInfo_t * _papi_hwi_lookup_EventSet(int eventset)
int _papi_hwi_get_user_event_info(int EventCode, PAPI_event_info_t *info)
PAPI_shlib_info_t shlib_info
Return codes and api definitions.
#define INTDBG(format, args...)
static long long handle_derived_add(int *position, long long *from)
int MPX_add_events(MPX_EventSet **mpx_events, int *event_list, int num_events, int domain, int granularity)
#define PAPI_MAX_PRESET_EVENTS
static int _papi_hwi_add_error(char *error)
#define PAPI_MAX_USER_EVENTS
static void _papi_hwi_cleanup_errors()
papi_os_vector_t _papi_os_vector
inline_static int _papi_hwi_lock(int lck)
int _papi_hwi_native_to_eventcode(int cidx, int event_code, int ntv_idx, const char *event_name)
EventSetOverflowInfo_t overflow
static int event_already_in_eventset(EventSetInfo_t *ESI, int papi_event)
#define PAPI_OVERFLOW_HARDWARE
EventSetInheritInfo_t inherit
struct _CpuInfo * CpuInfo
DynamicArray_t global_eventset_map
struct _ThreadInfo * master
#define IS_NATIVE(EventCode)
static int allocate_eventset_map(DynamicArray_t *map)
int _papi_hwi_read(hwd_context_t *context, EventSetInfo_t *ESI, long long *values)
char symbol[PAPI_HUGE_STR_LEN]
#define PAPI_HUGE_STR_LEN
hwi_presets_t _papi_hwi_presets[PAPI_MAX_PRESET_EVENTS]
inline_static int _papi_hwi_unlock(int lck)
int _papi_hwi_innoculate_vector(papi_vector_t *v)
int _papi_hwi_lookup_EventCodeIndex(const EventSetInfo_t *ESI, unsigned int EventCode)
static int update_overflow(EventSetInfo_t *ESI)
#define NATIVE_EVENT_CHUNKSIZE
#define PAPI_MULTIPLEXING
int _papi_hwi_add_event(EventSetInfo_t *ESI, int EventCode)
int _papi_hwi_get_native_event_info(unsigned int EventCode, PAPI_event_info_t *info)
void PAPIERROR(char *format,...)
static const hwi_describe_t _papi_hwi_derived[]
void _papi_hwi_shutdown_global_internal(void)
int _papi_hwi_get_preset_event_info(int EventCode, PAPI_event_info_t *info)
int mpx_add_event(MPX_EventSet **mpx_events, int EventCode, int domain, int granularity)
static int num_native_chunks
static long long units_per_second(long long units, long long cycles)
int _papi_hwi_error_level
char short_descr[PAPI_MIN_STR_LEN]
papi_mdi_t _papi_hwi_system_info
static int default_debug_handler(int errorCode)
static int num_error_chunks
int _papi_hwi_shutdown_cpu(CpuInfo_t *cpu)
NativeInfo_t * NativeInfoArray
EventInfo_t * EventInfoArray
static int remove_native_events(EventSetInfo_t *ESI, int *nevt, int size)
#define PAPI_ERROR_CODE_str
static long long handle_derived_ps(int *position, long long *from)
EventSetMultiplexInfo_t multiplex
EventSetGranularityInfo_t granularity
hwd_context_t * _papi_hwi_get_context(EventSetInfo_t *ESI, int *is_dirty)
EventSetInfo_t ** dataSlotArray
int pos[PAPI_EVENTS_IN_DERIVED_EVENT]
int user_defined_events_count
int(* PAPI_debug_handler_t)(int code)
void _papi_hwi_set_papi_event_code(unsigned int event_code, int update_flag)
char name[PAPI_MAX_INFO_TERMS][PAPI_2MAX_STR_LEN]
#define papi_realloc(a, b)
int _papi_hwi_assign_eventset(EventSetInfo_t *ESI, int cidx)
static int add_native_fail_clean(EventSetInfo_t *ESI, int nevt)
hwi_presets_t user_defined_events[PAPI_MAX_USER_EVENTS]
int _papi_hwi_init_global(void)
static char stack[2 *PAPI_HUGE_STR_LEN]
int mpx_remove_event(MPX_EventSet **mpx_events, int EventCode)
static int _papi_hwi_lookup_error(char *error)
unsigned int code[PAPI_MAX_INFO_TERMS]
char * name[PAPI_MAX_INFO_TERMS]
int _papi_hwi_component_index(int event_code)
#define PAPI_NATIVE_AND_MASK
#define PAPI_PRESET_AND_MASK
struct papi_vectors * _papi_hwd[]
int _papi_hwi_publish_error(char *error)
static int _papi_hwi_add_native_event(int cidx, int ntv_event, int ntv_idx, const char *event_name)
int _papi_hwi_invalid_cmp(int cidx)
void _papi_hwi_free_EventSet(EventSetInfo_t *ESI)
static long long handle_derived(EventInfo_t *evi, long long *from)
int _papi_hwi_prefix_component_name(char *component_name, char *event_name, char *out, int out_len)
int _papi_hwi_eventcode_to_native(int event_code)
char postfix[PAPI_2MAX_STR_LEN]
EventSetProfileInfo_t profile
static int add_native_events(EventSetInfo_t *ESI, unsigned int *nevt, int size, EventInfo_t *out)
hwd_control_state_t * ctl_state
static long long values[NUM_EVENTS]
static long long handle_derived_add_ps(int *position, long long *from)
int _papi_hwi_cleanup_all_presets(void)
char note[PAPI_HUGE_STR_LEN]
static int create_EventSet(EventSetInfo_t **here)
static int add_EventSet(EventSetInfo_t *ESI, ThreadInfo_t *master)
static int get_free_EventCodeIndex(const EventSetInfo_t *ESI, unsigned int EventCode)
void _papi_hwi_map_events_to_native(EventSetInfo_t *ESI)
int _papi_hwi_native_name_to_code(const char *in, int *out)
const char * _papi_hwi_strip_component_prefix(const char *event_name)
static int expand_dynamic_array(DynamicArray_t *DA)
int _papi_hwi_create_eventset(int *EventSet, ThreadInfo_t *handle)
#define papi_calloc(a, b)
void _papi_hwi_set_papi_event_string(const char *event_string)
static int papi_event_code_changed
static int num_native_events