35#define HANDLE_STRING_ERROR {fprintf(stderr,"%s:%i unexpected string function error.\n",__FILE__,__LINE__); exit(-1);}
41#define MSR_AMD_RAPL_POWER_UNIT 0xc0010299
43#define MSR_AMD_PKG_ENERGY_STATUS 0xc001029B
44#define MSR_AMD_PP0_ENERGY_STATUS 0xc001029A
58#define MSR_INTEL_RAPL_POWER_UNIT 0x606
61#define MSR_PKG_RAPL_POWER_LIMIT 0x610
62#define MSR_INTEL_PKG_ENERGY_STATUS 0x611
63#define MSR_PKG_PERF_STATUS 0x613
64#define MSR_PKG_POWER_INFO 0x614
67#define MSR_PP0_POWER_LIMIT 0x638
68#define MSR_INTEL_PP0_ENERGY_STATUS 0x639
69#define MSR_PP0_POLICY 0x63A
70#define MSR_PP0_PERF_STATUS 0x63B
73#define MSR_PP1_POWER_LIMIT 0x640
74#define MSR_PP1_ENERGY_STATUS 0x641
75#define MSR_PP1_POLICY 0x642
78#define MSR_DRAM_POWER_LIMIT 0x618
79#define MSR_DRAM_ENERGY_STATUS 0x619
80#define MSR_DRAM_PERF_STATUS 0x61B
81#define MSR_DRAM_POWER_INFO 0x61C
84#define MSR_PLATFORM_ENERGY_STATUS 0x64d
87#define POWER_UNIT_OFFSET 0
88#define POWER_UNIT_MASK 0x0f
90#define ENERGY_UNIT_OFFSET 0x08
91#define ENERGY_UNIT_MASK 0x1f
93#define TIME_UNIT_OFFSET 0x10
94#define TIME_UNIT_MASK 0x0f
97#define POWER_INFO_UNIT_MASK 0x7fff
98#define THERMAL_SHIFT 0
99#define MINIMUM_POWER_SHIFT 16
100#define MAXIMUM_POWER_SHIFT 32
101#define MAXIMUM_TIME_WINDOW_SHIFT 48
104typedef struct _rapl_register
109typedef struct _rapl_native_event_entry
121typedef struct _rapl_reg_alloc
127#define RAPL_MAX_COUNTERS 64
129typedef struct _rapl_control_state
143typedef struct _rapl_context
167#define PACKAGE_ENERGY 0
168#define PACKAGE_THERMAL 1
169#define PACKAGE_MINIMUM 2
170#define PACKAGE_MAXIMUM 3
171#define PACKAGE_TIME_WINDOW 4
172#define PACKAGE_ENERGY_CNT 5
173#define PACKAGE_THERMAL_CNT 6
174#define PACKAGE_MINIMUM_CNT 7
175#define PACKAGE_MAXIMUM_CNT 8
176#define PACKAGE_TIME_WINDOW_CNT 9
177#define DRAM_ENERGY 10
178#define PLATFORM_ENERGY 11
189 if (
fd<0 || pread(
fd, &data,
sizeof data, which) !=
sizeof data ) {
190 perror(
"rdmsr:pread");
191 fprintf(
stderr,
"rdmsr error, msr %x\n",which);
195 return (
long long)data;
201 char filename[BUFSIZ];
204 sprintf(filename,
"/dev/cpu/%d/msr_safe",offset);
205 fd =
open(filename, O_RDONLY);
207 sprintf(filename,
"/dev/cpu/%d/msr",offset);
208 fd =
open(filename, O_RDONLY);
238 return_val.ll = value;
253 return_val.fp = (double)
259 return_val.fp = (double)
265 return_val.fp = (double)
271 return_val.fp = (double)
292 return return_val.ll;
299 int num_read, nr_cpus = 1;
300 fff=fopen(
"/sys/devices/system/cpu/kernel_max",
"r");
301 if (
fff==NULL)
return nr_cpus;
302 num_read=fscanf(
fff,
"%d",&nr_cpus);
337 char filename[BUFSIZ];
338 long unsigned int strErr;
341 int package_avail, dram_avail, pp0_avail, pp1_avail, psys_avail;
350 int packages[nr_cpus];
351 int cpu_to_use[nr_cpus];
353 unsigned int msr_pkg_energy_status,msr_pp0_energy_status;
357 for (
i=0;
i<nr_cpus; ++
i) {
490 "CPU model not supported",
535 strErr=snprintf(filename, BUFSIZ,
536 "/sys/devices/system/cpu/cpu%d/topology/physical_package_id",j);
537 filename[BUFSIZ-1]=0;
539 fff=fopen(filename,
"r");
540 if (
fff==NULL)
break;
541 num_read=fscanf(
fff,
"%d",&package);
554 if ((package >= 0) && (package < nr_cpus)) {
555 if (packages[package] == -1) {
557 packages[package]=package;
558 cpu_to_use[package]=j;
562 SUBDBG(
"Package outside of allowed range\n");
576 SUBDBG(
"Can't access /dev/cpu/*/<msr_safe | msr>\n");
598 "Can't open fd for cpu0: %s",strerror(
errno));
629 if ( different_units ) {
673 "THERMAL_SPEC_CNT:PACKAGE%d",j);
678 "Thermal specification in counts; package %d",j);
688 "THERMAL_SPEC:PACKAGE%d",j);
697 "Thermal specification for package %d",j);
713 "MINIMUM_POWER_CNT:PACKAGE%d",j);
717 "Minimum power in counts; package %d",j);
727 "MINIMUM_POWER:PACKAGE%d",j);
734 "Minimum power for package %d",j);
750 "MAXIMUM_POWER_CNT:PACKAGE%d",j);
754 "Maximum power in counts; package %d",j);
764 "MAXIMUM_POWER:PACKAGE%d",j);
771 "Maximum power for package %d",j);
787 "MAXIMUM_TIME_WINDOW_CNT:PACKAGE%d",j);
791 "Maximum time window in counts; package %d",j);
801 "MAXIMUM_TIME_WINDOW:PACKAGE%d",j);
808 "Maximum time window for package %d",j);
826 "PACKAGE_ENERGY_CNT:PACKAGE%d",j);
830 "Energy used in counts by chip package %d",j);
840 "PACKAGE_ENERGY:PACKAGE%d",j);
847 "Energy used by chip package %d",j);
864 "PP1_ENERGY_CNT:PACKAGE%d",j);
868 "Energy used in counts by Power Plane 1 (Often GPU) on package %d",j);
878 "PP1_ENERGY:PACKAGE%d",j);
885 "Energy used by Power Plane 1 (Often GPU) on package %d",j);
902 "DRAM_ENERGY_CNT:PACKAGE%d",j);
906 "Energy used in counts by DRAM on package %d",j);
916 "DRAM_ENERGY:PACKAGE%d",j);
923 "Energy used by DRAM on package %d",j);
941 "PSYS_ENERGY_CNT:PACKAGE%d",j);
945 "Energy used in counts by SoC on package %d",j);
955 "PSYS_ENERGY:PACKAGE%d",j);
962 "Energy used by SoC on package %d",j);
979 "PP0_ENERGY_CNT:PACKAGE%d",j);
983 "Energy used in counts by all cores in package %d",j);
993 "PP0_ENERGY:PACKAGE%d",j);
1000 "Energy used by all cores in package %d",j);
1079 long long temp, newstart;
1088 if (temp < context->start_value[
i] ) {
1089 SUBDBG(
"Wraparound!\nstart:\t%#016x\ttemp:\t%#016x",
1092 SUBDBG(
"\tresult:\t%#016x\n", (
unsigned)temp);
1118 long long **
events,
int flags)
1243 switch ( modifier ) {
1260 *EventCode = *EventCode + 1;
1297 int index = EventCode;
1310 int index = EventCode;
1333 .short_name =
"rapl",
1334 .description =
"Linux RAPL energy measurements",
int open(const char *pathname, int flags, mode_t mode)
static const PAPI_hw_info_t * hw_info
get real time counter value in microseconds
struct papi_vectors * _papi_hwd[]
#define PAPI_DATATYPE_FP64
#define PAPI_VENDOR_INTEL
#define PAPI_DATATYPE_UINT64
char events[MAX_EVENTS][BUFSIZ]
static int _rapl_init_thread(hwd_context_t *ctx)
#define MSR_INTEL_PKG_ENERGY_STATUS
static int _rapl_set_domain(hwd_control_state_t *ctl, int domain)
#define ENERGY_UNIT_OFFSET
#define RAPL_MAX_COUNTERS
struct fd_array_t * fd_array
#define PACKAGE_TIME_WINDOW
static int _rapl_ntv_code_to_name(unsigned int EventCode, char *name, int len)
static int _rapl_ntv_enum_events(unsigned int *EventCode, int modifier)
#define MSR_AMD_PP0_ENERGY_STATUS
#define PACKAGE_MINIMUM_CNT
static int _rapl_stop(hwd_context_t *ctx, hwd_control_state_t *ctl)
#define MSR_PLATFORM_ENERGY_STATUS
static _rapl_native_event_entry_t * rapl_native_events
#define MSR_DRAM_ENERGY_STATUS
#define MSR_INTEL_PP0_ENERGY_STATUS
static long long read_rapl_value(int index)
#define MAXIMUM_POWER_SHIFT
static int _rapl_shutdown_component(void)
#define MSR_PKG_POWER_INFO
#define POWER_UNIT_OFFSET
static int _rapl_ctl(hwd_context_t *ctx, int code, _papi_int_option_t *option)
static long long convert_rapl_energy(int index, long long value)
#define MSR_AMD_PKG_ENERGY_STATUS
static int _rapl_start(hwd_context_t *ctx, hwd_control_state_t *ctl)
#define MSR_PP1_ENERGY_STATUS
static int _rapl_shutdown_thread(hwd_context_t *ctx)
static int _rapl_ntv_code_to_info(unsigned int EventCode, PAPI_event_info_t *info)
int _rapl_read(hwd_context_t *ctx, hwd_control_state_t *ctl, long long **events, int flags)
#define MSR_INTEL_RAPL_POWER_UNIT
#define MSR_AMD_RAPL_POWER_UNIT
unsigned int msr_rapl_power_unit
#define PACKAGE_MAXIMUM_CNT
papi_vector_t _rapl_vector
#define POWER_INFO_UNIT_MASK
static int _rapl_reset(hwd_context_t *ctx, hwd_control_state_t *ctl)
#define PACKAGE_THERMAL_CNT
#define PACKAGE_TIME_WINDOW_CNT
static int open_fd(int offset)
#define MINIMUM_POWER_SHIFT
static int _rapl_ntv_code_to_descr(unsigned int EventCode, char *name, int len)
static long long read_msr(int fd, unsigned int which)
static int _rapl_init_component(int cidx)
#define MAXIMUM_TIME_WINDOW_SHIFT
#define PACKAGE_ENERGY_CNT
static int _rapl_update_control_state(hwd_control_state_t *ctl, NativeInfo_t *native, int count, hwd_context_t *ctx)
static int _rapl_init_control_state(hwd_control_state_t *ctl)
static int get_kernel_nr_cpus(void)
#define HANDLE_STRING_ERROR
#define PAPI_NATIVE_AND_MASK
Return codes and api definitions.
#define SUBDBG(format, args...)
int fclose(FILE *__stream)
#define papi_calloc(a, b)
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]
long long start_value[RAPL_MAX_COUNTERS]
_rapl_control_state_t state
long long accumulated_value[RAPL_MAX_COUNTERS]
long long count[RAPL_MAX_COUNTERS]
int need_difference[RAPL_MAX_COUNTERS]
int being_measured[RAPL_MAX_COUNTERS]
char name[PAPI_MAX_STR_LEN]
char units[PAPI_MIN_STR_LEN]
char description[PAPI_MAX_STR_LEN]
_rapl_register_t resources
PAPI_component_info_t cmp_info