diff --git a/ipynb/examples/energy_meter/EnergyMeter_Gem5.ipynb b/ipynb/examples/energy_meter/EnergyMeter_Gem5.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..f5f1d98e2f4ae8d46c52ed7993fd5c88cdd6b1c9 --- /dev/null +++ b/ipynb/examples/energy_meter/EnergyMeter_Gem5.ipynb @@ -0,0 +1,1349 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Energy Meter Examples\n", + "\n", + "## Energy estimations in Gem5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Gem5EnergyMeter in Lisa uses the devlib Gem5PowerInstrument to extract energy information from the gem5 statistics file referenced in the energy meter field of the target configuration." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2017-08-16 18:12:20,847 INFO : root : Using LISA logging configuration:\n", + "2017-08-16 18:12:20,855 INFO : root : /home/vagrant/dev/lisa/logging.conf\n" + ] + } + ], + "source": [ + "from conf import LisaLogging\n", + "LisaLogging.setup()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# One initial cell for imports\n", + "import json\n", + "import logging\n", + "import os\n", + "\n", + "from env import TestEnv\n", + "\n", + "# Suport for FTrace events parsing and visualization\n", + "import trappy\n", + "from trappy.ftrace import FTrace\n", + "from trace import Trace\n", + "\n", + "# Support for plotting\n", + "# Generate plots inline\n", + "%matplotlib inline\n", + "import numpy\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from env import TestEnv\n", + "\n", + "# RTApp configurator for generation of PERIODIC tasks\n", + "from wlgen import RTA, Ramp" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Target configuration\n", + "The target configuration is used to describe and configure your test environment. You can find more details in **examples/utils/testenv_example.ipynb**." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true, + "scrolled": true + }, + "outputs": [], + "source": [ + "# Root path of the gem5 workspace\n", + "base = \"/home/vagrant/gem5\"\n", + "\n", + "conf = {\n", + " # Only 'linux' is supported by gem5 for now, 'android' is a WIP\n", + " \"platform\" : 'linux',\n", + " \n", + " # Preload settings for a specific target\n", + " \"board\" : 'gem5',\n", + " \n", + " # Devlib modules to load - \"gem5stats\" is required to use the power instrument\n", + " \"modules\" : [\"cpufreq\", \"bl\", \"gem5stats\"],\n", + "\n", + " # Host that will run the gem5 instance\n", + " \"host\" : \"workstation-lin\",\n", + " \n", + " \"gem5\" : {\n", + " # System to simulate\n", + " \"system\" : {\n", + " # Platform description\n", + " \"platform\" : {\n", + " # Gem5 platform description\n", + " # LISA will also look for an optional gem5 board file\n", + " # located in the same directory as the description file.\n", + " \"description\" : os.path.join(base, \"juno.py\"),\n", + " \"args\" : [\n", + " \"--power-model\", # Platform-specific parameter enabling power modelling\n", + " \"--juno-revision 2\",\n", + " # Resume simulation from a previous checkpoint\n", + " # Checkpoint must be taken before Virtio folders are mounted\n", + " #\"--checkpoint-indir /data/tmp/Results_LISA/gem5\",\n", + " #\"--checkpoint-resume 1\",\n", + " ]\n", + " },\n", + " # Kernel compiled for gem5 with Virtio flags\n", + " \"kernel\" : os.path.join(base, \"product/\", \"vmlinux\"),\n", + " # DTB of the system to simulate\n", + " \"dtb\" : os.path.join(base, \"product/\", \"armv8_juno_r2.dtb\"),\n", + " # Disk of the distrib to run\n", + " \"disk\" : os.path.join(base, \"aarch64-ubuntu-trusty-headless.img\")\n", + " },\n", + " # gem5 settings\n", + " \"simulator\" : {\n", + " # Path to gem5 binary\n", + " \"bin\" : os.path.join(base, \"gem5/build/ARM/gem5.fast\"),\n", + " # Args to be given to the binary\n", + " \"args\" : [\n", + " # Zilch\n", + " ],\n", + " }\n", + " },\n", + " \n", + " # Tools required by the experiments\n", + " \"tools\" : ['trace-cmd', 'sysbench', 'rt-app'],\n", + " \n", + " # Output directory on host\n", + " \"results_dir\" : \"gem5_res\",\n", + " \n", + " # Energy Meters configuration based on Gem5 stats\n", + " \"emeter\" : {\n", + " \"instrument\" : \"gem5\",\n", + " \"conf\" : {\n", + " # Zilch\n", + " },\n", + " # Each channel here must refer to a specific **power** field in the stats file. \n", + " 'channel_map' : {\n", + " 'Core0S' : 'system.cluster0.cores0.power_model.static_power',\n", + " 'Core0D' : 'system.cluster0.cores0.power_model.dynamic_power',\n", + " 'Core1S' : 'system.cluster0.cores1.power_model.static_power',\n", + " 'Core1D' : 'system.cluster0.cores1.power_model.dynamic_power',\n", + " 'Core2S' : 'system.cluster0.cores2.power_model.static_power',\n", + " 'Core2D' : 'system.cluster0.cores2.power_model.dynamic_power',\n", + " 'Core3S' : 'system.cluster0.cores3.power_model.static_power',\n", + " 'Core3D' : 'system.cluster0.cores3.power_model.dynamic_power',\n", + " 'Core4S' : 'system.cluster1.cores0.power_model.static_power',\n", + " 'Core4D' : 'system.cluster1.cores0.power_model.dynamic_power',\n", + " 'Core5S' : 'system.cluster1.cores1.power_model.static_power',\n", + " 'Core5D' : 'system.cluster1.cores1.power_model.dynamic_power',\n", + " },\n", + " },\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2017-08-16 18:12:21,692 INFO : TestEnv : Using base path: /data/work/dev/lisa\n", + "2017-08-16 18:12:21,693 INFO : TestEnv : Loading custom (inline) target configuration\n", + "2017-08-16 18:12:21,694 WARNING : TestEnv : Wipe previous contents of the results folder:\n", + "2017-08-16 18:12:21,694 WARNING : TestEnv : /data/work/dev/lisa/results/gem5_res\n", + "2017-08-16 18:12:22,796 INFO : TestEnv : Loading board:\n", + "2017-08-16 18:12:22,796 INFO : TestEnv : /data/work/dev/lisa/libs/utils/platforms/gem5juno.json\n", + "2017-08-16 18:12:22,798 INFO : gem5 : Creating temporary directory for interaction with gem5 via virtIO: /tmp/wa_0\n", + "2017-08-16 18:12:22,798 INFO : gem5 : Starting the gem5 simulator\n", + "2017-08-16 18:12:25,815 INFO : TestEnv : Devlib modules to load: ['bl', 'cpufreq', 'gem5stats']\n", + "2017-08-16 18:12:25,816 INFO : TestEnv : Connecting linux target:\n", + "2017-08-16 18:12:25,817 INFO : TestEnv : username : root\n", + "2017-08-16 18:12:25,817 INFO : TestEnv : host : workstation-lin\n", + "2017-08-16 18:12:25,818 INFO : TestEnv : password : \n", + "2017-08-16 18:12:25,818 INFO : TestEnv : Connection settings:\n", + "2017-08-16 18:12:25,819 INFO : TestEnv : {'username': 'root', 'host': 'workstation-lin', 'password': ''}\n", + "2017-08-16 18:12:25,824 INFO : gem5-connection : Connecting to the gem5 simulation on port 3456\n", + "2017-08-16 18:12:36,544 INFO : gem5-connection : Connected! Waiting for prompt...\n", + "2017-08-16 18:12:36,545 INFO : gem5-connection : Created lock file /tmp/workstation-lin_3456.LOCK to prevent reconnecting to same simulation\n", + "2017-08-16 18:12:36,545 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:13:46,607 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:14:56,729 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:16:06,837 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:17:16,958 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:18:27,038 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:19:37,130 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:20:47,220 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:21:57,335 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:23:07,452 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:24:17,515 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:25:27,579 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:26:37,700 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:27:47,820 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:28:57,883 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:30:07,981 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:31:18,056 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:32:28,135 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:33:38,254 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:34:48,343 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:35:58,405 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:37:08,510 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:38:18,620 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:39:28,688 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:40:38,798 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:41:48,866 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:42:58,945 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:44:09,066 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:45:19,185 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:46:29,291 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:47:39,385 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:48:49,502 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:49:59,623 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:51:09,743 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:52:19,813 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:53:29,912 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:54:39,984 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:55:50,055 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:57:00,145 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:58:10,264 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 18:59:20,327 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:00:30,448 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:01:40,513 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:02:50,620 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:04:00,738 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:05:10,801 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:06:20,867 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:07:30,932 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:08:41,001 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:09:51,115 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:11:01,231 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:12:11,306 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:13:21,421 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:14:31,495 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:15:41,597 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:16:51,710 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:18:01,813 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:19:11,902 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:20:22,010 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:21:32,111 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:22:42,231 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:23:52,332 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:25:02,442 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:26:12,506 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:27:22,568 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:28:32,634 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:29:42,741 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:30:52,802 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:32:02,891 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:33:13,009 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:34:23,099 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:35:33,219 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:36:43,340 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:37:53,408 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:39:03,477 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:40:13,597 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:41:23,709 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:42:33,825 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:43:43,886 INFO : gem5-connection : Trying to log in to gem5 device\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2017-08-16 19:44:53,967 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:46:04,029 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:47:14,118 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:48:24,228 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:49:34,323 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:50:44,419 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:51:54,523 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:53:04,635 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:54:14,739 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:55:24,835 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 19:56:34,901 INFO : gem5-connection : Trying to log in to gem5 device\n", + "2017-08-16 20:01:16,122 INFO : gem5-connection : Successfully logged in\n", + "2017-08-16 20:01:16,122 INFO : gem5-connection : Setting unique prompt...\n", + "2017-08-16 20:01:20,239 INFO : gem5-connection : Prompt found and replaced with a unique string\n", + "2017-08-16 20:01:22,692 INFO : gem5-connection : Mounting VirtIO device in simulated system\n", + "2017-08-16 20:12:36,313 INFO : TestEnv : Initializing target workdir:\n", + "2017-08-16 20:12:36,314 INFO : TestEnv : /home/root/devlib-target\n", + "2017-08-16 20:33:47,467 INFO : TestEnv : Attempting to read energy model from target\n", + "2017-08-16 20:33:47,468 ERROR : TestEnv : Couldn't read target energy model: Requires cpuidle devlib module. Please ensure \"cpuidle\" is listed in your target/test modules\n", + "2017-08-16 20:33:47,469 INFO : TestEnv : Topology:\n", + "2017-08-16 20:33:47,469 INFO : TestEnv : [[0, 1, 2, 3], [4, 5]]\n", + "2017-08-16 20:34:37,405 INFO : TestEnv : Loading default EM:\n", + "2017-08-16 20:34:37,406 INFO : TestEnv : /data/work/dev/lisa/libs/utils/platforms/gem5juno.json\n", + "2017-08-16 20:34:48,890 INFO : TestEnv : Calibrating RTApp...\n", + "2017-08-16 20:38:25,372 INFO : RTApp : CPU0 calibration...\n", + "2017-08-16 20:38:30,263 INFO : Workload : Setup new workload rta_calib\n", + "2017-08-16 20:38:43,655 INFO : Workload : Workload duration defined by longest task\n", + "2017-08-16 20:38:43,656 INFO : Workload : Default policy: SCHED_OTHER\n", + "2017-08-16 20:38:43,656 INFO : Workload : ------------------------\n", + "2017-08-16 20:38:43,657 INFO : Workload : task [task1], sched: {'policy': 'FIFO', 'prio': 0}\n", + "2017-08-16 20:38:43,658 INFO : Workload : | loops count: 1\n", + "2017-08-16 20:38:43,658 INFO : Workload : + phase_000001: duration 1.000000 [s] (10 loops)\n", + "2017-08-16 20:38:43,659 INFO : Workload : | period 100000 [us], duty_cycle 50 %\n", + "2017-08-16 20:38:43,659 INFO : Workload : | run_time 50000 [us], sleep_time 50000 [us]\n", + "2017-08-16 20:40:13,501 INFO : Workload : Workload execution START:\n", + "2017-08-16 20:40:13,502 INFO : Workload : /home/root/devlib-target/bin/taskset 0x1 /home/root/devlib-target/bin/rt-app /home/root/devlib-target/rta_calib_00.json 2>&1\n", + "2017-08-16 21:26:43,528 WARNING : ssh : Destination file rt-app-task1-0.log already exists!\n", + "2017-08-16 21:28:01,712 WARNING : ssh : Destination file rta_calib_00.json already exists!\n", + "2017-08-16 21:28:01,713 INFO : RTApp : CPU1 calibration...\n", + "2017-08-16 21:28:06,649 INFO : Workload : Setup new workload rta_calib\n", + "2017-08-16 21:28:19,938 INFO : Workload : Workload duration defined by longest task\n", + "2017-08-16 21:28:19,939 INFO : Workload : Default policy: SCHED_OTHER\n", + "2017-08-16 21:28:19,940 INFO : Workload : ------------------------\n", + "2017-08-16 21:28:19,940 INFO : Workload : task [task1], sched: {'policy': 'FIFO', 'prio': 0}\n", + "2017-08-16 21:28:19,941 INFO : Workload : | loops count: 1\n", + "2017-08-16 21:28:19,941 INFO : Workload : + phase_000001: duration 1.000000 [s] (10 loops)\n", + "2017-08-16 21:28:19,942 INFO : Workload : | period 100000 [us], duty_cycle 50 %\n", + "2017-08-16 21:28:19,942 INFO : Workload : | run_time 50000 [us], sleep_time 50000 [us]\n", + "2017-08-16 21:30:10,731 INFO : Workload : Workload execution START:\n", + "2017-08-16 21:30:10,732 INFO : Workload : /home/root/devlib-target/bin/taskset 0x2 /home/root/devlib-target/bin/rt-app /home/root/devlib-target/rta_calib_00.json 2>&1\n", + "2017-08-16 22:16:19,363 WARNING : ssh : Destination file rt-app-task1-0.log already exists!\n", + "2017-08-16 22:17:32,906 WARNING : ssh : Destination file rta_calib_00.json already exists!\n", + "2017-08-16 22:17:32,907 INFO : RTApp : CPU2 calibration...\n", + "2017-08-16 22:17:37,319 INFO : Workload : Setup new workload rta_calib\n", + "2017-08-16 22:17:49,418 INFO : Workload : Workload duration defined by longest task\n", + "2017-08-16 22:17:49,419 INFO : Workload : Default policy: SCHED_OTHER\n", + "2017-08-16 22:17:49,420 INFO : Workload : ------------------------\n", + "2017-08-16 22:17:49,420 INFO : Workload : task [task1], sched: {'policy': 'FIFO', 'prio': 0}\n", + "2017-08-16 22:17:49,421 INFO : Workload : | loops count: 1\n", + "2017-08-16 22:17:49,422 INFO : Workload : + phase_000001: duration 1.000000 [s] (10 loops)\n", + "2017-08-16 22:17:49,422 INFO : Workload : | period 100000 [us], duty_cycle 50 %\n", + "2017-08-16 22:17:49,422 INFO : Workload : | run_time 50000 [us], sleep_time 50000 [us]\n", + "2017-08-16 22:19:33,201 INFO : Workload : Workload execution START:\n", + "2017-08-16 22:19:33,202 INFO : Workload : /home/root/devlib-target/bin/taskset 0x4 /home/root/devlib-target/bin/rt-app /home/root/devlib-target/rta_calib_00.json 2>&1\n", + "2017-08-16 23:04:42,602 WARNING : ssh : Destination file rt-app-task1-0.log already exists!\n", + "2017-08-16 23:05:58,918 WARNING : ssh : Destination file rta_calib_00.json already exists!\n", + "2017-08-16 23:05:58,919 INFO : RTApp : CPU3 calibration...\n", + "2017-08-16 23:06:03,183 INFO : Workload : Setup new workload rta_calib\n", + "2017-08-16 23:06:15,906 INFO : Workload : Workload duration defined by longest task\n", + "2017-08-16 23:06:15,906 INFO : Workload : Default policy: SCHED_OTHER\n", + "2017-08-16 23:06:15,907 INFO : Workload : ------------------------\n", + "2017-08-16 23:06:15,907 INFO : Workload : task [task1], sched: {'policy': 'FIFO', 'prio': 0}\n", + "2017-08-16 23:06:15,908 INFO : Workload : | loops count: 1\n", + "2017-08-16 23:06:15,908 INFO : Workload : + phase_000001: duration 1.000000 [s] (10 loops)\n", + "2017-08-16 23:06:15,909 INFO : Workload : | period 100000 [us], duty_cycle 50 %\n", + "2017-08-16 23:06:15,909 INFO : Workload : | run_time 50000 [us], sleep_time 50000 [us]\n", + "2017-08-16 23:07:45,356 INFO : Workload : Workload execution START:\n", + "2017-08-16 23:07:45,357 INFO : Workload : /home/root/devlib-target/bin/taskset 0x8 /home/root/devlib-target/bin/rt-app /home/root/devlib-target/rta_calib_00.json 2>&1\n", + "2017-08-16 23:53:15,385 WARNING : ssh : Destination file rt-app-task1-0.log already exists!\n", + "2017-08-16 23:54:29,224 WARNING : ssh : Destination file rta_calib_00.json already exists!\n", + "2017-08-16 23:54:29,225 INFO : RTApp : CPU4 calibration...\n", + "2017-08-16 23:54:33,293 INFO : Workload : Setup new workload rta_calib\n", + "2017-08-16 23:54:45,843 INFO : Workload : Workload duration defined by longest task\n", + "2017-08-16 23:54:45,843 INFO : Workload : Default policy: SCHED_OTHER\n", + "2017-08-16 23:54:45,844 INFO : Workload : ------------------------\n", + "2017-08-16 23:54:45,845 INFO : Workload : task [task1], sched: {'policy': 'FIFO', 'prio': 0}\n", + "2017-08-16 23:54:45,845 INFO : Workload : | loops count: 1\n", + "2017-08-16 23:54:45,846 INFO : Workload : + phase_000001: duration 1.000000 [s] (10 loops)\n", + "2017-08-16 23:54:45,847 INFO : Workload : | period 100000 [us], duty_cycle 50 %\n", + "2017-08-16 23:54:45,848 INFO : Workload : | run_time 50000 [us], sleep_time 50000 [us]\n", + "2017-08-16 23:56:16,442 INFO : Workload : Workload execution START:\n", + "2017-08-16 23:56:16,443 INFO : Workload : /home/root/devlib-target/bin/taskset 0x10 /home/root/devlib-target/bin/rt-app /home/root/devlib-target/rta_calib_00.json 2>&1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2017-08-17 01:14:31,053 WARNING : ssh : Destination file rt-app-task1-0.log already exists!\n", + "2017-08-17 01:15:43,793 WARNING : ssh : Destination file rta_calib_00.json already exists!\n", + "2017-08-17 01:15:43,793 INFO : RTApp : CPU5 calibration...\n", + "2017-08-17 01:15:48,155 INFO : Workload : Setup new workload rta_calib\n", + "2017-08-17 01:16:01,836 INFO : Workload : Workload duration defined by longest task\n", + "2017-08-17 01:16:01,837 INFO : Workload : Default policy: SCHED_OTHER\n", + "2017-08-17 01:16:01,838 INFO : Workload : ------------------------\n", + "2017-08-17 01:16:01,838 INFO : Workload : task [task1], sched: {'policy': 'FIFO', 'prio': 0}\n", + "2017-08-17 01:16:01,839 INFO : Workload : | loops count: 1\n", + "2017-08-17 01:16:01,839 INFO : Workload : + phase_000001: duration 1.000000 [s] (10 loops)\n", + "2017-08-17 01:16:01,840 INFO : Workload : | period 100000 [us], duty_cycle 50 %\n", + "2017-08-17 01:16:01,840 INFO : Workload : | run_time 50000 [us], sleep_time 50000 [us]\n", + "2017-08-17 01:17:29,376 INFO : Workload : Workload execution START:\n", + "2017-08-17 01:17:29,377 INFO : Workload : /home/root/devlib-target/bin/taskset 0x20 /home/root/devlib-target/bin/rt-app /home/root/devlib-target/rta_calib_00.json 2>&1\n", + "2017-08-17 02:32:13,228 WARNING : ssh : Destination file rt-app-task1-0.log already exists!\n", + "2017-08-17 02:33:25,637 WARNING : ssh : Destination file rta_calib_00.json already exists!\n", + "2017-08-17 02:37:28,907 INFO : RTApp : Target RT-App calibration:\n", + "2017-08-17 02:37:28,908 INFO : RTApp : {\"0\": 894, \"1\": 894, \"2\": 894, \"3\": 893, \"4\": 235, \"5\": 234}\n", + "2017-08-17 02:37:54,764 INFO : RTApp : big cores are ~280% more capable than LITTLE cores\n", + "2017-08-17 02:37:54,765 INFO : TestEnv : Using RT-App calibration values:\n", + "2017-08-17 02:37:54,766 INFO : TestEnv : {\"0\": 894, \"1\": 894, \"2\": 894, \"3\": 893, \"4\": 235, \"5\": 234}\n", + "2017-08-17 02:38:05,952 INFO : TestEnv : Set results folder to:\n", + "2017-08-17 02:38:05,953 INFO : TestEnv : /data/work/dev/lisa/results/gem5_res\n", + "2017-08-17 02:38:05,954 INFO : TestEnv : Experiment results available also in:\n", + "2017-08-17 02:38:05,954 INFO : TestEnv : /data/work/dev/lisa/results_latest\n" + ] + } + ], + "source": [ + "# This can take a lot of time ...\n", + "te = TestEnv(conf, wipe=True)\n", + "target = te.target" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Workload execution\n", + "For this example, we will investigate the energy consumption of the target while running a random workload. Our observations will be made using the RT-App decreasing ramp workload defined below. With such a workload, the system load goes from high to low over time. We expect to see a similar pattern in power consumption." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2017-08-17 02:38:05,960 INFO : Workload : Setup new workload ramp\n", + "2017-08-17 02:38:19,705 INFO : Workload : Workload duration defined by longest task\n", + "2017-08-17 02:38:19,706 INFO : Workload : Default policy: SCHED_OTHER\n", + "2017-08-17 02:38:19,707 INFO : Workload : ------------------------\n", + "2017-08-17 02:38:19,708 INFO : Workload : task [ramp1], sched: using default policy\n", + "2017-08-17 02:38:19,708 INFO : Workload : | loops count: 1\n", + "2017-08-17 02:38:19,709 INFO : Workload : + phase_000001: duration 0.100000 [s] (1 loops)\n", + "2017-08-17 02:38:19,709 INFO : Workload : | period 100000 [us], duty_cycle 95 %\n", + "2017-08-17 02:38:19,710 INFO : Workload : | run_time 95000 [us], sleep_time 5000 [us]\n", + "2017-08-17 02:38:19,710 INFO : Workload : + phase_000002: duration 0.100000 [s] (1 loops)\n", + "2017-08-17 02:38:19,710 INFO : Workload : | period 100000 [us], duty_cycle 85 %\n", + "2017-08-17 02:38:19,711 INFO : Workload : | run_time 85000 [us], sleep_time 15000 [us]\n", + "2017-08-17 02:38:19,711 INFO : Workload : + phase_000003: duration 0.100000 [s] (1 loops)\n", + "2017-08-17 02:38:19,712 INFO : Workload : | period 100000 [us], duty_cycle 75 %\n", + "2017-08-17 02:38:19,712 INFO : Workload : | run_time 75000 [us], sleep_time 25000 [us]\n", + "2017-08-17 02:38:19,713 INFO : Workload : + phase_000004: duration 0.100000 [s] (1 loops)\n", + "2017-08-17 02:38:19,713 INFO : Workload : | period 100000 [us], duty_cycle 65 %\n", + "2017-08-17 02:38:19,714 INFO : Workload : | run_time 65000 [us], sleep_time 35000 [us]\n", + "2017-08-17 02:38:19,714 INFO : Workload : + phase_000005: duration 0.100000 [s] (1 loops)\n", + "2017-08-17 02:38:19,714 INFO : Workload : | period 100000 [us], duty_cycle 55 %\n", + "2017-08-17 02:38:19,715 INFO : Workload : | run_time 55000 [us], sleep_time 45000 [us]\n", + "2017-08-17 02:38:19,715 INFO : Workload : + phase_000006: duration 0.100000 [s] (1 loops)\n", + "2017-08-17 02:38:19,716 INFO : Workload : | period 100000 [us], duty_cycle 45 %\n", + "2017-08-17 02:38:19,716 INFO : Workload : | run_time 45000 [us], sleep_time 55000 [us]\n", + "2017-08-17 02:38:19,717 INFO : Workload : + phase_000007: duration 0.100000 [s] (1 loops)\n", + "2017-08-17 02:38:19,717 INFO : Workload : | period 100000 [us], duty_cycle 35 %\n", + "2017-08-17 02:38:19,718 INFO : Workload : | run_time 35000 [us], sleep_time 65000 [us]\n", + "2017-08-17 02:38:19,719 INFO : Workload : + phase_000008: duration 0.100000 [s] (1 loops)\n", + "2017-08-17 02:38:19,719 INFO : Workload : | period 100000 [us], duty_cycle 25 %\n", + "2017-08-17 02:38:19,720 INFO : Workload : | run_time 25000 [us], sleep_time 75000 [us]\n", + "2017-08-17 02:38:19,721 INFO : Workload : + phase_000009: duration 0.100000 [s] (1 loops)\n", + "2017-08-17 02:38:19,721 INFO : Workload : | period 100000 [us], duty_cycle 15 %\n", + "2017-08-17 02:38:19,722 INFO : Workload : | run_time 15000 [us], sleep_time 85000 [us]\n", + "2017-08-17 02:38:19,722 INFO : Workload : + phase_000010: duration 0.100000 [s] (1 loops)\n", + "2017-08-17 02:38:19,723 INFO : Workload : | period 100000 [us], duty_cycle 5 %\n", + "2017-08-17 02:38:19,724 INFO : Workload : | run_time 5000 [us], sleep_time 95000 [us]\n", + "2017-08-17 02:38:19,724 INFO : Workload : ------------------------\n", + "2017-08-17 02:38:19,725 INFO : Workload : task [ramp2], sched: using default policy\n", + "2017-08-17 02:38:19,725 INFO : Workload : | loops count: 1\n", + "2017-08-17 02:38:19,726 INFO : Workload : + phase_000001: duration 0.200000 [s] (2 loops)\n", + "2017-08-17 02:38:19,727 INFO : Workload : | period 100000 [us], duty_cycle 90 %\n", + "2017-08-17 02:38:19,727 INFO : Workload : | run_time 90000 [us], sleep_time 10000 [us]\n", + "2017-08-17 02:38:19,728 INFO : Workload : + phase_000002: duration 0.200000 [s] (2 loops)\n", + "2017-08-17 02:38:19,729 INFO : Workload : | period 100000 [us], duty_cycle 70 %\n", + "2017-08-17 02:38:19,730 INFO : Workload : | run_time 70000 [us], sleep_time 30000 [us]\n", + "2017-08-17 02:38:19,730 INFO : Workload : + phase_000003: duration 0.200000 [s] (2 loops)\n", + "2017-08-17 02:38:19,731 INFO : Workload : | period 100000 [us], duty_cycle 50 %\n", + "2017-08-17 02:38:19,732 INFO : Workload : | run_time 50000 [us], sleep_time 50000 [us]\n", + "2017-08-17 02:38:19,732 INFO : Workload : + phase_000004: duration 0.200000 [s] (2 loops)\n", + "2017-08-17 02:38:19,732 INFO : Workload : | period 100000 [us], duty_cycle 30 %\n", + "2017-08-17 02:38:19,733 INFO : Workload : | run_time 30000 [us], sleep_time 70000 [us]\n" + ] + }, + { + "data": { + "text/plain": [ + "'ramp_00'" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create and RTApp RAMP tasks\n", + "rtapp = RTA(target, 'ramp', calibration=te.calibration())\n", + "rtapp.conf(kind='profile',\n", + " params={\n", + " 'ramp1' : Ramp(\n", + " start_pct = 95,\n", + " end_pct = 5,\n", + " delta_pct = 10,\n", + " time_s = 0.1).get(),\n", + " 'ramp2' : Ramp(\n", + " start_pct = 90,\n", + " end_pct = 30,\n", + " delta_pct = 20,\n", + " time_s = 0.2).get(),\n", + " })" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Energy estimation \n", + "The gem5 energy meters feature two methods: **reset** and **report**.\n", + "* The **reset** method will start sampling the channels defined in the target configuration.\n", + "* The **report** method will stop the sampling and produce a CSV file containing power samples together with a JSON file summarizing the total energy consumption of each channel." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2017-08-17 02:40:06,494 INFO : Workload : Workload execution START:\n", + "2017-08-17 02:40:06,494 INFO : Workload : /home/root/devlib-target/bin/rt-app /home/root/devlib-target/ramp_00.json 2>&1\n" + ] + } + ], + "source": [ + "# Start emeters & run workload\n", + "te.emeter.reset()\n", + "rtapp.run(out_dir=te.res_dir)\n", + "nrg_rep = te.emeter.report(te.res_dir)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2017-08-17 04:43:29,481 INFO : root : Measured channels energy:\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"system.cluster0.cores2.power_model.dynamic_power\": 0.0015930811939999978, \n", + " \"system.cluster0.cores2.power_model.static_power\": 5.5844099999999809e-07, \n", + " \"system.cluster0.cores0.power_model.static_power\": 1.3219494999999962e-05, \n", + " \"system.cluster0.cores3.power_model.dynamic_power\": 0.15863506186750015, \n", + " \"system.cluster0.cores0.power_model.dynamic_power\": 0.0027130621879999954, \n", + " \"system.cluster1.cores1.power_model.dynamic_power\": 0.013573508823999998, \n", + " \"system.cluster0.cores3.power_model.static_power\": 0.0009470161700000008, \n", + " \"system.cluster0.cores1.power_model.static_power\": 1.930225999999995e-06, \n", + " \"system.cluster1.cores1.power_model.static_power\": 0.00015487269799999999, \n", + " \"system.cluster1.cores0.power_model.dynamic_power\": 0.29683561018450011, \n", + " \"system.cluster0.cores1.power_model.dynamic_power\": 0.0017484881624999973, \n", + " \"system.cluster1.cores0.power_model.static_power\": 0.0029071225505000018\n", + "}\n" + ] + } + ], + "source": [ + "logging.info(\"Measured channels energy:\")\n", + "print json.dumps(nrg_rep.channels, indent=4)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2017-08-17 04:43:29,513 INFO : root : DataFrame of collected samples (only first 5)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sim_secondssystem.cluster0.cores0.power_model.dynamic_powersystem.cluster0.cores0.power_model.static_powersystem.cluster0.cores1.power_model.dynamic_powersystem.cluster0.cores1.power_model.static_powersystem.cluster0.cores2.power_model.dynamic_powersystem.cluster0.cores2.power_model.static_powersystem.cluster0.cores3.power_model.dynamic_powersystem.cluster0.cores3.power_model.static_powersystem.cluster1.cores0.power_model.dynamic_powersystem.cluster1.cores0.power_model.static_powersystem.cluster1.cores1.power_model.dynamic_powersystem.cluster1.cores1.power_model.static_power
timepowerpowerpowerpowerpowerpowerpowerpowerpowerpowerpowerpower
0.0000000.0007230.0229430.0000650.0172510.0000010.0176850.0000070.0577930.0004880.0228470.0002340.0027980.000007
0.0100000.0100000.0242100.0000850.0165830.0000000.0165860.0000000.0636530.0004790.0051930.0000340.0813590.000826
0.0177370.0077370.0005560.0000030.0004790.0000020.0003510.0000000.0821480.0004880.4550680.0043540.1130780.001088
0.0196140.0018770.0002550.0000000.0000000.0000000.0000000.0000000.0818700.0004880.1894040.0036080.0100950.000206
0.0200000.0003860.0000000.0000000.0000000.0000000.0000000.0000000.0821420.0004880.5612270.0053740.0000000.000000
\n", + "
" + ], + "text/plain": [ + " sim_seconds system.cluster0.cores0.power_model.dynamic_power \\\n", + " time power \n", + "0.000000 0.000723 0.022943 \n", + "0.010000 0.010000 0.024210 \n", + "0.017737 0.007737 0.000556 \n", + "0.019614 0.001877 0.000255 \n", + "0.020000 0.000386 0.000000 \n", + "\n", + " system.cluster0.cores0.power_model.static_power \\\n", + " power \n", + "0.000000 0.000065 \n", + "0.010000 0.000085 \n", + "0.017737 0.000003 \n", + "0.019614 0.000000 \n", + "0.020000 0.000000 \n", + "\n", + " system.cluster0.cores1.power_model.dynamic_power \\\n", + " power \n", + "0.000000 0.017251 \n", + "0.010000 0.016583 \n", + "0.017737 0.000479 \n", + "0.019614 0.000000 \n", + "0.020000 0.000000 \n", + "\n", + " system.cluster0.cores1.power_model.static_power \\\n", + " power \n", + "0.000000 0.000001 \n", + "0.010000 0.000000 \n", + "0.017737 0.000002 \n", + "0.019614 0.000000 \n", + "0.020000 0.000000 \n", + "\n", + " system.cluster0.cores2.power_model.dynamic_power \\\n", + " power \n", + "0.000000 0.017685 \n", + "0.010000 0.016586 \n", + "0.017737 0.000351 \n", + "0.019614 0.000000 \n", + "0.020000 0.000000 \n", + "\n", + " system.cluster0.cores2.power_model.static_power \\\n", + " power \n", + "0.000000 0.000007 \n", + "0.010000 0.000000 \n", + "0.017737 0.000000 \n", + "0.019614 0.000000 \n", + "0.020000 0.000000 \n", + "\n", + " system.cluster0.cores3.power_model.dynamic_power \\\n", + " power \n", + "0.000000 0.057793 \n", + "0.010000 0.063653 \n", + "0.017737 0.082148 \n", + "0.019614 0.081870 \n", + "0.020000 0.082142 \n", + "\n", + " system.cluster0.cores3.power_model.static_power \\\n", + " power \n", + "0.000000 0.000488 \n", + "0.010000 0.000479 \n", + "0.017737 0.000488 \n", + "0.019614 0.000488 \n", + "0.020000 0.000488 \n", + "\n", + " system.cluster1.cores0.power_model.dynamic_power \\\n", + " power \n", + "0.000000 0.022847 \n", + "0.010000 0.005193 \n", + "0.017737 0.455068 \n", + "0.019614 0.189404 \n", + "0.020000 0.561227 \n", + "\n", + " system.cluster1.cores0.power_model.static_power \\\n", + " power \n", + "0.000000 0.000234 \n", + "0.010000 0.000034 \n", + "0.017737 0.004354 \n", + "0.019614 0.003608 \n", + "0.020000 0.005374 \n", + "\n", + " system.cluster1.cores1.power_model.dynamic_power \\\n", + " power \n", + "0.000000 0.002798 \n", + "0.010000 0.081359 \n", + "0.017737 0.113078 \n", + "0.019614 0.010095 \n", + "0.020000 0.000000 \n", + "\n", + " system.cluster1.cores1.power_model.static_power \n", + " power \n", + "0.000000 0.000007 \n", + "0.010000 0.000826 \n", + "0.017737 0.001088 \n", + "0.019614 0.000206 \n", + "0.020000 0.000000 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "logging.info(\"DataFrame of collected samples (only first 5)\")\n", + "nrg_rep.data_frame.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Obtain system level energy by ...\n", + "df = nrg_rep.data_frame\n", + "# ... summing the dynamic power of all cores to obtain total dynamic power, ...\n", + "df[\"total_dynamic\"] = df[('system.cluster0.cores0.power_model.dynamic_power', 'power')] + \\\n", + " df[('system.cluster0.cores1.power_model.dynamic_power', 'power')] + \\\n", + " df[('system.cluster0.cores2.power_model.dynamic_power', 'power')] + \\\n", + " df[('system.cluster0.cores3.power_model.dynamic_power', 'power')] + \\\n", + " df[('system.cluster1.cores0.power_model.dynamic_power', 'power')] + \\\n", + " df[('system.cluster1.cores1.power_model.dynamic_power', 'power')]\n", + "# ... summing the static power of all cores to obtain total static power and ...\n", + "df[\"total_static\"] = df[('system.cluster0.cores0.power_model.static_power', 'power')] + \\\n", + " df[('system.cluster0.cores1.power_model.static_power', 'power')] + \\\n", + " df[('system.cluster0.cores2.power_model.static_power', 'power')] + \\\n", + " df[('system.cluster0.cores3.power_model.static_power', 'power')] + \\\n", + " df[('system.cluster1.cores0.power_model.static_power', 'power')] + \\\n", + " df[('system.cluster1.cores1.power_model.static_power', 'power')]\n", + "# ... summing the dynamic and static powers\n", + "df[\"total\"] = df[\"total_dynamic\"] + df[\"total_static\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2017-08-17 04:43:29,627 INFO : root : Plot of collected power samples\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "logging.info(\"Plot of collected power samples\")\n", + "axes =df[('total')].plot(figsize=(16,8),\n", + " drawstyle='steps-post');\n", + "axes.set_title('Power samples');\n", + "axes.set_xlabel('Time [s]');\n", + "axes.set_ylabel('Output power [W]');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see on the above plot that the system level power consumption decreases over time (in average). **This is coherent with the expected behaviour given the decreasing ramp workload under consideration.**" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2017-08-17 04:43:29,810 INFO : root : Power distribution\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "logging.info(\"Power distribution\")\n", + "axes = df[('total')].plot(kind='hist', bins=32,\n", + " figsize=(16,8));\n", + "axes.set_title('Power Histogram');\n", + "axes.set_xlabel('Output power [W] buckets');\n", + "axes.set_ylabel('Samples per bucket');" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2017-08-17 04:43:30,013 INFO : root : Plot of collected power samples\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
countmeanstdmin50%90%95%99%max
sim_secondstime225.08.800516e-030.0028320.0002460.0100000.0100000.0100000.0100000.010000
system.cluster0.cores0.power_model.dynamic_powerpower225.01.860018e-030.0065840.0000000.0000000.0001700.0216040.0289750.036593
system.cluster0.cores0.power_model.static_powerpower225.09.782222e-060.0000360.0000000.0000000.0000000.0000990.0001650.000255
system.cluster0.cores1.power_model.dynamic_powerpower225.01.103284e-030.0043150.0000000.0000000.0000000.0136260.0217950.023048
system.cluster0.cores1.power_model.static_powerpower225.01.160000e-060.0000080.0000000.0000000.0000000.0000020.0000460.000076
system.cluster0.cores2.power_model.dynamic_powerpower225.01.011360e-030.0040750.0000000.0000000.0000000.0135400.0186920.025682
system.cluster0.cores2.power_model.static_powerpower225.04.000000e-070.0000030.0000000.0000000.0000000.0000000.0000090.000042
system.cluster0.cores3.power_model.dynamic_powerpower225.07.881513e-020.0130590.0038320.0824980.0825450.0825480.0826390.082641
system.cluster0.cores3.power_model.static_powerpower225.04.727467e-040.0000670.0000030.0004880.0004880.0004880.0004880.000488
system.cluster1.cores0.power_model.dynamic_powerpower225.01.475154e-010.2273300.0000000.0000000.5611850.5611880.5613070.561547
system.cluster1.cores0.power_model.static_powerpower225.01.512400e-030.0022400.0000000.0000000.0053740.0053740.0053740.005374
system.cluster1.cores1.power_model.dynamic_powerpower225.09.468827e-030.0374440.0000000.0000000.0061870.0800260.1669150.295482
system.cluster1.cores1.power_model.static_powerpower225.01.134667e-040.0004490.0000000.0000000.0001150.0010360.0023000.003488
total_dynamic225.02.397740e-010.2268580.0292840.0825450.6437040.6437280.6466660.651680
total_static225.02.109956e-030.0022350.0002970.0004880.0058620.0058620.0058930.005935
total225.02.418840e-010.2290500.0295810.0830330.6495660.6495900.6525590.657615
\n", + "
" + ], + "text/plain": [ + " count mean \\\n", + "sim_seconds time 225.0 8.800516e-03 \n", + "system.cluster0.cores0.power_model.dynamic_power power 225.0 1.860018e-03 \n", + "system.cluster0.cores0.power_model.static_power power 225.0 9.782222e-06 \n", + "system.cluster0.cores1.power_model.dynamic_power power 225.0 1.103284e-03 \n", + "system.cluster0.cores1.power_model.static_power power 225.0 1.160000e-06 \n", + "system.cluster0.cores2.power_model.dynamic_power power 225.0 1.011360e-03 \n", + "system.cluster0.cores2.power_model.static_power power 225.0 4.000000e-07 \n", + "system.cluster0.cores3.power_model.dynamic_power power 225.0 7.881513e-02 \n", + "system.cluster0.cores3.power_model.static_power power 225.0 4.727467e-04 \n", + "system.cluster1.cores0.power_model.dynamic_power power 225.0 1.475154e-01 \n", + "system.cluster1.cores0.power_model.static_power power 225.0 1.512400e-03 \n", + "system.cluster1.cores1.power_model.dynamic_power power 225.0 9.468827e-03 \n", + "system.cluster1.cores1.power_model.static_power power 225.0 1.134667e-04 \n", + "total_dynamic 225.0 2.397740e-01 \n", + "total_static 225.0 2.109956e-03 \n", + "total 225.0 2.418840e-01 \n", + "\n", + " std min \\\n", + "sim_seconds time 0.002832 0.000246 \n", + "system.cluster0.cores0.power_model.dynamic_power power 0.006584 0.000000 \n", + "system.cluster0.cores0.power_model.static_power power 0.000036 0.000000 \n", + "system.cluster0.cores1.power_model.dynamic_power power 0.004315 0.000000 \n", + "system.cluster0.cores1.power_model.static_power power 0.000008 0.000000 \n", + "system.cluster0.cores2.power_model.dynamic_power power 0.004075 0.000000 \n", + "system.cluster0.cores2.power_model.static_power power 0.000003 0.000000 \n", + "system.cluster0.cores3.power_model.dynamic_power power 0.013059 0.003832 \n", + "system.cluster0.cores3.power_model.static_power power 0.000067 0.000003 \n", + "system.cluster1.cores0.power_model.dynamic_power power 0.227330 0.000000 \n", + "system.cluster1.cores0.power_model.static_power power 0.002240 0.000000 \n", + "system.cluster1.cores1.power_model.dynamic_power power 0.037444 0.000000 \n", + "system.cluster1.cores1.power_model.static_power power 0.000449 0.000000 \n", + "total_dynamic 0.226858 0.029284 \n", + "total_static 0.002235 0.000297 \n", + "total 0.229050 0.029581 \n", + "\n", + " 50% 90% \\\n", + "sim_seconds time 0.010000 0.010000 \n", + "system.cluster0.cores0.power_model.dynamic_power power 0.000000 0.000170 \n", + "system.cluster0.cores0.power_model.static_power power 0.000000 0.000000 \n", + "system.cluster0.cores1.power_model.dynamic_power power 0.000000 0.000000 \n", + "system.cluster0.cores1.power_model.static_power power 0.000000 0.000000 \n", + "system.cluster0.cores2.power_model.dynamic_power power 0.000000 0.000000 \n", + "system.cluster0.cores2.power_model.static_power power 0.000000 0.000000 \n", + "system.cluster0.cores3.power_model.dynamic_power power 0.082498 0.082545 \n", + "system.cluster0.cores3.power_model.static_power power 0.000488 0.000488 \n", + "system.cluster1.cores0.power_model.dynamic_power power 0.000000 0.561185 \n", + "system.cluster1.cores0.power_model.static_power power 0.000000 0.005374 \n", + "system.cluster1.cores1.power_model.dynamic_power power 0.000000 0.006187 \n", + "system.cluster1.cores1.power_model.static_power power 0.000000 0.000115 \n", + "total_dynamic 0.082545 0.643704 \n", + "total_static 0.000488 0.005862 \n", + "total 0.083033 0.649566 \n", + "\n", + " 95% 99% \\\n", + "sim_seconds time 0.010000 0.010000 \n", + "system.cluster0.cores0.power_model.dynamic_power power 0.021604 0.028975 \n", + "system.cluster0.cores0.power_model.static_power power 0.000099 0.000165 \n", + "system.cluster0.cores1.power_model.dynamic_power power 0.013626 0.021795 \n", + "system.cluster0.cores1.power_model.static_power power 0.000002 0.000046 \n", + "system.cluster0.cores2.power_model.dynamic_power power 0.013540 0.018692 \n", + "system.cluster0.cores2.power_model.static_power power 0.000000 0.000009 \n", + "system.cluster0.cores3.power_model.dynamic_power power 0.082548 0.082639 \n", + "system.cluster0.cores3.power_model.static_power power 0.000488 0.000488 \n", + "system.cluster1.cores0.power_model.dynamic_power power 0.561188 0.561307 \n", + "system.cluster1.cores0.power_model.static_power power 0.005374 0.005374 \n", + "system.cluster1.cores1.power_model.dynamic_power power 0.080026 0.166915 \n", + "system.cluster1.cores1.power_model.static_power power 0.001036 0.002300 \n", + "total_dynamic 0.643728 0.646666 \n", + "total_static 0.005862 0.005893 \n", + "total 0.649590 0.652559 \n", + "\n", + " max \n", + "sim_seconds time 0.010000 \n", + "system.cluster0.cores0.power_model.dynamic_power power 0.036593 \n", + "system.cluster0.cores0.power_model.static_power power 0.000255 \n", + "system.cluster0.cores1.power_model.dynamic_power power 0.023048 \n", + "system.cluster0.cores1.power_model.static_power power 0.000076 \n", + "system.cluster0.cores2.power_model.dynamic_power power 0.025682 \n", + "system.cluster0.cores2.power_model.static_power power 0.000042 \n", + "system.cluster0.cores3.power_model.dynamic_power power 0.082641 \n", + "system.cluster0.cores3.power_model.static_power power 0.000488 \n", + "system.cluster1.cores0.power_model.dynamic_power power 0.561547 \n", + "system.cluster1.cores0.power_model.static_power power 0.005374 \n", + "system.cluster1.cores1.power_model.dynamic_power power 0.295482 \n", + "system.cluster1.cores1.power_model.static_power power 0.003488 \n", + "total_dynamic 0.651680 \n", + "total_static 0.005935 \n", + "total 0.657615 " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "logging.info(\"Plot of collected power samples\")\n", + "nrg_rep.data_frame.describe(percentiles=[0.90, 0.95, 0.99]).T" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2017-08-17 04:43:30,123 INFO : gem5-connection : Gracefully terminating the gem5 simulation.\n", + "2017-08-17 04:43:37,381 INFO : gem5-connection : Removing the temporary directory\n" + ] + } + ], + "source": [ + "# Don't forget to stop Gem5\n", + "target.disconnect()" + ] + } + ], + "metadata": { + "celltoolbar": "Raw Cell Format", + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/libs/utils/energy.py b/libs/utils/energy.py index ec7917cb2ab2837f0781be7660114261391a9052..1027329f65b2e0c1a80dee10c66282ff2ad5461a 100644 --- a/libs/utils/energy.py +++ b/libs/utils/energy.py @@ -103,6 +103,8 @@ class EnergyMeter(object): EnergyMeter._meter = Monsoon(target, emeter, res_dir) elif emeter['instrument'] == 'acme': EnergyMeter._meter = ACME(target, emeter, res_dir) + elif emeter['instrument'] == 'gem5': + EnergyMeter._meter = Gem5EnergyMeter(target, emeter, res_dir) log.debug('Results dir: %s', res_dir) return EnergyMeter._meter @@ -236,6 +238,19 @@ class _DevlibContinuousEnergyMeter(EnergyMeter): def report(self, out_dir, out_energy='energy.json', out_samples='samples.csv'): self._instrument.stop() + df = self._read_csv(out_dir, out_samples) + df = self._build_timeline(df) + if df.empty: + raise RuntimeError('No energy data collected') + channels_nrg = self._compute_energy(df) + # Dump data as JSON file + nrg_file = os.path.join(out_dir, out_energy) + with open(nrg_file, 'w') as ofile: + json.dump(channels_nrg, ofile, sort_keys=True, indent=4) + + return EnergyReport(channels_nrg, nrg_file, df) + + def _read_csv(self, out_dir, out_samples): csv_path = os.path.join(out_dir, out_samples) csv_data = self._instrument.get_data(csv_path) with open(csv_path) as f: @@ -256,24 +271,19 @@ class _DevlibContinuousEnergyMeter(EnergyMeter): # the CSV (i.e. expects every line to hold data). This works because # we have already consumed the first line of `f`. df = pd.read_csv(f, names=columns) - + return df + + def _build_timeline(self, df): sample_period = 1. / self._instrument.sample_rate_hz df.index = np.linspace(0, sample_period * len(df), num=len(df)) + return df - if df.empty: - raise RuntimeError('No energy data collected') - + def _compute_energy(self, df): channels_nrg = {} for site, measure in df: if measure == 'power': channels_nrg[site] = area_under_curve(df[site]['power']) - - # Dump data as JSON file - nrg_file = '{}/{}'.format(out_dir, out_energy) - with open(nrg_file, 'w') as ofile: - json.dump(channels_nrg, ofile, sort_keys=True, indent=4) - - return EnergyReport(channels_nrg, nrg_file, df) + return channels_nrg class AEP(_DevlibContinuousEnergyMeter): @@ -501,4 +511,30 @@ class ACME(EnergyMeter): return EnergyReport(channels_nrg, nrg_file, None) +class Gem5EnergyMeter(_DevlibContinuousEnergyMeter): + def __init__(self, target, conf, res_dir): + super(Gem5EnergyMeter, self).__init__(target, res_dir) + + power_sites = conf['channel_map'].values() + self._instrument = devlib.Gem5PowerInstrument(self._target, power_sites) + + def reset(self): + self._instrument.reset() + self._instrument.start() + + def _build_timeline(self, df): + # Power measurements on gem5 are performed not only periodically but also + # spuriously on OPP changes. Let's use the time channel provided by the + # gem5 power instrument to build the timeline accordingly. + for site, measure in df: + if measure == 'time': + meas_dur = df[site]['time'] + break + timeline = np.zeros(len(meas_dur)) + # The time channel gives the elapsed time since previous measurement + for i in range(1, len(meas_dur)): + timeline[i] = meas_dur[i] + timeline[i - 1] + df.index = timeline + return df + # vim :set tabstop=4 shiftwidth=4 expandtab