diff options
author | arjan <arjan@arjan-desktop.localdomain> | 2010-08-24 16:26:57 -0700 |
---|---|---|
committer | arjan <arjan@arjan-desktop.localdomain> | 2010-08-24 16:26:57 -0700 |
commit | 20a693ec2f0481db59a8c49008b0ca62c9f0c2f8 (patch) | |
tree | 2d1322ab3347ef7fa602d7fbfab4b764762055b3 /cpu | |
parent | b4e223905e422586979c2bbf60b03300037f9ab3 (diff) | |
download | powertop-20a693ec2f0481db59a8c49008b0ca62c9f0c2f8.tar.gz |
add cpu P states to the power parameters
Diffstat (limited to 'cpu')
-rw-r--r-- | cpu/cpu.cpp | 8 | ||||
-rw-r--r-- | cpu/cpu.h | 8 | ||||
-rw-r--r-- | cpu/cpu_package.cpp | 6 | ||||
-rw-r--r-- | cpu/cpudevice.cpp | 20 | ||||
-rw-r--r-- | cpu/cpudevice.h | 7 | ||||
-rw-r--r-- | cpu/intel_cpus.cpp | 2 |
6 files changed, 42 insertions, 9 deletions
diff --git a/cpu/cpu.cpp b/cpu/cpu.cpp index 852f3c8..2f47de9 100644 --- a/cpu/cpu.cpp +++ b/cpu/cpu.cpp @@ -5,6 +5,8 @@ #include <stdlib.h> #include "cpu.h" +#include "cpudevice.h" +#include "../parameters/parameters.h" #include "../perf/perf_bundle.h" #include "../lib.h" @@ -26,6 +28,8 @@ class perf_power_bundle: public perf_bundle static class abstract_cpu * new_package(int package, int cpu, char * vendor, int family, int model) { class abstract_cpu *ret = NULL; + class cpudevice *cpudev; + char packagename[128]; if (strcmp(vendor, "GenuineIntel") == 0) { if (family == 6 && model == 26) ret = new class nhm_package; @@ -35,6 +39,10 @@ static class abstract_cpu * new_package(int package, int cpu, char * vendor, int ret = new class cpu_package; ret->set_number(package, cpu); + + sprintf(packagename, "cpu package %i", cpu); + cpudev = new class cpudevice("cpu package", packagename, ret); + register_result_device(packagename, cpudev); return ret; } @@ -1,3 +1,7 @@ + +#ifndef __INCLUDE_GUARD_CPUDEV_H +#define __INCLUDE_GUARD_CPUDEV_H + #include <iostream> #include <vector> #include <string> @@ -47,13 +51,13 @@ struct frequency { class abstract_cpu { protected: - int number; int first_cpu; struct timeval stamp_before, stamp_after; double time_factor; uint64_t max_frequency; uint64_t max_minus_one_frequency; public: + int number; int childcount; bool idle, old_idle; uint64_t current_frequency; @@ -173,3 +177,5 @@ extern void start_cpu_measurement(void); extern void end_cpu_measurement(void); extern void process_cpu_data(void); extern void end_cpu_data(void); + +#endif
\ No newline at end of file diff --git a/cpu/cpu_package.cpp b/cpu/cpu_package.cpp index ff7903f..bdf987d 100644 --- a/cpu/cpu_package.cpp +++ b/cpu/cpu_package.cpp @@ -79,9 +79,13 @@ void cpu_package::measurement_end(void) abstract_cpu::measurement_end(); for (i = 0; i < pstates.size(); i ++) { - sprintf(buffer,"cpu-freq-%s", pstates[i]->human_name); + sprintf(buffer,"package-freq-%s", pstates[i]->human_name); printf("registering %s \n", buffer); register_parameter(buffer, 1); } + for (i = 0; i < pstates.size(); i ++) { + sprintf(buffer,"package-%i-freq-%s", number, pstates[i]->human_name); + report_utilization(buffer, percentage(1.0* (pstates[i]->time_after - pstates[i]->time_before) / time_factor * 10000 / pstates[i]->after_count)); + } }
\ No newline at end of file diff --git a/cpu/cpudevice.cpp b/cpu/cpudevice.cpp index 7f7dd8d..d3e1a6f 100644 --- a/cpu/cpudevice.cpp +++ b/cpu/cpudevice.cpp @@ -1,20 +1,34 @@ #include "cpudevice.h" +#include <stdlib.h> +#include <stdio.h> #include <string.h> +#include "../parameters/parameters.h" -cpudevice::cpudevice(const char *classname, const char *device_name) +cpudevice::cpudevice(const char *classname, const char *device_name, class abstract_cpu *_cpu) { strcpy(_class, classname); strcpy(_cpuname, device_name); + cpu = _cpu; } double cpudevice::power_usage(struct result_bundle *result, struct parameter_bundle *bundle) { double power = 0; + unsigned int i; - double factor; + for (i = 0; i < cpu->pstates.size(); i ++) { + double factor; + double util; + char buffer[128]; + sprintf(buffer,"package-freq-%s", cpu->pstates[i]->human_name); + factor = get_parameter_value(buffer, bundle); + sprintf(buffer,"package-%i-freq-%s", cpu->number, cpu->pstates[i]->human_name); + util = get_result_value(buffer, result); - return 0; + power += factor * util / 100.0; + } + return power; } diff --git a/cpu/cpudevice.h b/cpu/cpudevice.h index b8fe7f1..7eae8ce 100644 --- a/cpu/cpudevice.h +++ b/cpu/cpudevice.h @@ -7,21 +7,22 @@ using namespace std; #include "../devices/device.h" +#include "cpu.h" class cpudevice: public device { char _class[128]; char _cpuname[128]; vector<string> params; + class abstract_cpu *cpu; + public: - cpudevice(const char *classname = "cpu", const char *device_name = "cpu0"); + cpudevice(const char *classname = "cpu", const char *device_name = "cpu0", class abstract_cpu *_cpu = NULL); virtual const char * class_name(void) { return _class;}; virtual const char * device_name(void) {return _cpuname;}; virtual double power_usage(struct result_bundle *result, struct parameter_bundle *bundle); - - void give_param(string param); }; diff --git a/cpu/intel_cpus.cpp b/cpu/intel_cpus.cpp index 674cc32..c9f7a71 100644 --- a/cpu/intel_cpus.cpp +++ b/cpu/intel_cpus.cpp @@ -363,7 +363,7 @@ void nhm_package::measurement_end(void) char buffer[256]; for (i = 0; i < pstates.size(); i ++) { - sprintf(buffer,"cpu-freq-%s", pstates[i]->human_name); + sprintf(buffer,"package-freq-%s", pstates[i]->human_name); printf("registering %s \n", buffer); register_parameter(buffer, 1); } |