diff options
author | Daniel Lezcano <daniel.lezcano@linaro.org> | 2015-09-14 17:23:49 +0200 |
---|---|---|
committer | Daniel Lezcano <daniel.lezcano@linaro.org> | 2015-09-14 17:23:49 +0200 |
commit | a65cf55d78369421c08cf1d69a116d181de8f2fa (patch) | |
tree | 940fe028bb5c5bd680fb17a65fbd60e02e80f5c2 | |
parent | b1ccee1269efe8d03dba39d7381470f6d034287b (diff) |
Display energy info
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
-rw-r--r-- | rt.py | 336 |
1 files changed, 272 insertions, 64 deletions
@@ -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() |