aboutsummaryrefslogtreecommitdiff
path: root/cpu
diff options
context:
space:
mode:
authorarjan <arjan@arjan-desktop.localdomain>2010-08-24 16:26:57 -0700
committerarjan <arjan@arjan-desktop.localdomain>2010-08-24 16:26:57 -0700
commit20a693ec2f0481db59a8c49008b0ca62c9f0c2f8 (patch)
tree2d1322ab3347ef7fa602d7fbfab4b764762055b3 /cpu
parentb4e223905e422586979c2bbf60b03300037f9ab3 (diff)
downloadpowertop-20a693ec2f0481db59a8c49008b0ca62c9f0c2f8.tar.gz
add cpu P states to the power parameters
Diffstat (limited to 'cpu')
-rw-r--r--cpu/cpu.cpp8
-rw-r--r--cpu/cpu.h8
-rw-r--r--cpu/cpu_package.cpp6
-rw-r--r--cpu/cpudevice.cpp20
-rw-r--r--cpu/cpudevice.h7
-rw-r--r--cpu/intel_cpus.cpp2
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;
}
diff --git a/cpu/cpu.h b/cpu/cpu.h
index 997ed69..5848202 100644
--- a/cpu/cpu.h
+++ b/cpu/cpu.h
@@ -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);
}