24#define EMON_DEFINE_GLOBALS
25#include <hwi/include/bqc/A2_inlines.h>
26#include <spi/include/emon/emon.h>
28#define EMON_MAX_COUNTERS 8
29#define EMON_TOTAL_EVENTS 8
32#define EMONDBG( fmt, args...) do {} while(0)
34#define EMONDBG( fmt, args... ) do { printf("%s:%d\t"fmt, __func__, __LINE__, ##args); } while(0)
38typedef struct EMON_register
49typedef struct EMON_native_event_entry
59typedef struct EMON_reg_alloc
64typedef struct EMON_overflow
71typedef struct EMON_control_state
80typedef struct EMON_context
92 printf(
"Error: EMON API function '%s' returned %d.\n",
105 .description =
"Chip core",
106 .resources.selector = 1,
111 .description =
"Chip Memory Interface and Dramm",
112 .resources.selector = 2,
117 .description =
"Optics",
118 .resources.selector = 3,
123 .description =
"Optics + PCIExpress",
124 .resources.selector = 4,
129 .description =
"HSS Network and Link Chip",
130 .resources.selector = 5,
135 .description =
"Link Chip Core",
136 .resources.selector = 6,
141 .description =
"Chip SRAM",
142 .resources.selector = 7,
145 { .name=
"EMON_DOMAIN_ALL",
146 .description =
"Measures power on all domains.",
147 .resources.selector = 8,
165 EMONDBG(
"EMON_init_thread\n" );
181 EMONDBG(
"EMON_init_component cidx = %d\n",
cidx );
185 ret = EMON_SetupPowerMeasurement();
205 EMONDBG(
"EMON_init_control_state\n" );
220 return_value.fp = -1;
222 double volts[14],amps[14];
225 double link_chip = 0;
232 EMONDBG(
"_emon_accessor, enter this_state = %x\n", this_state);
233 return_value.fp = EMON_GetPower_impl( volts, amps );
234 EMONDBG(
"_emon_accessor, after EMON_GetPower %lf \n", return_value.fp);
235 if ( -1 == return_value.fp ) {
240 this_state->
counters[7] = return_value.ll;
243 k_const = domain_info[0].k_const;
244 cpu += volts[0] * amps[0] * k_const;
245 cpu += volts[1] * amps[1] * k_const;
247 k_const = domain_info[1].k_const;
248 dram += volts[2] * amps[2] * k_const;
249 dram += volts[3] * amps[3] * k_const;
251 k_const = domain_info[2].k_const;
252 optics += volts[4] * amps[4] * k_const;
253 optics += volts[5] * amps[5] * k_const;
255 k_const = domain_info[3].k_const;
256 pci += volts[6] * amps[6] * k_const;
257 pci += volts[7] * amps[7] * k_const;
259 k_const = domain_info[4].k_const;
260 network += volts[8] * amps[8] * k_const;
261 network += volts[9] * amps[9] * k_const;
263 k_const = domain_info[5].k_const;
264 link_chip += volts[10] * amps[10] * k_const;
265 link_chip += volts[11] * amps[11] * k_const;
267 k_const = domain_info[6].k_const;
268 sram += volts[12] * amps[12] * k_const;
269 sram += volts[13] * amps[13] * k_const;
271 this_state->
counters[0] = *(
long long*)&cpu;
272 this_state->
counters[1] = *(
long long*)&dram;
273 this_state->
counters[2] = *(
long long*)&optics;
274 this_state->
counters[3] = *(
long long*)&pci;
275 this_state->
counters[4] = *(
long long*)&link_chip;
276 this_state->
counters[5] = *(
long long*)&network;
277 this_state->
counters[6] = *(
long long*)&sram;
325 long long **
events,
int flags )
345 EMONDBG(
"EMON_shutdown_thread\n" );
354 EMONDBG(
"EMON_shutdown_component\n" );
381 EMONDBG(
"EMON_cleanup_eventset\n" );
398 EMONDBG(
"EMON_update_control_state: count = %d\n",
count );
409 index = (
native[
i].ni_event ) ;
413 EMONDBG(
"EMON_update_control_state: ADD event: i = %d, index = %d\n",
i, index );
429 EMONDBG(
"EMON_set_domain\n" );
464 EMONDBG(
"EMON_ntv_enum_events, EventCode = %#x\n", *EventCode );
466 switch ( modifier ) {
475 int index = ( *EventCode );
478 *EventCode = *EventCode + 1;
498 EMONDBG(
"EMON_ntv_code_to_name\n" );
503 index = ( EventCode );
532 EMONDBG(
"EMON_ntv_code_to_descr\n" );
537 index = ( EventCode ) ;
554 EMONDBG(
"EMON_ntv_code_to_bits\n" );
564 int index = EventCode;
589 .short_name =
"EMON",
590 .description =
"Blue Gene/Q EMON component",
602 .kernel_multiplex = 0,
605 .fast_real_timer = 0,
606 .fast_virtual_timer = 0,
608 .attach_must_ptrace = 0,
#define PAPI_DATATYPE_FP64
char events[MAX_EVENTS][BUFSIZ]
int EMON_ctl(hwd_context_t *ctx, int code, _papi_int_option_t *option)
int EMON_stop(hwd_context_t *ctx, hwd_control_state_t *ptr)
static void _check_EMON_error(char *emon2func, int err)
int EMON_set_domain(hwd_control_state_t *cntrl, int domain)
int EMON_shutdown_component(void)
int EMON_ntv_enum_events(unsigned int *EventCode, int modifier)
int EMON_update_control_state(hwd_control_state_t *ptr, NativeInfo_t *native, int count, hwd_context_t *ctx)
int EMON_ntv_code_to_name(unsigned int EventCode, char *name, int len)
int EMON_read(hwd_context_t *ctx, hwd_control_state_t *ptr, long long **events, int flags)
#define EMONDBG(fmt, args...)
int EMON_init_control_state(hwd_control_state_t *ptr)
static int _emon_accessor(EMON_control_state_t *this_state)
papi_vector_t _emon2_vector
int EMON_ntv_code_to_bits(unsigned int EventCode, hwd_register_t *bits)
int EMON_init_component(int cidx)
int EMON_shutdown_thread(hwd_context_t *ctx)
int EMON_cleanup_eventset(hwd_control_state_t *ctrl)
#define EMON_TOTAL_EVENTS
int EMON_ntv_code_to_descr(unsigned int EventCode, char *name, int len)
int EMON_start(hwd_context_t *ctx, hwd_control_state_t *ptr)
int EMON_ntv_name_to_code(const char *name, unsigned int *code)
int EMON_reset(hwd_context_t *ctx, hwd_control_state_t *ptr)
papi_vector_t _emon_vector
int EMON_init_thread(hwd_context_t *ctx)
static EMON_native_event_entry_t EMON_native_table[]
#define EMON_MAX_COUNTERS
int EMON_ntv_code_to_info(unsigned int EventCode, PAPI_event_info_t *info)
Return codes and api definitions.
void PAPIERROR(char *format,...)
EMON_control_state_t state
long long counters[EMON_MAX_COUNTERS]
EMON_register_t resources
char name[PAPI_MAX_STR_LEN]
char symbol[PAPI_HUGE_STR_LEN]
char long_descr[PAPI_HUGE_STR_LEN]
PAPI_component_info_t cmp_info