43#include <msr_counters.h>
57typedef struct _libmsr_register {
61typedef struct _libmsr_native_event_entry {
71typedef struct _libmsr_reg_alloc {
76#define LIBMSR_MAX_COUNTERS 64
77#define LIBMSR_MAX_PACKAGES 64
82#define HANDLE_STRING_ERROR {fprintf(stderr,"%s:%i unexpected string function error.\n",__FILE__,__LINE__); exit(-1);}
84typedef struct _libmsr_control_state {
98typedef struct _libmsr_context {
129static int (*init_msr_ptr)();
130static int (*finalize_msr_ptr)();
131static int (*rapl_init_ptr)(
struct rapl_data ** rapl, uint64_t ** rapl_flags);
132static int (*poll_rapl_data_ptr) ( );
133static void (*set_pkg_rapl_limit_ptr) (
const int socket,
struct rapl_limit* limit1,
struct rapl_limit* limit2 );
134static void (*get_pkg_rapl_limit_ptr) (
const int socket,
struct rapl_limit* limit1,
struct rapl_limit* limit2 );
135static int (*core_config_ptr) (uint64_t * coresPerSocket, uint64_t * threadsPerCore, uint64_t * sysSockets,
int * HTenabled);
136static int (*rapl_storage_ptr) (
struct rapl_data ** data, uint64_t ** flags);
137static int (*get_rapl_power_info_ptr) (
const unsigned socket,
struct rapl_power_info *info);
140static int libmsr_init_msr () {
return ((*init_msr_ptr)()); }
142static int libmsr_rapl_init (
struct rapl_data ** rapl_data, uint64_t ** rapl_flags) {
return (*rapl_init_ptr)( rapl_data, rapl_flags ); }
144static void libmsr_set_pkg_rapl_limit (
const int socket,
struct rapl_limit* limit1,
struct rapl_limit* limit2 ) {
return (*set_pkg_rapl_limit_ptr) ( socket, limit1, limit2 ); }
145static void libmsr_get_pkg_rapl_limit (
const int socket,
struct rapl_limit* limit1,
struct rapl_limit* limit2 ) {
return (*get_pkg_rapl_limit_ptr) ( socket, limit1, limit2 ); }
146static int libmsr_core_config(uint64_t * coresPerSocket, uint64_t * threadsPerCore, uint64_t * sysSockets,
int * HTenabled) {
return (*core_config_ptr) ( coresPerSocket, threadsPerCore, sysSockets, HTenabled ); }
147static int libmsr_rapl_storage(
struct rapl_data ** data, uint64_t ** flags) {
return (*rapl_storage_ptr) (data, flags); }
148static int libmsr_get_rapl_power_info(
const unsigned socket,
struct rapl_power_info *info) {
return (*get_rapl_power_info_ptr) ( socket, info); }
151#define CHECK_DL_STATUS( err, str ) if( err ) { \
152 char* strCpy=strncpy(_libmsr_vector.cmp_info.disabled_reason, str, PAPI_MAX_STR_LEN); \
153 _libmsr_vector.cmp_info.disabled_reason[PAPI_MAX_STR_LEN-1]=0; \
154 if (strCpy == NULL) HANDLE_STRING_ERROR; \
155 return ( PAPI_ENOSUPP ); }
168 char path_name[1024];
169 char *libmsr_root = getenv(
"PAPI_LIBMSR_ROOT");
185 dl1 = dlopen(
"libmsr.so", RTLD_NOW | RTLD_GLOBAL);
189 if (
dl1 == NULL && libmsr_root != NULL) {
190 int strErr=snprintf(path_name, 1024-2,
"%s/lib/libmsr.so", libmsr_root);
193 dl1 = dlopen(path_name, RTLD_NOW | RTLD_GLOBAL);
207 init_msr_ptr = dlsym(
dl1,
"init_msr" );
208 CHECK_DL_STATUS( dlerror()!=NULL ,
"libmsr function init_msr not found." );
209 finalize_msr_ptr = dlsym(
dl1,
"finalize_msr" );
210 CHECK_DL_STATUS( dlerror()!=NULL,
"libmsr function finalize_msr not found." );
211 rapl_init_ptr = dlsym(
dl1,
"rapl_init" );
212 CHECK_DL_STATUS( dlerror()!=NULL,
"libmsr function rapl_init not found." );
213 poll_rapl_data_ptr = dlsym(
dl1,
"poll_rapl_data" );
214 CHECK_DL_STATUS( dlerror()!=NULL,
"libmsr function poll_rapl_data not found." );
215 set_pkg_rapl_limit_ptr = dlsym(
dl1,
"set_pkg_rapl_limit" );
216 CHECK_DL_STATUS( dlerror()!=NULL,
"libmsr function set_pkg_rapl_limit not found." );
217 get_pkg_rapl_limit_ptr = dlsym(
dl1,
"get_pkg_rapl_limit" );
218 CHECK_DL_STATUS( dlerror()!=NULL,
"libmsr function get_pkg_rapl_limit not found." );
219 core_config_ptr = dlsym(
dl1,
"core_config" );
220 CHECK_DL_STATUS( dlerror()!=NULL,
"libmsr function core_config not found." );
221 rapl_storage_ptr = dlsym(
dl1,
"rapl_storage" );
222 CHECK_DL_STATUS( dlerror()!=NULL,
"libmsr function rapl_storage not found." );
223 get_rapl_power_info_ptr = dlsym(
dl1,
"get_rapl_power_info" );
224 CHECK_DL_STATUS( dlerror()!=NULL,
"libmsr function get_rapl_power_info not found." );
235 char *
retval = strncpy( dst, src, size );
236 if ( size>0 ) dst[size-1] =
'\0';
243 uint64_t socket, numSockets;
244 struct rapl_power_info raplinfo;
245 struct rapl_limit socketlim, socketlim2;
247 SUBDBG(
"Enter: Resetting the sockets to defaults\n");
249 for (socket = 0; socket < numSockets; socket++) {
252 socketlim.watts = raplinfo.pkg_therm_power;
253 socketlim.seconds = 1;
255 socketlim2.watts = raplinfo.pkg_therm_power * 1.2;
256 socketlim2.seconds = 3;
257 SUBDBG(
"Resetting socket %ld to defaults (%f,%f) (%f,%f)\n", socket, socketlim.watts, socketlim.seconds, socketlim2.watts, socketlim2.seconds);
289 struct rapl_data * libmsr_rapl_data;
290 uint64_t * libmsr_rapl_flags;
291 uint64_t coresPerSocket, threadsPerCore, numSockets;
308 SUBDBG (
"Dynamic link of libmsr.so libraries failed, component will be disabled.\n");
309 SUBDBG (
"See disable reason in papi_component_avail output for more details.\n");
315 if ( libmsr_init_msr() != 0 ) {
316 SUBDBG(
"init_msr (libmsr) returned error. Possible permission problem accessing /dev/cpu/<n>/msr_safe or /dev/cpu/<n>/msr");
327 SUBDBG(
"Library libmsr could not initialize RAPL (libmsr/rapl_init failed)");
392 SUBDBG(
"Could not allocate memory\n" );
404 sprintf(
libmsr_native_events[
i].description,
"Number of Joules consumed by all cores and last level cache on package. Unit is Joules (double precision).");
413 sprintf(
libmsr_native_events[
i].description,
"Watts consumed by package. Unit is Watts (double precision).");
422 sprintf(
libmsr_native_events[
i].description,
"Time elapsed since last LIBMSR data reading from package. Unit is seconds (double precision).");
431 sprintf(
libmsr_native_events[
i].description,
"Number of Joules consumed by package since last LIBMSR data reading. Unit is Joules (double precision).");
440 sprintf(
libmsr_native_events[
i].description,
"Average power limit over PKG_TIME_WINDOW_POWER_LIMIT_1 for package. Read/Write. Unit is Watts (double precision).");
449 sprintf(
libmsr_native_events[
i].description,
"Time window used for averaging PACKAGE_POWER_LIMIT_1 for package. Read/Write. Unit is seconds (double precision).");
458 sprintf(
libmsr_native_events[
i].description,
"Average power limit over PKG_TIME_WINDOW_POWER_LIMIT_2 for package. Read/Write. Unit is Watts (double precision).");
467 sprintf(
libmsr_native_events[
i].description,
"Time window used for averaging PACKAGE_POWER_LIMIT_2 for package. Read/Write. Unit is seconds (double precision).");
503 SUBDBG(
"Enter: ctl: %p\n", ctl );
519 SUBDBG(
"Enter: ctl: %p, ctx: %p\n", ctl, ctx );
526 for( nn = 0; nn <
count; nn++ ) {
528 native[nn].ni_position = nn;
530 control->
count[nn] = 0;
541 SUBDBG(
"Enter: ctl: %p, ctx: %p\n", ctl, ctx );
547 SUBDBG(
"Function libmsr.so:poll_rapl_data failed.\n");
556 SUBDBG(
"Enter: ctl: %p, ctx: %p\n", ctl, ctx );
561 union {
long long ll;
double dbl; } event_value_union;
562 struct rapl_limit limit1, limit2;
564 struct rapl_data * libmsr_rapl_data;
565 uint64_t * libmsr_rapl_flags;
569 SUBDBG(
"Function libmsr.so:rapl_storage failed.\n");
576 SUBDBG(
"Calling poll_rapl_data to read state from all sockets\n");
578 SUBDBG(
"Function libmsr.so:poll_rapl_data failed.\n");
586 SUBDBG(
"Go thru events, assign package data to events as needed\n");
590 event_value_union.ll = 0LL;
592 SUBDBG(
"nn %d ee %d pp %d eventtype %d\n", nn, ee, pp, eventtype);
595 event_value_union.dbl = libmsr_rapl_data->pkg_joules[pp];
598 event_value_union.dbl = libmsr_rapl_data->elapsed;
601 event_value_union.dbl = libmsr_rapl_data->pkg_delta_joules[pp];
604 event_value_union.dbl = libmsr_rapl_data->pkg_watts[pp];
607 limit1.bits = 0; limit1.watts = 0; limit1.seconds = 0;
609 event_value_union.dbl = limit1.watts;
612 limit1.bits = 0; limit1.watts = 0; limit1.seconds = 0;
614 event_value_union.dbl = limit1.seconds;
617 limit2.bits = 0; limit2.watts = 0; limit2.seconds = 0;
619 event_value_union.dbl = limit2.watts;
622 limit2.bits = 0; limit2.watts = 0; limit2.seconds = 0;
624 event_value_union.dbl = limit2.seconds;
627 SUBDBG(
"This LIBMSR event is unknown\n");
630 control->
count[nn] = event_value_union.ll;
654 SUBDBG(
"Enter: ctl: %p, ctx: %p\n", ctl, ctx );
660 union {
long long ll;
double dbl; } event_value_union;
661 union {
long long ll;
double dbl; } timewin_union;
662 struct rapl_limit limit1, limit2;
670 event_value_union.ll =
values[nn];
672 if ( event_value_union.ll ==
PAPI_NULL )
continue;
674 SUBDBG(
"nn %d ee %d pp %d eventtype %d\n", nn, ee, pp, eventtype);
684 if ( timewin_union.ll > 0 ) {
685 limit1.watts = event_value_union.dbl;
686 limit1.seconds = timewin_union.dbl;
692 SUBDBG(
"PACKAGE_POWER_LIMIT_1 needs PKG_TIME_WINDOW_POWER_LIMIT_1: Power cap not updated. ");
697 if ( timewin_union.ll > 0 ) {
698 limit2.watts = event_value_union.dbl;
699 limit2.seconds = timewin_union.dbl;
705 PAPIERROR(
"PACKAGE_POWER_LIMIT_1 needs PKG_TIME_WINDOW_POWER_LIMIT_1: Powercap not updated.");
713 SUBDBG(
"This LIBMSR information type is unknown\n");
723 SUBDBG(
"Enter: ctl: %p, ctx: %p\n", ctl, ctx );
734 SUBDBG(
"Enter: ctl: %p\n", ctx );
750 SUBDBG(
"Function libmsr.so:finalize_msr failed.\n");
767 SUBDBG(
"Enter: ctx: %p\n", ctx );
788 SUBDBG(
"Enter: ctl: %p\n", ctl );
800 SUBDBG(
"Enter: ctl: %p, ctx: %p\n", ctl, ctx );
813 SUBDBG(
"Enter: EventCode: %d\n", *EventCode );
818 switch ( modifier ) {
826 *EventCode = *EventCode + 1;
846 SUBDBG(
"Enter: EventCode: %d\n", EventCode );
859 SUBDBG(
"Enter: EventCode: %d\n", EventCode );
860 int index = EventCode;
872 SUBDBG(
"Enter: EventCode: %d\n", EventCode );
873 int index = EventCode;
889 .short_name =
"libmsr",
890 .description =
"PAPI component for libmsr from LANL for power (RAPL) read/write",
static const PAPI_hw_info_t * hw_info
struct papi_vectors * _papi_hwd[]
#define PAPI_DATATYPE_FP64
#define PAPI_VENDOR_INTEL
char events[MAX_EVENTS][BUFSIZ]
static long long values[NUM_EVENTS]
int _libmsr_shutdown_component(void)
#define LIBMSR_MAX_PACKAGES
papi_vector_t _libmsr_vector
static void libmsr_get_pkg_rapl_limit(const int socket, struct rapl_limit *limit1, struct rapl_limit *limit2)
@ PKG_TIME_WINDOW_POWER_LIMIT_1
@ PKG_TIME_WINDOW_POWER_LIMIT_2
int _libmsr_ctl(hwd_context_t *ctx, int code, _papi_int_option_t *option)
static int already_called_libmsr_rapl_initialized_global
int _libmsr_shutdown_thread(hwd_context_t *ctx)
int _libmsr_set_domain(hwd_control_state_t *ctl, int domain)
int _libmsr_ntv_code_to_name(unsigned int EventCode, char *name, int len)
int _libmsr_reset(hwd_context_t *ctx, hwd_control_state_t *ctl)
static long long _local_get_eventval_from_values(_libmsr_control_state_t *control, long long *invalues, int package_num, eventtype_enum eventtype, long long defaultval)
int _libmsr_write(hwd_context_t *ctx, hwd_control_state_t *ctl, long long *values)
int _libmsr_ntv_code_to_descr(unsigned int EventCode, char *name, int len)
int _libmsr_init_thread(hwd_context_t *ctx)
void _local_set_to_defaults()
static void libmsr_set_pkg_rapl_limit(const int socket, struct rapl_limit *limit1, struct rapl_limit *limit2)
static char * _local_strlcpy(char *dst, const char *src, size_t size)
static int libmsr_core_config(uint64_t *coresPerSocket, uint64_t *threadsPerCore, uint64_t *sysSockets, int *HTenabled)
#define CHECK_DL_STATUS(err, str)
static int libmsr_rapl_init(struct rapl_data **rapl_data, uint64_t **rapl_flags)
int _libmsr_init_control_state(hwd_control_state_t *ctl)
static int libmsr_rapl_storage(struct rapl_data **data, uint64_t **flags)
int _libmsr_ntv_enum_events(unsigned int *EventCode, int modifier)
static _libmsr_native_event_entry_t * libmsr_native_events
int _libmsr_ntv_code_to_info(unsigned int EventCode, PAPI_event_info_t *info)
static int libmsr_finalize_msr()
int _libmsr_init_component(int cidx)
static int _local_linkDynamicLibraries()
#define LIBMSR_MAX_COUNTERS
int _libmsr_update_control_state(hwd_control_state_t *ctl, NativeInfo_t *native, int count, hwd_context_t *ctx)
static int libmsr_get_rapl_power_info(const unsigned socket, struct rapl_power_info *info)
static int num_events_global
void(* _dl_non_dynamic_init)(void)
static char libmsr_main[]
int _libmsr_read(hwd_context_t *ctx, hwd_control_state_t *ctl, long long **events, int flags)
int _libmsr_start(hwd_context_t *ctx, hwd_control_state_t *ctl)
static int libmsr_poll_rapl_data()
#define HANDLE_STRING_ERROR
int _libmsr_stop(hwd_context_t *ctx, hwd_control_state_t *ctl)
unsigned long AO_t __attribute__((__aligned__(4)))
#define PAPI_NATIVE_AND_MASK
Return codes and api definitions.
#define SUBDBG(format, args...)
void PAPIERROR(char *format,...)
papi_mdi_t _papi_hwi_system_info
char units[MAX_EVENTS][BUFSIZ]
char name[PAPI_MAX_STR_LEN]
char disabled_reason[PAPI_HUGE_STR_LEN]
char units[PAPI_MIN_STR_LEN]
char symbol[PAPI_HUGE_STR_LEN]
char long_descr[PAPI_HUGE_STR_LEN]
_libmsr_control_state_t state
int which_counter[LIBMSR_MAX_COUNTERS]
long long count[LIBMSR_MAX_COUNTERS]
int package_being_measured[LIBMSR_MAX_PACKAGES]
char description[PAPI_MAX_STR_LEN]
char name[PAPI_MAX_STR_LEN]
char units[PAPI_MIN_STR_LEN]
_libmsr_register_t resources
_libmsr_register_t ra_bits
PAPI_component_info_t cmp_info