41#include <sys/utsname.h>
42#include "spi/include/upci/upci.h"
48#define get_cycles GetTimeBase
63#define OPCODE_EVENT_CHUNK 8
96 printf(
_AT_ " _papi_hwd_lock %d\n",
lock);
106 printf(
_AT_ " _papi_hwd_lock got lock %d\n",
lock );
119 printf(
_AT_ " _papi_hwd_unlock %d\n",
lock );
141 printf(
"_bgq_get_system_info\n" );
145 Personality_t personality;
149 retval = Kernel_GetPersonality( &personality,
sizeof( Personality_t ) );
151 fprintf(
stdout,
"Kernel_GetPersonality returned %d (sys error=%d).\n"
167 SUBDBG(
"_bgq_get_system_info: Detected MHZ is %f\n",
182 printf(
"_bgq_init_control_state\n" );
186 ptr->EventGroup = Bgpm_CreateEventSet();
194 ptr->overflow_count = 0;
196 ptr->bgpm_eventset_applied = 0;
209 printf(
"_bgq_set_domain\n" );
237 printf(
"_bgq_init\n" );
243 Bgpm_PrintOnError(1);
246 Bgpm_PrintOnError(0);
251 retval = Bgpm_Init( BGPM_MODE_SWDISTRIB );
265 uint64_t bgpm_period;
269 printf(
"_bgq_multiplex BEGIN: Num of Events = %d (vs %d)\n", Bgpm_NumEvents( bgq_state->EventGroup ), bgq_state->count );
276 bgpm_period = Hz * Sec;
281 if ( 0 < bgq_state->count ) {
287 retval = Bgpm_SetMultiplex( bgq_state->EventGroup, bgpm_period, BGPM_NORMAL );
293 bgq_state->EventGroup_local,
294 &bgq_state->EventGroup );
301 retval = Bgpm_SetMultiplex( bgq_state->EventGroup, bgpm_period, BGPM_NORMAL );
307 printf(
"_bgq_multiplex END: Num of Events = %d (vs %d) --- retval = %d\n",
308 Bgpm_NumEvents( bgq_state->EventGroup ), bgq_state->count,
retval );
326 printf(
"_bgq_allocate_registers\n");
336 for (
i = 0;
i < natNum;
i++ ) {
354 printf(
"_bgq_cleanup_eventset\n" );
361 ctrl->overflow_count = 0;
363 ctrl->bgpm_eventset_applied = 0;
382 printf(
_AT_ " _bgq_update_control_state: count = %d, EventGroup=%d\n",
count, ptr->EventGroup );
393 printf(
_AT_ " _bgq_update_control_state: EventGroup=%d, muxOn = %d, overflow = %d\n",
394 ptr->EventGroup, ptr->muxOn, ptr->overflow );
401 ptr->EventGroup_local[
i] = index;
407 printf(
_AT_ " _bgq_update_control_state: %d out of %d OPCODES\n",
411 printf(
_AT_ " _bgq_update_control_state: j's idx = %d, index = %d\n",
423 evtIdx = Bgpm_GetEventIndex( ptr->EventGroup,
427 printf(
_AT_ " _bgq_update_control_state: evtIdx in EventGroup = %d\n",
431 retval = Bgpm_SetXuGrpMask( ptr->EventGroup,
437 printf(
_AT_ " _bgq_update_control_state: it's PEVT_INST_XU_GRP_MASK\n" );
439 }
else if ( 0 == strcmp(
GenericEvent[j].
mask,
"PEVT_INST_QFPU_GRP_MASK" ) ) {
440 retval = Bgpm_SetQfpuGrpMask( ptr->EventGroup,
446 printf(
_AT_ " _bgq_update_control_state: it's PEVT_INST_QFPU_GRP_MASK\n" );
454 printf(
_AT_ " _bgq_update_control_state: no OPCODE\n" );
458 retval = Bgpm_AddEvent( ptr->EventGroup, index );
462 printf(
_AT_ " _bgq_update_control_state: ADD event: i = %d, index = %d\n",
i, index );
474 if ( 1 == ptr->muxOn ) {
480 if ( 1 == ptr->overflow ) {
481 for ( k = 0; k < ptr->overflow_count; k++ ) {
483 ptr->overflow_list[k].EventIndex,
484 ptr->overflow_list[k].threshold,
502 printf(
"BEGIN _bgq_start\n" );
507 retval = Bgpm_Apply( ptr->EventGroup );
512 ptr->bgpm_eventset_applied = 1;
516 int numEvts = Bgpm_NumEvents( ptr->EventGroup );
517 for (
i = 0;
i < numEvts;
i++ ) {
518 printf(
"%d = %s\n",
i, Bgpm_GetEventLabel( ptr->EventGroup,
i) );
524 retval = Bgpm_Start( ptr->EventGroup );
538 printf(
"BEGIN _bgq_stop\n" );
543 retval = Bgpm_Stop( ptr->EventGroup );
560 printf(
"_bgq_read\n" );
566 numEvts = Bgpm_NumEvents( ptr->EventGroup );
567 if ( numEvts == 0 ) {
569 printf (
"Error: ret value is %d for BGPM API function Bgpm_NumEvents.\n", numEvts );
574 for (
i = 0;
i < numEvts;
i++ )
591 printf(
"_bgq_reset\n" );
600 retval = Bgpm_Stop( ptr->EventGroup );
604 retval = Bgpm_ResetStart( ptr->EventGroup );
623 printf(
"_bgq_shutdown\n" );
646 printf(
"_bgq_write\n" );
669 printf(
"BEGIN _bgq_dispatch_timer\n");
687 printf(
"user_signal_handler start\n" );
705 unsigned ovfIdxs[BGPM_MAX_OVERFLOW_EVENTS];
706 unsigned len = BGPM_MAX_OVERFLOW_EVENTS;
708 retval = Bgpm_GetOverflowEventIndices( hEvtSet, ovfVector, ovfIdxs, &len );
712 printf (
"Error: ret value is %d for BGPM API function Bgpm_GetOverflowEventIndices.\n",
719 PAPIERROR(
"thread == NULL in user_signal_handler!" );
724 PAPIERROR(
"ESI == NULL in user_signal_handler!");
729 PAPIERROR(
"ESI->overflow.flags == 0 in user_signal_handler!");
733 for (
i = 0;
i < len;
i++ ) {
735 Bgpm_GetEventUser1( hEvtSet, ovfIdxs[
i], &hProf );
737 overflow_bit ^= 1 << ovfIdxs[
i];
745 printf(
"OVERFLOW_SOFTWARE\n");
753 printf(
"OVERFLOW_HARDWARE\n");
760 printf(
"OVERFLOW_NONE\n");
762 PAPIERROR(
"ESI->overflow.flags is set to something other than PAPI_OVERFLOW_HARDWARE or PAPI_OVERFLOW_FORCE_SW (%#x)",
thread->running_eventset[
cidx]->overflow.flags);
779 printf(
"BEGIN _bgq_set_overflow\n");
791 printf(
"_bgq_set_overflow: bgpm_eventset_applied = %d, threshold = %d\n",
792 this_state->bgpm_eventset_applied,
threshold );
794 if ( 1 == this_state->bgpm_eventset_applied && 0 !=
threshold ) {
799 this_state->EventGroup_local,
800 &this_state->EventGroup );
805 this_state->bgpm_eventset_applied = 0;
811 SUBDBG(
"Hardware counter %d (vs %d) used in overflow, threshold %d\n",
814 printf(
"Hardware counter %d (vs %d) used in overflow, threshold %d\n",
826 this_state->overflow = 1;
827 this_state->overflow_count++;
828 this_state->overflow_list[this_state->overflow_count-1].threshold =
threshold;
829 this_state->overflow_list[this_state->overflow_count-1].EventIndex = evt_idx;
832 printf(
"_bgq_set_overflow: Enable the signal handler\n" );
842 this_state->overflow_list[this_state->overflow_count-1].EventIndex,
843 this_state->overflow_list[this_state->overflow_count-1].threshold,
861 printf(
"BEGIN _bgq_set_profile\n");
880 printf(
"BEGIN _bgq_stop_profiling\n");
898 printf(
"_bgq_ctl\n" );
907 bgq_state->muxOn = 1;
923 printf(
"_bgq_get_real_usec\n" );
931 return ( (
long long ) ( ( (
float )
get_cycles( ) ) /
945 printf(
"_bgq_get_real_cycles\n" );
961 printf(
"_bgq_get_virt_usec\n" );
976 printf(
"_bgq_get_virt_cycles\n" );
993 printf(
"_bgq_init_substrate\n");
1014 SUBDBG(
"Before _bgq_get_system_info()...\n" );
1016 SUBDBG(
"After _bgq_get_system_info(), retval=%d...\n",
retval );
1024 SUBDBG(
"Before _bgq_get_memory_info...\n" );
1028 SUBDBG(
"After _bgq_get_memory_info, retval=%d...\n",
retval );
1037 pthread_mutex_init( &
thdLocks[
i], NULL );
1063 printf(
"_bgq_ntv_name_to_code\n" );
1067 printf(
"name = ===%s===\n",
name );
1073 if ( 0 == strncmp(
name,
"PEVT_INST_XU_GRP_MASK", strlen(
"PEVT_INST_XU_GRP_MASK" ) ) ||
1074 0 == strncmp(
name,
"PEVT_INST_QFPU_GRP_MASK", strlen(
"PEVT_INST_QFPU_GRP_MASK" ) ) ) {
1077 pcolon = strchr(
name,
':' );
1080 if ( pcolon != NULL ) {
1081 int mask_len = pcolon -
name;
1092 printf (
"Error: ret value is %d for BGPM API function '%s'.\n",
1093 ret,
"Bgpm_GetEventIdFromLabel" );
1105 SUBDBG(
"Allocating more room for BGPM opcode events (%d %ld)\n",
1119 SUBDBG(
"Error: Found a generic BGPM event mask without opcode string\n" );
1136 ret = Bgpm_GetEventIdFromLabel (
name );
1140 printf (
"Error: ret value is %d for BGPM API function '%s'.\n",
1141 ret,
"Bgpm_GetEventIdFromLabel" );
1148 *event_code = ( ret - 1 );
1164 printf(
"_bgq_ntv_code_to_name\n" );
1171 strncpy(
name, Bgpm_GetEventIdLabel( index ), len );
1173 if (
name == NULL ) {
1175 printf (
"Error: ret value is NULL for BGPM API function Bgpm_GetEventIdLabel.\n" );
1180 printf(
"name = ===%s===\n",
name );
1195 printf(
"_bgq_ntv_code_to_descr\n" );
1200 retval = Bgpm_GetLongDesc( index,
name, &len );
1221 printf(
"_bgq_ntv_code_to_bits\n" );
1238 printf(
"_bgq_ntv_enum_events\n" );
1241 switch ( modifier ) {
1253 *EventCode = *EventCode + 1;
1271 struct utsname uname_buffer;
1274 uname(&uname_buffer);
1294 .
name =
"linux-bgq",
1295 .short_name =
"bgq",
1296 .description =
"Blue Gene/Q component",
1306 .kernel_multiplex = 1,
1309 .fast_real_timer = 1,
1310 .fast_virtual_timer = 0,
#define GET_OVERFLOW_ADDRESS(ctx)
#define _papi_hwd_unlock(lck)
#define _papi_hwd_lock(lck)
#define PAPI_OVERFLOW_FORCE_SW
#define PAPI_OVERFLOW_HARDWARE
int _common_set_overflow_BGPM(int EventGroup, int evt_idx, int threshold, void(*handler)(int, uint64_t, uint64_t, const ucontext_t *))
int _common_deleteRecreate(int *EventGroup_ptr)
int _common_rebuildEventgroup(int count, int *EventGroup_local, int *EventGroup_ptr)
long_long _common_getEventValue(unsigned event_id, int EventGroup)
int _check_BGPM_error(int err, char *bgpmfunc)
papi_vector_t _bgq_vectors
int _bgq_read(hwd_context_t *ctx, hwd_control_state_t *ptr, long_long **dp, int flags)
int _bgq_ntv_enum_events(unsigned int *EventCode, int modifier)
int _bgq_allocate_registers(EventSetInfo_t *ESI)
long long _bgq_get_virt_usec(void)
long long _bgq_get_real_cycles(void)
int _bgq_get_dmem_info(PAPI_dmem_info_t *pDmemInfo)
int _bgq_stop(hwd_context_t *ctx, hwd_control_state_t *ptr)
static int allocated_opcode_events
int _bgq_ctl(hwd_context_t *ctx, int code, _papi_int_option_t *option)
int _bgq_stop_profiling(ThreadInfo_t *master, EventSetInfo_t *ESI)
int _bgq_get_system_info(papi_mdi_t *mdi)
static struct bgq_generic_events_t * GenericEvent
long long _bgq_get_real_usec(void)
UPC_Lock_t thdLocks[PAPI_MAX_LOCK]
int _bgq_ntv_code_to_name(unsigned int EventCode, char *name, int len)
int _bgq_init(hwd_context_t *ctx)
int _papi_hwi_init_os(void)
void _bgq_dispatch_timer(int signal, hwd_siginfo_t *info, void *uc)
int _bgq_start(hwd_context_t *ctx, hwd_control_state_t *ptr)
long long _bgq_get_virt_cycles(void)
PAPI_os_info_t _papi_os_info
int _bgq_set_overflow(EventSetInfo_t *ESI, int EventIndex, int threshold)
int _bgq_set_profile(EventSetInfo_t *ESI, int EventIndex, int threshold)
int _bgq_ntv_name_to_code(const char *name, unsigned int *event_code)
int _bgq_set_domain(hwd_control_state_t *cntrl, int domain)
int _bgq_reset(hwd_context_t *ctx, hwd_control_state_t *ptr)
int _bgq_update_control_state(hwd_control_state_t *ptr, NativeInfo_t *native, int count, hwd_context_t *ctx)
int _bgq_init_control_state(hwd_control_state_t *ptr)
int _bgq_multiplex(hwd_control_state_t *bgq_state)
int _bgq_get_memory_info(PAPI_hw_info_t *pHwInfo, int pCPU_Type)
void user_signal_handler(int hEvtSet, uint64_t address, uint64_t ovfVector, const ucontext_t *pContext)
#define OPCODE_EVENT_CHUNK
int _bgq_write(hwd_context_t *ctx, hwd_control_state_t *cntrl, long_long *from)
int _bgq_ntv_code_to_descr(unsigned int EventCode, char *name, int len)
papi_os_vector_t _papi_os_vector
int _bgq_ntv_code_to_bits(unsigned int EventCode, hwd_register_t *bits)
int _bgq_init_component(int cidx)
static int num_opcode_events
int _bgq_cleanup_eventset(hwd_control_state_t *ctrl)
int _bgq_shutdown(hwd_context_t *ctx)
This file has the source code for a component that enables PAPI-C to access hardware monitoring count...
#define BGQ_PUNIT_MAX_COUNTERS
#define BGQ_PUNIT_MAX_EVENTS
#define PAPI_NATIVE_AND_MASK
Return codes and api definitions.
#define SUBDBG(format, args...)
__sighandler_t signal(int __sig, __sighandler_t __handler) __attribute__((__nothrow__
void PAPIERROR(char *format,...)
#define PAPI_INT_MPX_SIGNAL
int _papi_load_preset_table(char *pmu_str, int pmu_type, int cidx)
papi_mdi_t _papi_hwi_system_info
int pos[PAPI_EVENTS_IN_DERIVED_EVENT]
EventInfo_t * EventInfoArray
hwd_control_state_t * ctl_state
NativeInfo_t * NativeInfoArray
EventSetOverflowInfo_t overflow
char name[PAPI_MAX_STR_LEN]
A pointer to the following is passed to PAPI_get_dmem_info()
char version[PAPI_MAX_STR_LEN]
char name[PAPI_MAX_STR_LEN]
hwd_ucontext_t * ucontext
char mask[PAPI_MIN_STR_LEN]
char opcode[PAPI_MIN_STR_LEN]
int(* get_memory_info)(PAPI_hw_info_t *, int)
PAPI_component_info_t cmp_info
inline_static ThreadInfo_t * _papi_hwi_lookup_thread(int custom_tid)
_papi_int_multiplex_t multiplex