aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Lezcano <daniel.lezcano@linaro.org>2015-09-14 17:23:49 +0200
committerDaniel Lezcano <daniel.lezcano@linaro.org>2015-09-14 17:23:49 +0200
commita65cf55d78369421c08cf1d69a116d181de8f2fa (patch)
tree940fe028bb5c5bd680fb17a65fbd60e02e80f5c2
parentb1ccee1269efe8d03dba39d7381470f6d034287b (diff)
Display energy info
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
-rw-r--r--rt.py336
1 files changed, 272 insertions, 64 deletions
diff --git a/rt.py b/rt.py
index 3b2f488..a22400f 100644
--- a/rt.py
+++ b/rt.py
@@ -3,14 +3,20 @@ from vispy import app
from vispy import scene
from vispy import visuals
+from vispy.scene.widgets import Console
+from vispy.scene.visuals import Text
+
import numpy as np
import math
import sys
import threading
+import socket
+import select
+import time
# Number of cols and rows in the table.
nrows = 4
-ncols = 2
+ncols = 1
# Number of signals.
m = nrows*ncols
@@ -73,9 +79,11 @@ void main() {
vec2 position = vec2(x - (1 - 1 / u_scale.x), a_position);
// Find the affine transformation for the subplots.
- vec2 a = vec2(1./ncols, 1./nrows)*.9;
+ vec2 a = vec2(1./ncols, 1./(nrows))*.9;
+
vec2 b = vec2(-1 + 2*(a_index.x+.5) / ncols,
- -1 + 2*(a_index.y+.5) / nrows);
+ -1 + 2*(a_index.y+.5) / (nrows));
+
// Apply the static subplot transformation + scaling.
gl_Position = vec4(a*u_scale*position+b, 0.0, 1.0);
@@ -111,50 +119,94 @@ void main() {
}
"""
+class EnergyBoard():
+ def __init__(self, board = 0., a57 = 0., a53 = 0.,
+ a57_cache = 0., a53_cache = 0.):
+ self.board = board
+ self.a53 = a53
+ self.a57 = a57
+ self.a53_cache = a53_cache
+ self.a57_cache = a57_cache
+ self.string = ""
+
+ def diff(e1, e2):
+ return EnergyBoard(e2.board - e1.board, e2.a57 - e1.a57, e2.a53 - e1.a53,
+ e2.a57_cache - e1.a57_cache, e2.a53_cache - e1.a53_cache)
+
+ def str(self, board):
+ string = "Board %d consumption: %.2f J\n" % (board, self.board)
+ string = string + " - A57: %.2fJ, Cache: %.2fJ\n" % (self.a57, self.a57_cache)
+ string = string + " - A53: %.2fJ, Cache: %.2fJ\n" % (self.a53, self.a53_cache)
+ return string
+
class Canvas(app.Canvas):
+
def TextInit(self):
- # Board energy index
- self.text_board_energy = visuals.TextVisual('', bold=False)
- self.text_board_energy.font_size = 12.
- self.text_board_energy.pos = self.left_margin, self.size[1] - 30
- self.text_board_energy.color = 'red'
-
- # A53 Cache energy index
- self.text_a57_cache_energy = visuals.TextVisual('', bold=False)
- self.text_a57_cache_energy.font_size = 9.
- self.text_a57_cache_energy.pos = self.left_margin, self.size[1] - 515
- self.text_a57_cache_energy.color = 'red'
-
- # A53 Cpu energy index
- self.text_a57_cpu_energy = visuals.TextVisual('', bold=False)
- self.text_a57_cpu_energy.font_size = 9.
- self.text_a57_cpu_energy.pos = self.left_margin, self.size[1] - 365
- self.text_a57_cpu_energy.color = 'red'
-
- # A57 Cache energy index
- self.text_a53_cache_energy = visuals.TextVisual('', bold=False)
- self.text_a53_cache_energy.font_size = 9.
- self.text_a53_cache_energy.pos = self.left_margin, self.size[1] - 215
- self.text_a53_cache_energy.color = 'red'
-
- # A57 Cpu energy index
- self.text_a53_cpu_energy = visuals.TextVisual('', bold=False)
- self.text_a53_cpu_energy.font_size = 9.
- self.text_a53_cpu_energy.pos = self.left_margin, self.size[1] - 65
- self.text_a53_cpu_energy.color = 'red'
+ #
+ # Text displaying energy
+ # -------------------------------------------------
+ # | board0 | board1 | a57_0 | a57_1 | a53_0 | a53_1 |
+ # -------------------------------------------------
+ #
+ self.board_0_index = 0
+ self.board_1_index = 1
+ self.a57_0_index = 2
+ self.a57_1_index = 3
+ self.a53_0_index = 4
+ self.a53_1_index = 5
+
+ self.text_energy = []
+
+ self.text_energy.append(visuals.TextVisual('', bold=False))
+ self.text_energy[self.board_0_index].font_size = 12.
+ self.text_energy[self.board_0_index].pos = self.left_margin + 120, self.size[1] - 30
+ self.text_energy[self.board_0_index].color = 'green'
+
+ self.text_energy.append(visuals.TextVisual('', bold=False))
+ self.text_energy[self.board_1_index].font_size = 12.
+ self.text_energy[self.board_1_index].pos = self.left_margin, self.size[1] - 30
+ self.text_energy[self.board_1_index].color = 'yellow'
+
+ self.text_energy.append(visuals.TextVisual('', bold=False))
+ self.text_energy[self.a57_0_index].font_size = 9.
+ self.text_energy[self.a57_0_index].pos = self.left_margin, self.size[1] - 365
+ self.text_energy[self.a57_0_index].color = 'green'
+
+ self.text_energy.append(visuals.TextVisual('', bold=False))
+ self.text_energy[self.a57_1_index].font_size = 9.
+ self.text_energy[self.a57_1_index].pos = self.left_margin, self.size[1] - 515
+ self.text_energy[self.a57_1_index].color = 'yellow'
+
+ self.text_energy.append(visuals.TextVisual('', bold=False))
+ self.text_energy[self.a53_0_index].font_size = 9.
+ self.text_energy[self.a53_0_index].pos = self.left_margin, self.size[1] - 65
+ self.text_energy[self.a53_0_index].color = 'green'
+
+ self.text_energy.append(visuals.TextVisual('', bold=False))
+ self.text_energy[self.a53_1_index].font_size = 9.
+ self.text_energy[self.a53_1_index].pos = self.left_margin, self.size[1] - 215
+ self.text_energy[self.a53_1_index].color = 'yellow'
self.tr_sys = visuals.transforms.TransformSystem(self)
def EnergyInit(self):
- self.a53_cpu_energy = 0.0
- self.a53_cache_energy = 0.0
- self.a57_cpu_energy = 0.0
- self.a57_cache_energy = 0.0
- self.board_energy = 0.0
- def __init__(self):
+ self.energy = []
+ self.energy.append(EnergyBoard())
+ self.energy.append(EnergyBoard())
+
+ self.energy_test = []
+ self.energy_test.append(EnergyBoard())
+ self.energy_test.append(EnergyBoard())
+
+ self.energy_total = []
+ self.energy_total.append(EnergyBoard())
+ self.energy_total.append(EnergyBoard())
+
+ def __init__(self, console):
app.Canvas.__init__(self, title='Energy measurement',
keys='interactive')
+ self.console = console
self.program = gloo.Program(VERT_SHADER, FRAG_SHADER)
self.program['a_position'] = y.reshape(-1, 1)
self.program['a_color'] = color
@@ -199,11 +251,12 @@ class Canvas(app.Canvas):
def on_draw(self, event):
gloo.clear()
- self.text_board_energy.draw(self.tr_sys)
- self.text_a53_cpu_energy.draw(self.tr_sys)
- self.text_a53_cache_energy.draw(self.tr_sys)
- self.text_a57_cpu_energy.draw(self.tr_sys)
- self.text_a57_cache_energy.draw(self.tr_sys)
+ self.text_energy[self.board_0_index].draw(self.tr_sys)
+ self.text_energy[self.board_1_index].draw(self.tr_sys)
+ self.text_energy[self.a53_0_index].draw(self.tr_sys)
+ self.text_energy[self.a53_1_index].draw(self.tr_sys)
+ self.text_energy[self.a57_0_index].draw(self.tr_sys)
+ self.text_energy[self.a57_1_index].draw(self.tr_sys)
self.program.draw('line_strip')
class ClientThread(threading.Thread):
@@ -212,14 +265,26 @@ class ClientThread(threading.Thread):
threading.Thread.__init__(self)
self.running = True
self.canvas = CanvasApp
-
- def run(self):
- while self.running:
+ self.max_A53_0 = 1.0
+ self.max_A57_0 = 1.0
+ self.max_A53_1 = 1.0
+ self.max_A57_1 = 1.0
+ self.epoll = select.epoll()
+ self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ self.socket.bind(('0.0.0.0', 9999))
+ self.socket.listen(1)
+ self.start_measure = 0
+ self.start_test = 0
+ self.iteration = 1
+
+ def stdin_handler(self, fd, condition):
line = sys.stdin.readline()
if line == '':
app.quit()
self.running = False
- continue
+ return
+
array = line.split()
cpu_power = float(array[2]) + float(array[5])
cache_power = float(array[8])
@@ -228,40 +293,183 @@ class ClientThread(threading.Thread):
if array[0] == "A53_0":
+ if cpu_power > self.max_A53_0:
+ self.max_A53_0 = cpu_power
+
y[0, :-k] = y[0, k:]
- y[0, -k:] = cpu_power / 1.2
- y[1, :-k] = y[1, k:]
- y[1, -k:] = cache_power / 0.04
+ y[0, -k:] = cpu_power / self.max_A53_0
- self.canvas.a53_cpu_energy += cpu_power * 0.01
- self.canvas.a53_cache_energy += cache_power * 0.01
- self.canvas.text_a53_cpu_energy.text = ' A53 CPU: %.2f Joules' % self.canvas.a53_cpu_energy
- self.canvas.text_a53_cache_energy.text = 'A53 L1/2: %.2f Joules' % self.canvas.a53_cache_energy
+ self.canvas.energy[0].a53 += cpu_power * 0.01
+ self.canvas.energy[0].a53_cache += cache_power * 0.01
+ self.canvas.energy[0].board += cpu_power * 0.01 + cache_power * 0.01
+ self.canvas.text_energy[self.canvas.a53_0_index].text = ' A53 CPU: %.2f Joules' % self.canvas.energy[0].a53
+ self.canvas.text_energy[self.canvas.board_0_index].text = '%.2f Joules' % self.canvas.energy[0].board
if array[0] == "A57_0":
+ if cpu_power > self.max_A57_0:
+ self.max_A57_0 = cpu_power
+
y[2, :-k] = y[2, k:]
- y[2, -k:] = cpu_power / 5.0
- y[3, :-k] = y[3, k:]
- y[3, -k:] = cache_power / 0.02
+ y[2, -k:] = cpu_power / self.max_A57_0
- self.canvas.a57_cpu_energy += cpu_power * 0.01
- self.canvas.a57_cache_energy += cache_power * 0.01
- self.canvas.text_a57_cpu_energy.text = ' A57 CPU: %.2f Joules' % self.canvas.a57_cpu_energy
- self.canvas.text_a57_cache_energy.text = 'A57 L1/2: %.2f Joules' % self.canvas.a57_cache_energy
+ self.canvas.energy[0].a57 += cpu_power * 0.01
+ self.canvas.energy[0].a57_cache += cache_power * 0.01
+ self.canvas.energy[0].board += cpu_power * 0.01 + cache_power * 0.01
+ self.canvas.text_energy[self.canvas.a57_0_index].text = ' A57 CPU: %.2f Joules' % self.canvas.energy[0].a57
+ self.canvas.text_energy[self.canvas.board_0_index].text = '%.2f Joules' % self.canvas.energy[0].board
- self.canvas.board_energy += cpu_power * 0.01 + cache_power * 0.01
- self.canvas.text_board_energy.text = 'Total: %.2f Joules' % self.canvas.board_energy
+ if array[0] == "A53_1":
+
+ if cpu_power > self.max_A53_1:
+ self.max_A53_1 = cpu_power
+
+ y[1, :-k] = y[1, k:]
+ y[1, -k:] = cpu_power / self.max_A53_1
+
+ self.canvas.energy[1].a53 += cpu_power * 0.01
+ self.canvas.energy[1].a53_cache += cache_power * 0.01
+ self.canvas.energy[1].board += cpu_power * 0.01 + cache_power * 0.01
+ self.canvas.text_energy[self.canvas.a53_1_index].text = ' A53 CPU: %.2f Joules' % self.canvas.energy[1].a53
+ self.canvas.text_energy[self.canvas.board_1_index].text = '%.2f Joules' % self.canvas.energy[1].board
+
+ if array[0] == "A57_1":
+
+ if cpu_power > self.max_A57_1:
+ self.max_A57_1 = cpu_power
+
+ y[3, :-k] = y[3, k:]
+ y[3, -k:] = cpu_power / self.max_A57_1
+
+ self.canvas.energy[1].a57 += cpu_power * 0.01
+ self.canvas.energy[1].a57_cache += cache_power * 0.01
+ self.canvas.energy[1].board += cpu_power * 0.01 + cache_power * 0.01
+ self.canvas.text_energy[self.canvas.a57_1_index].text = ' A57 CPU: %.2f Joules' % self.canvas.energy[1].a57
+ self.canvas.text_energy[self.canvas.board_1_index].text = '%.2f Joules' % self.canvas.energy[1].board
if not self.canvas.pause:
self.canvas.program['a_position'].set_data(y.ravel().astype(np.float32))
self.canvas.update()
+ def socket_handler(self, fd, condition):
+ line = self.conn.recv(1024)
+ if line == '':
+ self.epoll.unregister(self.conn.fileno())
+ self.conn.close()
+ return
+
+ array = line.split()
+
+ if array[0] == "BEGIN":
+
+ self.start_measure = 1
+
+ self.canvas.energy_total[0] = EnergyBoard(self.canvas.energy[0].board,
+ self.canvas.energy[0].a57,
+ self.canvas.energy[0].a53,
+ self.canvas.energy[0].a57_cache,
+ self.canvas.energy[0].a53_cache)
+
+ self.canvas.energy_total[1] = EnergyBoard(self.canvas.energy[1].board,
+ self.canvas.energy[1].a57,
+ self.canvas.energy[1].a53,
+ self.canvas.energy[1].a57_cache,
+ self.canvas.energy[1].a53_cache)
+
+ self.canvas.console.write("-------- BEGIN MEASURE #%d --------\n" % self.iteration)
+
+ elif array[0] == "END" and self.start_measure == 1:
+
+ energy_diff0 = EnergyBoard.diff(self.canvas.energy_total[0], self.canvas.energy[0])
+ energy_diff1 = EnergyBoard.diff(self.canvas.energy_total[1], self.canvas.energy[1])
+
+ # Print on the console the consumption"
+ string = "--- Total energy consumption\n\n"
+ string = string + energy_diff0.str(0)
+ string = string + energy_diff1.str(1)
+ self.canvas.console.write(string)
+ self.canvas.console.write("-------- END MEASURE #%d --------\n" % self.iteration)
+
+ sys.stdout.write("Total: %.2f %.2f %.2f %.2f %.2f " % (energy_diff0.board,
+ energy_diff0.a57, energy_diff0.a57_cache,
+ energy_diff0.a53, energy_diff0.a53_cache))
+
+ sys.stdout.write("%.2f %.2f %.2f %.2f %.2f\n" % (energy_diff1.board,
+ energy_diff1.a57, energy_diff1.a57_cache,
+ energy_diff1.a53, energy_diff1.a53_cache))
+
+ self.start_measure = 0
+ self.iteration = self.iteration + 1
+
+ elif array[0] == "START" and self.start_measure == 1:
+
+ self.start_test = 1
+
+ self.canvas.energy_test[0] = EnergyBoard(self.canvas.energy[0].board,
+ self.canvas.energy[0].a57,
+ self.canvas.energy[0].a53,
+ self.canvas.energy[0].a57_cache,
+ self.canvas.energy[0].a53_cache)
+
+ self.canvas.energy_test[1] = EnergyBoard(self.canvas.energy[1].board,
+ self.canvas.energy[1].a57,
+ self.canvas.energy[1].a53,
+ self.canvas.energy[1].a57_cache,
+ self.canvas.energy[1].a53_cache)
+
+ self.canvas.console.write("--- %s" % line)
+
+ elif array[0] == "STOP" and self.start_test == 1:
+
+ energy_diff0 = EnergyBoard.diff(self.canvas.energy_test[0], self.canvas.energy[0])
+ energy_diff1 = EnergyBoard.diff(self.canvas.energy_test[1], self.canvas.energy[1])
+
+ # Print on the console the test name and the consumption"
+ string = energy_diff0.str(0)
+ string += energy_diff1.str(1)
+
+ self.canvas.console.write(string)
+
+ # Raw values to be read directly from the command line
+ sys.stdout.write("%.2f %.2f %.2f %.2f %.2f " % (energy_diff0.board,
+ energy_diff0.a57, energy_diff0.a57_cache,
+ energy_diff0.a53, energy_diff0.a53_cache))
+ sys.stdout.write("%.2f %.2f %.2f %.2f %.2f\n" % (energy_diff1.board,
+ energy_diff1.a57, energy_diff1.a57_cache,
+ energy_diff1.a53, energy_diff1.a53_cache))
+ self.start_test = 0
+
+ def socket_accept(self, fd, condition):
+ self.conn, addr = self.socket.accept()
+ self.epoll.register(self.conn)
+
+ def run(self):
+ self.epoll.register(sys.stdin)
+ self.epoll.register(self.socket)
+ while self.running:
+ events = self.epoll.poll()
+
+ for fileno, event in events:
+ if fileno == 0:
+ self.stdin_handler(0, 0)
+ elif fileno == self.socket.fileno():
+ self.socket_accept(fileno, 0)
+ elif fileno == self.conn.fileno():
+ self.socket_handler(fileno, 0)
+
def stop(self):
self.running = False
if __name__ == '__main__':
- c = Canvas()
+
+ console = Console(text_color='g', font_size=8., border_color='b')
+ c = Canvas(console)
+ canvas = scene.SceneCanvas(keys='interactive')
+ grid = canvas.central_widget.add_grid()
+ grid.add_widget(console, row=0, col=0)
+
+ canvas.show()
+
newthread = ClientThread(c)
newthread.start()
app.run()