Skip to content

Instantly share code, notes, and snippets.

@derkling
Created August 21, 2017 09:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save derkling/7f9170e613dea25fe248e14157e6cb23 to your computer and use it in GitHub Desktop.
Save derkling/7f9170e613dea25fe248e14157e6cb23 to your computer and use it in GitHub Desktop.
UtilClamp Evaluation
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "<font size=\"9\">UtilClamp Validation</font><br>\n<hr>"
},
{
"metadata": {
"collapsed": true,
"trusted": false
},
"cell_type": "code",
"source": "import logging\nreload(logging)\nlogging.basicConfig(\n format='%(asctime)-9s %(levelname)-8s: %(message)s',\n datefmt='%I:%M:%S')\n\n# Enable logging at INFO level\nlogging.getLogger().setLevel(logging.INFO)\n# Comment the follwing line to disable devlib debugging statements\n# logging.getLogger('ssh').setLevel(logging.DEBUG)",
"execution_count": 1,
"outputs": []
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "# Generate plots inline\n%pylab inline\n\nimport json\nimport os\nfrom time import sleep\n\n# Support to access the remote target\nimport devlib\nfrom env import TestEnv\n\n# Support to configure and run RTApp based workloads\nfrom wlgen import RTA, Ramp, Periodic, PerfMessaging\n\n# Support for trace events analysis\nfrom trace import Trace\nfrom perf_analysis import PerfAnalysis\nimport pandas as pd\n\n# Suport for FTrace events parsing and visualization\nimport trappy",
"execution_count": 2,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": "Populating the interactive namespace from numpy and matplotlib\n"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# Test environment setup"
},
{
"metadata": {
"collapsed": true,
"trusted": false
},
"cell_type": "code",
"source": "# Setup a target configuration\nmy_conf = {\n \n # Define the kind of target platform to use for the experiments\n \"platform\" : 'linux', # Linux system, valid other options are:\n # android - access via ADB\n # linux - access via SSH\n # host - direct access\n \n # Preload settings for a specific target\n \"board\" : 'juno', # load JUNO specific settings, e.g.\n # - HWMON based energy sampling\n # - Juno energy model\n # valid options are:\n # - juno - JUNO Development Board\n # - tc2 - TC2 Development Board\n # - oak - Mediatek MT63xx based target\n\n # Define devlib module to load\n \"modules\" : [\"cgroups\"],\n \"exclude_modules\" : ['hwmon'],\n\n # Account to access the remote target\n \"host\" : '10.1.211.10',\n \"username\" : 'root',\n \"password\" : '',\n\n # Comment the following line to force rt-app calibration on your target\n \"rtapp-calib\" : {\n \"0\": 585, \"1\": 262, \"2\": 262, \"3\": 585, \"4\": 586, \"5\": 584\n },\n \n # Binary tools required to run this experiment\n # These tools must be present in the tools/ folder for the architecture\n \"tools\" : ['rt-app', 'taskset', 'trace-cmd'],\n \n # FTrace events end buffer configuration\n \"ftrace\" : {\n \"events\" : [\n \"sched_switch\",\n \"cpu_frequency\",\n ],\n \"buffsize\" : 10240\n },\n \n \"results_dir\" : \"uclamp_validation\",\n\n}",
"execution_count": 3,
"outputs": []
},
{
"metadata": {
"scrolled": false,
"trusted": false
},
"cell_type": "code",
"source": "# Initialize a test environment using:\n# the provided target configuration (my_target_conf)\n# the provided test configuration (my_test_conf)\nte = TestEnv(my_conf, force_new=True, wipe=False)\ntarget = te.target",
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": "02:37:11 INFO : Using base path: /data/Code/lisa\n02:37:11 INFO : Loading custom (inline) target configuration\n02:37:11 INFO : Devlib modules to load: ['bl', 'cpufreq', 'cgroups']\n02:37:11 INFO : Connecting linux target:\n02:37:11 INFO : username : root\n02:37:11 INFO : host : 10.1.211.10\n02:37:11 INFO : password : \n02:37:11 INFO : Connection settings:\n02:37:11 INFO : {'username': 'root', 'host': '10.1.211.10', 'password': ''}\n02:37:14 INFO : Initializing target workdir:\n02:37:14 INFO : /root/devlib-target\n02:37:16 INFO : Available controllers:\n02:37:18 INFO : cpuset : /root/devlib-target/cgroups/devlib_cgh0\n02:37:19 INFO : cpu : /root/devlib-target/cgroups/devlib_cgh0\n02:37:20 INFO : cpuacct : /root/devlib-target/cgroups/devlib_cgh0\n02:37:21 INFO : blkio : /root/devlib-target/cgroups/devlib_cgh0\n02:37:21 INFO : memory : /root/devlib-target/cgroups/devlib_cgh0\n02:37:22 INFO : devices : /root/devlib-target/cgroups/devlib_cgh0\n02:37:23 INFO : perf_event : /root/devlib-target/cgroups/devlib_cgh0\n02:37:24 INFO : hugetlb : /root/devlib-target/cgroups/devlib_cgh0\n02:37:25 INFO : pids : /root/devlib-target/cgroups/devlib_cgh0\n02:37:28 INFO : Topology:\n02:37:28 INFO : [[0, 3, 4, 5], [1, 2]]\n02:37:29 INFO : Loading default EM:\n02:37:29 INFO : /data/Code/lisa/libs/utils/platforms/juno.json\n02:37:30 INFO : Enabled tracepoints:\n02:37:30 INFO : sched_switch\n02:37:30 INFO : cpu_frequency\n02:37:30 WARNING : Using configuration provided RTApp calibration\n02:37:30 INFO : Using RT-App calibration values:\n02:37:30 INFO : {\"0\": 585, \"1\": 262, \"2\": 262, \"3\": 585, \"4\": 586, \"5\": 584}\n02:37:30 INFO : HWMON module not enabled\n02:37:30 WARNING : Energy sampling disabled by configuration\n02:37:30 INFO : Set results folder to:\n02:37:30 INFO : /data/Code/lisa/results/uclamp_validation\n02:37:30 INFO : Experiment results available also in:\n02:37:30 INFO : /data/Code/lisa/results_latest\n"
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "target.cpufreq.set_all_governors('schedutil');\nlogging.info(\"CPUFreq governors:\\n%s\", target.cpufreq.get_all_governors())\ntarget.write_value('/sys/devices/system/cpu/cpufreq/policy0/schedutil/rate_limit_us', 50000)\ntarget.write_value('/sys/devices/system/cpu/cpufreq/policy1/schedutil/rate_limit_us', 50000)",
"execution_count": 5,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": "02:37:31 INFO : CPUFreq governors:\n{'1': 'schedutil', '0': 'schedutil', '3': 'schedutil', '2': 'schedutil', '5': 'schedutil', '4': 'schedutil'}\n"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# Single Task"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Workload configuration"
},
{
"metadata": {
"scrolled": false,
"trusted": false
},
"cell_type": "code",
"source": "# Create a new RTApp workload generator using the calibration values\n# reported by the TestEnv module\nrtapp = RTA(target, 'test', calibration=te.calibration())\n\n# Configure this RTApp instance to:\nrtapp.conf(\n kind='profile',\n params={\n 'task_r10_20-80': Ramp(\n period_ms=16,\n start_pct=10,\n end_pct=70,\n delta_pct=30,\n cpus=[2],\n ).get(),\n },\n loadref='big',\n);",
"execution_count": 29,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": "08:05:05 INFO : Setup new workload test\n08:05:05 INFO : Workload duration defined by longest task\n08:05:05 INFO : Default policy: SCHED_OTHER\n08:05:05 INFO : ------------------------\n08:05:05 INFO : task [task_r10_20-80], sched: using default policy\n08:05:05 INFO : | calibration CPU: 1\n08:05:05 INFO : | loops count: 1\n08:05:05 INFO : | CPUs affinity: [2]\n08:05:05 INFO : + phase_000001: duration 1.000000 [s] (62 loops)\n08:05:05 INFO : | period 16000 [us], duty_cycle 10 %\n08:05:05 INFO : | run_time 1600 [us], sleep_time 14400 [us]\n08:05:05 INFO : + phase_000002: duration 1.000000 [s] (62 loops)\n08:05:05 INFO : | period 16000 [us], duty_cycle 40 %\n08:05:05 INFO : | run_time 6400 [us], sleep_time 9600 [us]\n08:05:05 INFO : + phase_000003: duration 1.000000 [s] (62 loops)\n08:05:05 INFO : | period 16000 [us], duty_cycle 70 %\n08:05:05 INFO : | run_time 11200 [us], sleep_time 4800 [us]\n"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## CGroups setup"
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "cpu_ctr = target.cgroups.controller('cpu')\nuclamp_cg = cpu_ctr.cgroup('/uclamp')\nuclamp_cg.set(util_min=400, util_max=600)\nuclamp_cg.get()",
"execution_count": 30,
"outputs": [
{
"execution_count": 30,
"output_type": "execute_result",
"data": {
"text/plain": "{'shares': '1024', 'util_max': '600', 'util_min': '400'}"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "# Let's configure CPUSets in case they are co-mounted with the CPU controller\ncpuset_ctr = target.cgroups.controller('cpuset')\nuclamp_cg = cpuset_ctr.cgroup('/uclamp')\nuclamp_cg.set(cpus=2, mems=0)\nuclamp_cg.get()",
"execution_count": 31,
"outputs": [
{
"execution_count": 31,
"output_type": "execute_result",
"data": {
"text/plain": "{'cpu_exclusive': '0',\n 'cpus': '2',\n 'effective_cpus': '2',\n 'effective_mems': '0',\n 'mem_exclusive': '0',\n 'mem_hardwall': '0',\n 'memory_migrate': '0',\n 'memory_pressure': '0',\n 'memory_spread_page': '0',\n 'memory_spread_slab': '0',\n 'mems': '0',\n 'sched_load_balance': '1',\n 'sched_relax_domain_level': '-1'}"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Workload Execution"
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "logging.info('#### Setup FTrace')\nte.ftrace.start()\n\nlogging.info('#### Start RTApp execution')\nrtapp.run(out_dir=te.res_dir, cgroup='/uclamp')\n\nlogging.info('#### Stop FTrace')\nte.ftrace.stop()\n\ntrace_file = os.path.join(te.res_dir, 'trace.dat')\nlogging.info('#### Save FTrace: %s', trace_file)\nte.ftrace.get_trace(trace_file)\n\nlogging.info('#### Save platform description: %s/platform.json', te.res_dir)\n(plt, plt_file) = te.platform_dump(te.res_dir)",
"execution_count": 32,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": "08:05:08 INFO : #### Setup FTrace\n08:05:13 INFO : #### Start RTApp execution\n08:05:13 INFO : Workload execution START:\n08:05:13 INFO : CGMOUNT=/root/devlib-target/cgroups /root/devlib-target/bin/shutils cgroups_run_into /uclamp /root/devlib-target/bin/rt-app /root/devlib-target/test_00.json 2>&1\n08:05:17 INFO : #### Stop FTrace\n08:05:18 INFO : #### Save FTrace: /data/Code/lisa/results/uclamp_validation/trace.dat\n08:05:24 INFO : #### Save platform description: /data/Code/lisa/results/uclamp_validation/platform.json\n"
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "# Base folder where tests folder are located\nres_dir = te.res_dir\nlogging.info('Content of the output folder %s', res_dir)\n!tree {res_dir}",
"execution_count": 33,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": "08:05:24 INFO : Content of the output folder /data/Code/lisa/results/uclamp_validation\n"
},
{
"output_type": "stream",
"name": "stdout",
"text": "\u001b[01;34m/data/Code/lisa/results/uclamp_validation\u001b[00m\r\n├── output.log\r\n├── platform.json\r\n├── rt-app-task_r10_20-80-0.log\r\n├── test_00.json\r\n└── trace.dat\r\n\r\n0 directories, 5 files\r\n"
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "with open(os.path.join(res_dir, 'platform.json'), 'r') as fh:\n platform = json.load(fh)\n#print json.dumps(platform, indent=4)\nlogging.info('LITTLE cluster max capacity: %d',\n platform['nrg_model']['little']['cpu']['cap_max'])",
"execution_count": 34,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": "08:05:24 INFO : LITTLE cluster max capacity: 447\n"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Trace analysis"
},
{
"metadata": {
"trusted": false,
"collapsed": true
},
"cell_type": "code",
"source": "trace_file = '/data/Code/lisa/results/uclamp_validation/trace.dat'\nplatf_file = '/data/Code/lisa/results/uclamp_validation/platform.json'\nwith open(platf_file, 'r') as fh:\n platform = json.load(fh)",
"execution_count": 35,
"outputs": []
},
{
"metadata": {
"trusted": false,
"collapsed": true
},
"cell_type": "code",
"source": "events = [\"sched_switch\", \"cpu_frequency\", \"next_freq\", \"update_task\", \"update_load\"]\ntrace = Trace(data_dir=trace_file, platform=platform, events=events)\ntrace.available_events",
"execution_count": 36,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": false
},
"cell_type": "code",
"source": "pid = trace.getTaskByName('task_r10_20-80')\ncpu = 2",
"execution_count": 38,
"outputs": []
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "next_freq_df = trace.data_frame.trace_event('next_freq')\nnext_freq_df = next_freq_df[next_freq_df.cpu == cpu]\nnext_freq_df.head()",
"execution_count": 39,
"outputs": [
{
"execution_count": 39,
"output_type": "execute_result",
"data": {
"text/plain": " __comm __cpu __pid clamped_util cpu cpu_cmax cpu_cmin \\\nTime \n0.002535 <idle> 2 0 9 2 1024 0 \n0.006699 <idle> 2 0 9 2 1024 0 \n0.010708 <idle> 2 0 8 2 1024 0 \n0.014697 <idle> 2 0 8 2 1024 0 \n0.018706 <idle> 2 0 8 2 1024 0 \n\n srd_cmax srd_cmin til \nTime \n0.002535 1024 0 9 \n0.006699 1024 0 9 \n0.010708 1024 0 8 \n0.014697 1024 0 8 \n0.018706 1024 0 8 ",
"text/html": "<div>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>__comm</th>\n <th>__cpu</th>\n <th>__pid</th>\n <th>clamped_util</th>\n <th>cpu</th>\n <th>cpu_cmax</th>\n <th>cpu_cmin</th>\n <th>srd_cmax</th>\n <th>srd_cmin</th>\n <th>til</th>\n </tr>\n <tr>\n <th>Time</th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0.002535</th>\n <td>&lt;idle&gt;</td>\n <td>2</td>\n <td>0</td>\n <td>9</td>\n <td>2</td>\n <td>1024</td>\n <td>0</td>\n <td>1024</td>\n <td>0</td>\n <td>9</td>\n </tr>\n <tr>\n <th>0.006699</th>\n <td>&lt;idle&gt;</td>\n <td>2</td>\n <td>0</td>\n <td>9</td>\n <td>2</td>\n <td>1024</td>\n <td>0</td>\n <td>1024</td>\n <td>0</td>\n <td>9</td>\n </tr>\n <tr>\n <th>0.010708</th>\n <td>&lt;idle&gt;</td>\n <td>2</td>\n <td>0</td>\n <td>8</td>\n <td>2</td>\n <td>1024</td>\n <td>0</td>\n <td>1024</td>\n <td>0</td>\n <td>8</td>\n </tr>\n <tr>\n <th>0.014697</th>\n <td>&lt;idle&gt;</td>\n <td>2</td>\n <td>0</td>\n <td>8</td>\n <td>2</td>\n <td>1024</td>\n <td>0</td>\n <td>1024</td>\n <td>0</td>\n <td>8</td>\n </tr>\n <tr>\n <th>0.018706</th>\n <td>&lt;idle&gt;</td>\n <td>2</td>\n <td>0</td>\n <td>8</td>\n <td>2</td>\n <td>1024</td>\n <td>0</td>\n <td>1024</td>\n <td>0</td>\n <td>8</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "next_freq_df.describe()",
"execution_count": 40,
"outputs": [
{
"execution_count": 40,
"output_type": "execute_result",
"data": {
"text/plain": " __cpu __pid util_uclamp cpu cpu_cmax cpu_cmin \\\ncount 813.0 813.000000 813.000000 813.0 813.000000 813.000000 \nmean 2.0 1512.028290 499.724477 2.0 705.869619 300.123001 \nstd 0.0 803.899551 179.520730 0.0 183.635020 173.240585 \nmin 2.0 0.000000 0.000000 2.0 600.000000 0.000000 \n25% 2.0 1939.000000 400.000000 2.0 600.000000 400.000000 \n50% 2.0 1939.000000 600.000000 2.0 600.000000 400.000000 \n75% 2.0 1939.000000 600.000000 2.0 600.000000 400.000000 \nmax 2.0 1949.000000 834.000000 2.0 1024.000000 400.000000 \n\n srd_cmax srd_cmin util \ncount 813.000000 813.000000 813.000000 \nmean 705.869619 300.123001 665.193112 \nstd 183.635020 173.240585 361.845405 \nmin 600.000000 0.000000 0.000000 \n25% 600.000000 400.000000 246.000000 \n50% 600.000000 400.000000 756.000000 \n75% 600.000000 400.000000 1023.000000 \nmax 1024.000000 400.000000 1024.000000 ",
"text/html": "<div>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>__cpu</th>\n <th>__pid</th>\n <th>util_uclamp</th>\n <th>cpu</th>\n <th>cpu_cmax</th>\n <th>cpu_cmin</th>\n <th>srd_cmax</th>\n <th>srd_cmin</th>\n <th>util</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>count</th>\n <td>813.0</td>\n <td>813.000000</td>\n <td>813.000000</td>\n <td>813.0</td>\n <td>813.000000</td>\n <td>813.000000</td>\n <td>813.000000</td>\n <td>813.000000</td>\n <td>813.000000</td>\n </tr>\n <tr>\n <th>mean</th>\n <td>2.0</td>\n <td>1512.028290</td>\n <td>499.724477</td>\n <td>2.0</td>\n <td>705.869619</td>\n <td>300.123001</td>\n <td>705.869619</td>\n <td>300.123001</td>\n <td>665.193112</td>\n </tr>\n <tr>\n <th>std</th>\n <td>0.0</td>\n <td>803.899551</td>\n <td>179.520730</td>\n <td>0.0</td>\n <td>183.635020</td>\n <td>173.240585</td>\n <td>183.635020</td>\n <td>173.240585</td>\n <td>361.845405</td>\n </tr>\n <tr>\n <th>min</th>\n <td>2.0</td>\n <td>0.000000</td>\n <td>0.000000</td>\n <td>2.0</td>\n <td>600.000000</td>\n <td>0.000000</td>\n <td>600.000000</td>\n <td>0.000000</td>\n <td>0.000000</td>\n </tr>\n <tr>\n <th>25%</th>\n <td>2.0</td>\n <td>1939.000000</td>\n <td>400.000000</td>\n <td>2.0</td>\n <td>600.000000</td>\n <td>400.000000</td>\n <td>600.000000</td>\n <td>400.000000</td>\n <td>246.000000</td>\n </tr>\n <tr>\n <th>50%</th>\n <td>2.0</td>\n <td>1939.000000</td>\n <td>600.000000</td>\n <td>2.0</td>\n <td>600.000000</td>\n <td>400.000000</td>\n <td>600.000000</td>\n <td>400.000000</td>\n <td>756.000000</td>\n </tr>\n <tr>\n <th>75%</th>\n <td>2.0</td>\n <td>1939.000000</td>\n <td>600.000000</td>\n <td>2.0</td>\n <td>600.000000</td>\n <td>400.000000</td>\n <td>600.000000</td>\n <td>400.000000</td>\n <td>1023.000000</td>\n </tr>\n <tr>\n <th>max</th>\n <td>2.0</td>\n <td>1949.000000</td>\n <td>834.000000</td>\n <td>2.0</td>\n <td>1024.000000</td>\n <td>400.000000</td>\n <td>1024.000000</td>\n <td>400.000000</td>\n <td>1024.000000</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "lines = [\n ('cpu_cmax', 'r', '--'),\n ('srd_cmax', 'r', '-'),\n ('cpu_cmin', 'y', '--'),\n ('srd_cmin', 'y', '-'),\n ('util', 'b', ':'),\n ('util_uclamp', 'b', '-'),\n]\ncolumns = [l for l,_,_ in lines]\ncolors = [c for _,c,_ in lines]\nstyle = [s for _,_,s in lines]\n\nnext_freq_df[1.8:2.5][columns].plot(\n figsize=(16,8), drawstyle='steps-post',\n color=colors, style=style);",
"execution_count": 82,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA64AAAHjCAYAAAAjX0LpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3X98VNWdP/7XnSQEwq+UwR/8CBItQZFA1IhaqaTaKmyD\nrS3qlmKhXUU+XbStoNDWtTy63c9WH2jbr+4W83UrtZptl/7Ylljt14qpa0ulEeKCVVKQaBAtNkhC\nDCGQ3O8fdyZz52Z+nHvn3jnnzH09H488Mpm5OXOTuefc8/ttmKYJIiIiIiIiIlVFZJ8AERERERER\nUSZsuBIREREREZHS2HAlIiIiIiIipbHhSkREREREREpjw5WIiIiIiIiUxoYrERERERERKY0NVyIi\nIiIiIlIaG65ERERERESkNDZciYiIiIiISGnFsk8gk4kTJ5rTp0+XfRpEREREREQUgJdeeulvpmme\nlu04pRuu06dPR0tLi+zTICIiIiIiogAYhvGGyHGcKkxERERERERKY8OViIiIiIiIlMaGKxERERER\nESlN6TWuREREREREfjt58iQOHjyIvr4+2acSGiNHjsTUqVNRUlLi6ffZcCUiIiIiolA5ePAgxo4d\ni+nTp8MwDNmnU/BM00RnZycOHjyIyspKT2lwqjAREREREYVKX18fotEoG615YhgGotFoTiPcbLgS\nEREREVHosNGaX7n+v9lwJSIiIiIiIqWx4UpERERERERKY8OViIiIiIiIlMZdhYmIiIiIKNzq6oY/\nV18PrF3r7fXmZv/OjQBwxJWIiIiIiEiKxx57DHPmzMHcuXNx0003YcWKFVi1ahVqa2tRVVWFpqYm\nAMDmzZuxevXqod+rr69Hc4bG8dNPP40LL7wQc+fOxVVXXQUA2LBhA5YvX44Pf/jDOOuss/Dzn/8c\nd911F6qrq7Fw4UKcPHkSAPDNb34TF198MWbPno2VK1fCNE2cOnUKF1988dB7fvWrX8XXv/71YP4p\naXDElYiIiIiIwi3bCGmur6fwyiuv4Fvf+hb+8Ic/YOLEiThy5AjuuOMOtLe3Y8eOHdi/fz8+8pGP\nYN++fa7Sfffdd3HLLbfg+eefR2VlJY4cOTL02v79+/Hcc8/hz3/+My677DL87Gc/w3333YfrrrsO\nTz75JD75yU9i9erVuOeeewAAN910E5qamrB48WJs3rwZS5YswYMPPoinn34aL774ouu/ORcccSUi\n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\n2MUOigpMSP0AAAAASUVORK5CYII=\n",
"text/plain": "<matplotlib.figure.Figure at 0x7f153b17a890>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "update_task_df = trace.data_frame.trace_event('update_task')\n# cast UCLAMP_NONE to end-of-scale values\nupdate_task_df.ix[:,'cpu_min'][update_task_df.cpu_min == -1] = 0\nupdate_task_df.ix[:,'cpu_max'][update_task_df.cpu_max == -1] = 1024\nupdate_task_df = update_task_df[update_task_df.pid == pid]\nupdate_task_df.head()",
"execution_count": 68,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": "/usr/local/lib/python2.7/dist-packages/ipykernel_launcher.py:3: SettingWithCopyWarning: \nA value is trying to be set on a copy of a slice from a DataFrame\n\nSee the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n This is separate from the ipykernel package so we can avoid doing imports until\n/usr/local/lib/python2.7/dist-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: \nA value is trying to be set on a copy of a slice from a DataFrame\n\nSee the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n after removing the cwd from sys.path.\n"
},
{
"execution_count": 68,
"output_type": "execute_result",
"data": {
"text/plain": " __comm __cpu __pid comm cpu cpu_max cpu_min \\\nTime \n0.871746 rt-app 2 1933 rt-app 2 600 400 \n0.875343 task_r10_20-80 2 1939 task_r10_20-80 2 1024 0 \n0.887934 <idle> 2 0 task_r10_20-80 2 600 400 \n0.889930 task_r10_20-80 2 1939 task_r10_20-80 2 1024 0 \n0.903938 <idle> 2 0 task_r10_20-80 2 600 400 \n\n get pid task_max task_min \nTime \n0.871746 1 1939 600 400 \n0.875343 0 1939 600 400 \n0.887934 1 1939 600 400 \n0.889930 0 1939 600 400 \n0.903938 1 1939 600 400 ",
"text/html": "<div>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>__comm</th>\n <th>__cpu</th>\n <th>__pid</th>\n <th>comm</th>\n <th>cpu</th>\n <th>cpu_max</th>\n <th>cpu_min</th>\n <th>get</th>\n <th>pid</th>\n <th>task_max</th>\n <th>task_min</th>\n </tr>\n <tr>\n <th>Time</th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0.871746</th>\n <td>rt-app</td>\n <td>2</td>\n <td>1933</td>\n <td>rt-app</td>\n <td>2</td>\n <td>600</td>\n <td>400</td>\n <td>1</td>\n <td>1939</td>\n <td>600</td>\n <td>400</td>\n </tr>\n <tr>\n <th>0.875343</th>\n <td>task_r10_20-80</td>\n <td>2</td>\n <td>1939</td>\n <td>task_r10_20-80</td>\n <td>2</td>\n <td>1024</td>\n <td>0</td>\n <td>0</td>\n <td>1939</td>\n <td>600</td>\n <td>400</td>\n </tr>\n <tr>\n <th>0.887934</th>\n <td>&lt;idle&gt;</td>\n <td>2</td>\n <td>0</td>\n <td>task_r10_20-80</td>\n <td>2</td>\n <td>600</td>\n <td>400</td>\n <td>1</td>\n <td>1939</td>\n <td>600</td>\n <td>400</td>\n </tr>\n <tr>\n <th>0.889930</th>\n <td>task_r10_20-80</td>\n <td>2</td>\n <td>1939</td>\n <td>task_r10_20-80</td>\n <td>2</td>\n <td>1024</td>\n <td>0</td>\n <td>0</td>\n <td>1939</td>\n <td>600</td>\n <td>400</td>\n </tr>\n <tr>\n <th>0.903938</th>\n <td>&lt;idle&gt;</td>\n <td>2</td>\n <td>0</td>\n <td>task_r10_20-80</td>\n <td>2</td>\n <td>600</td>\n <td>400</td>\n <td>1</td>\n <td>1939</td>\n <td>600</td>\n <td>400</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "lines = [\n ('task_min', 'r', ':'),\n ('task_max', 'y', ':'),\n ('cpu_max', 'r', '-'),\n ('cpu_min', 'y', '-'),\n]\ncolumns = [l for l,_,_ in lines]\ncolors = [c for _,c,_ in lines]\nstyle = [s for _,_,s in lines]\n\nupdate_task_df[1.8:2.5][columns].plot(\n figsize=(16,6), drawstyle='steps-post',\n color=colors, style=style);",
"execution_count": 83,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nkiRJqfb/AYKm70qa/ms8AAAAAElFTkSuQmCC\n",
"text/plain": "<matplotlib.figure.Figure at 0x7f153b301910>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "update_load_df = trace.data_frame.trace_event('update_load')\nupdate_load_df = update_load_df[update_load_df.pid == pid]\nupdate_load_df.head()",
"execution_count": 55,
"outputs": [
{
"execution_count": 55,
"output_type": "execute_result",
"data": {
"text/plain": " __comm __cpu __pid clamp_util_avg comm cpu \\\nTime \n0.871750 rt-app 2 1933 400 rt-app 2 \n0.871780 rt-app 2 1933 400 rt-app 2 \n0.874512 task_r10_20-80 2 1939 400 task_r10_20-80 2 \n0.875347 task_r10_20-80 2 1939 296 task_r10_20-80 2 \n0.887937 <idle> 2 0 400 task_r10_20-80 2 \n\n pid uclamp_max uclamp_min util_avg \nTime \n0.871750 1939 600 400 241 \n0.871780 1939 600 400 240 \n0.874512 1939 600 400 283 \n0.875347 1939 1024 0 296 \n0.887937 1939 600 400 228 ",
"text/html": "<div>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>__comm</th>\n <th>__cpu</th>\n <th>__pid</th>\n <th>clamp_util_avg</th>\n <th>comm</th>\n <th>cpu</th>\n <th>pid</th>\n <th>uclamp_max</th>\n <th>uclamp_min</th>\n <th>util_avg</th>\n </tr>\n <tr>\n <th>Time</th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0.871750</th>\n <td>rt-app</td>\n <td>2</td>\n <td>1933</td>\n <td>400</td>\n <td>rt-app</td>\n <td>2</td>\n <td>1939</td>\n <td>600</td>\n <td>400</td>\n <td>241</td>\n </tr>\n <tr>\n <th>0.871780</th>\n <td>rt-app</td>\n <td>2</td>\n <td>1933</td>\n <td>400</td>\n <td>rt-app</td>\n <td>2</td>\n <td>1939</td>\n <td>600</td>\n <td>400</td>\n <td>240</td>\n </tr>\n <tr>\n <th>0.874512</th>\n <td>task_r10_20-80</td>\n <td>2</td>\n <td>1939</td>\n <td>400</td>\n <td>task_r10_20-80</td>\n <td>2</td>\n <td>1939</td>\n <td>600</td>\n <td>400</td>\n <td>283</td>\n </tr>\n <tr>\n <th>0.875347</th>\n <td>task_r10_20-80</td>\n <td>2</td>\n <td>1939</td>\n <td>296</td>\n <td>task_r10_20-80</td>\n <td>2</td>\n <td>1939</td>\n <td>1024</td>\n <td>0</td>\n <td>296</td>\n </tr>\n <tr>\n <th>0.887937</th>\n <td>&lt;idle&gt;</td>\n <td>2</td>\n <td>0</td>\n <td>400</td>\n <td>task_r10_20-80</td>\n <td>2</td>\n <td>1939</td>\n <td>600</td>\n <td>400</td>\n <td>228</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "lines = [\n ('uclamp_min', 'y', '-'),\n ('uclamp_max', 'r', '-'),\n ('util_avg', 'b', ':'),\n ('clamp_util_avg', 'b', '-'),\n]\ncolumns = [l for l,_,_ in lines]\ncolors = [c for _,c,_ in lines]\nstyle = [s for _,_,s in lines]\n\nupdate_load_df[1.8:2.5][columns].plot(\n figsize=(16,8), drawstyle='steps-post',\n color=colors, style=style);",
"execution_count": 78,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nipxQKBP9gWzJxpwwt5xcxfd6gRQ/5moxggTwF/EsMeJZ/rrssst02WWXZbsaviNxRU4olKXVgWwp\nLbU2m6+ocL5wh53YhT2ii4JUV1sXosJhaccOKbJdnSNOegu8XiDF7UUzJ41bRpAA/iKeJUY8Q64j\ncUVOyPRm1kChWb7cakiFw9Lpp3tztTz2gtOTT0pHjox8rbxcuvRS5+U56S1w2ytiN//N7UUzJ7GK\nESSAv4hniRHPkOtIXJETvB6iA2Ckpibr5qXYBk1NjXVLZ1GQbDSQ3F40c9IwZAQJ4C/iWWLEM+Q6\nElcAgC+8nk/lpIHk9QIpbi+aOWmMMoIEyD3Es8SIZ8gkElfkBFanA3JP7BwuL7ak8KOB5PW2DX4M\n/wOQfcSzxIhnzuzbt0+NjY3asWNHtquS00hcAQC+8LoR5aSB5LYRZbdAituLZm63mwCQG4hnAXbz\nzd5t2BtVVyfddZe3ZSJtRdmuAOBEVxdX9YBcE50HFv/YK6GQtfBKRYW1FUNDg3TwoLuejHDY2yGA\npaX2Ddy6OkaRALnGz3gWClnxi3iWW/bt26dzzjln6Hlzc7NuvfVW7d69W0uWLNG5556r888/X3v2\n7Bn1ufe85z06//zzdf755+u3v/2tJKmtrU2LFy/WlVdeqTPPPFNr167VQw89pIULF2r+/PlD5axc\nuVI33XST6uvrVVNTo9bW1jHruHHjRn3oQx/S+9//fs2cOVPf/OY39fWvf13nnXee3v3ud+v111+X\nJN17771asGCBzj33XC1btky9kV+8K6+8Ups2bZIkbdiwQddff713/4ApoMcVOYE5FEBu86K3Ir5x\n1NJiNdImTRp+bd486dxznZdpN4fL7QUzr5NzAMHjdTxrabE6DOPLJZ45FLCe0euvv15r167VVVdd\npb6+Pg0ODurgwYND75922mn6+c9/rokTJ+qll17Sddddp/b2dknS9u3btWvXLk2ZMkVnnnmmPvnJ\nT2rr1q26++679Y1vfEN3RX7Wffv2aevWrdqzZ48uueQS7d69WxMnTkxYnx07dmjbtm3q6+vTnDlz\ndMcdd2jbtm363Oc+p02bNunmm2/W1VdfrRtvvFGS9KUvfUn333+/PvOZzygUCumiiy7SrFmztH79\nej399NM+/+slR+KKnMCqdUDuiR255deQswsuSG9lT7vY4sdFM0aPALnHz3gWLfvAgfTKIZ5l37Fj\n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\nrgEAAIAl0us1rq21e6rq1Un+NsmDk7y3tfa1PmsAAABgufS9OFNaa59I8om+jwsAAMBy6nuqMAAA\nABwWwRUAAIBBE1wBAAAYNMEVAACAQRNcAQAAGDTBFQAAgEETXAEAABg0wRUAAIBBE1wBAAAYNMEV\nAACAQRNcAQAAGDTBFQAAgEETXAEAABg0wRUAAIBBq9baomu4X1X1/ST7Fl0HC/XoJHctuggWRv9v\nbPp/Y9P/OAc2Nv2/cTy+tfaYQ+10VB+VTGFfa23Hootgcapqt3Ng49L/G5v+39j0P86BjU3/s5ap\nwgAAAAya4AoAAMCgDT24XrnoAlg458DGpv83Nv2/sel/nAMbm/7nPga9OBMAAAAMfcQVAACADU5w\nBQAAYNAWHlyr6r1VdWdV/dP9PP+Iqvp4VX2lqr5WVef3XSPzNcE58HNV9ZGq+mpVfbmqfrnvGpmf\nqjq+qv6+qm7ufsdfe5B9qqr+rKpu7c6DX11ErczehP1/YlX9Y1X9sKouXkSdzMeE/f+S7vf+pqr6\nQlU9eRG1Mh8TngPndOfAjVW1u6qetYhamb1J+n9s36dW1T1V9YI+a2Q4Fn6Na1X9WpKVJO9vrf1U\nIKmqNyR5RGvtkqp6TJJ9SR7bWvvfnktlTiY4B/40yUpr7U+q6sQk72ytndZ3ncxHVR2T5JjW2g1V\n9bAke5I8r7V289g+ZyZ5TZIzk5ya5PLW2qkLKZiZmrD/fyHJ45M8L8ndrbXLFlMtszZh/z8jyS2t\ntbur6owkb/L7v35MeA5sSvLfrbVWVb+S5EOttRMXVDIzNEn/d/s9OMmnkvwgyXtbax/uv1oWbeEj\nrq21zyX5rwfaJcnDqqqSbOr2vaeP2ujHBOfASUn+rtv360m2VNXRfdTG/LXW7mit3dB9//0ktyQ5\nds1u52T0wUZrrX0xySO7P3YsuUn6v7V2Z2vt+iT/t4ASmaMJ+/8LrbW7u80vJjmu3yqZpwnPgZV2\n70jLz2b03pB1YML3AMnow+trktzZY3kMzMKD6wTekeRJSf4tyU1JXtta+/FiS6JnX0nym0lSVadk\nNPLijcs6VFVbkpyc5Etrnjo2ybfHtm/Pwf+wscQeoP/ZACbs/1ck+Zs+6qF/D3QOVNXzq+rrSf46\nye/2Wxl9uL/+r6pjkzw/ybv6r4ohWYbg+htJbkzyuCTbk7yjqh6+2JLo2aUZjbDdmNEnbnuT/Gix\nJTFr3VSwa5Jc1Fr73qLroV/6f2ObpP+r6jkZBddL+qyNfhzqHGitfaSbHvy8JG/uuz7m6xD9//Yk\nlxi44qhFFzCB85Nc2k0RubWqbktyYpIvL7Ys+tK9gJ2fjBbpSXJbkm8stChmqqoektEfrA+01q49\nyC77kxw/tn1c9xjrwAT9zzo2Sf931zW+O8kZrbX/7LM+5u9wXgNaa5+rqidU1aNba3f1UyHzNEH/\n70jywdFbwDw6yZlVdU9r7a96LJMBWIYR128lOS1Juusat0Vo2VCq6pFV9dBu85VJPmdEZv3oPox4\nT0aLr7z1fnb7WJKXdasLPy3Jd1trd/RWJHMzYf+zTk3S/1W1Ocm1Sc5rrf1zn/UxfxOeA7/U7Zdu\nVfmfSeIDjHVgkv5vrZ3QWtvSWtuS5MNJfl9o3ZiGsKrwXyTZmdEnKN9J8sdJHpIkrbU/r6rHJbkq\nyTFJKqPR16sXUixzMcE58PQk78toMYavJXnF2EIdLLnutgb/kNE17KvTgN6QZHPyk3OgMrre/fQk\nB5Kc31rbvYBymbEJ+/+xSXYneXi3z0qSk3yAtfwm7P93Jzk3yTe75+9pre3ou1bmY8Jz4JIkL8to\ngbb/SfJHrbXPL6BcZmyS/l+z/1VJdllVeGNaeHAFAACAB7IMU4UBAADYwARXAAAABk1wBQAAYNAE\nVwAAAAZNcAUAAGDQjlp0AQCwXlXVo5J8ptt8bJIfJfmPbvtAa+0ZCykMAJaM2+EAQA+q6k1JVlpr\nly26FgBYNqYKA8ACVNVK93VnVV1XVR+tqm9U1aVV9ZKq+nJV3VRVv9jt95iquqaqru/+PXOx/wMA\n6I/gCgCL9+Qkv5fkSUnOS7K1tXZKkncneU23z+VJ3tZae2qSc7vnAGBDcI0rACze9a21O5Kkqv4l\nySe7x29K8pzu+19PclJVrf7Mw6tqU2ttpddKAWABBFcAWLwfjn3/47HtH+fev9UPSvK01toP+iwM\nAIbAVGEAWA6fzL3ThlNV2xdYCwD0SnAFgOXwh0l2VNVXq+rmjK6JBYANwe1wAAAAGDQjrgAAAAya\n4AoAAMCgCa4AAAAMmuAKAADAoAmuAAAADJrgCgAAwKAJrgAAAAza/wPTeiIFUw0ZNwAAAABJRU5E\nrkJggg==\n",
"text/plain": "<matplotlib.figure.Figure at 0x7f153b3c8190>"
},
"metadata": {}
}
]
},
{
"metadata": {
"collapsed": true
},
"cell_type": "markdown",
"source": "# Two Tasks"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Workload Configuration"
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "rtapp_n = RTA(target, 'test', calibration=te.calibration())\nrtapp_n.conf(\n kind='profile',\n params={\n 'normal': Periodic(\n duration_s=3,\n period_ms=16,\n duty_cycle_pct=2,\n# cpus=[3],\n ).get(),\n },\n loadref='LITTLE'\n);\nrtapp_b = RTA(target, 'test', calibration=te.calibration())\nrtapp_b.conf(\n kind='profile',\n params={\n 'boosted': Periodic(\n duration_s=1,\n period_ms=16,\n duty_cycle_pct=6,\n# cpus=[4],\n ).get(),\n },\n loadref='LITTLE'\n);\nrtapp_c = RTA(target, 'test', calibration=te.calibration())\nrtapp_c.conf(\n kind='profile',\n params={\n 'capped': Periodic(\n duration_s=1,\n period_ms=16,\n duty_cycle_pct=40,\n# cpus=[5],\n delay_s=2,\n ).get(),\n },\n loadref='LITTLE'\n);",
"execution_count": 120,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": "09:07:14 INFO : Setup new workload test\n09:07:14 INFO : Workload duration defined by longest task\n09:07:14 INFO : Default policy: SCHED_OTHER\n09:07:14 INFO : ------------------------\n09:07:14 INFO : task [normal], sched: using default policy\n09:07:14 INFO : | calibration CPU: 0\n09:07:14 INFO : | loops count: 1\n09:07:14 INFO : + phase_000001: duration 3.000000 [s] (187 loops)\n09:07:14 INFO : | period 16000 [us], duty_cycle 2 %\n09:07:14 INFO : | run_time 320 [us], sleep_time 15680 [us]\n09:07:15 INFO : Setup new workload test\n09:07:15 INFO : Workload duration defined by longest task\n09:07:15 INFO : Default policy: SCHED_OTHER\n09:07:15 INFO : ------------------------\n09:07:15 INFO : task [boosted], sched: using default policy\n09:07:15 INFO : | calibration CPU: 0\n09:07:15 INFO : | loops count: 1\n09:07:15 INFO : + phase_000001: duration 1.000000 [s] (62 loops)\n09:07:15 INFO : | period 16000 [us], duty_cycle 6 %\n09:07:15 INFO : | run_time 960 [us], sleep_time 15040 [us]\n09:07:15 INFO : Setup new workload test\n09:07:16 INFO : Workload duration defined by longest task\n09:07:16 INFO : Default policy: SCHED_OTHER\n09:07:16 INFO : ------------------------\n09:07:16 INFO : task [capped], sched: using default policy\n09:07:16 INFO : | start delay: 2.000000 [s]\n09:07:16 INFO : | calibration CPU: 0\n09:07:16 INFO : | loops count: 1\n09:07:16 INFO : + phase_000001: duration 1.000000 [s] (62 loops)\n09:07:16 INFO : | period 16000 [us], duty_cycle 40 %\n09:07:16 INFO : | run_time 6400 [us], sleep_time 9600 [us]\n"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## CGroups Setup"
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "cpu_ctr = target.cgroups.controller('cpu')\n\n# Boosted group\nuclamp_cg = cpu_ctr.cgroup('/uc_boosted')\nuclamp_cg.set(util_min=600)\nuclamp_cg.get()",
"execution_count": 121,
"outputs": [
{
"execution_count": 121,
"output_type": "execute_result",
"data": {
"text/plain": "{'shares': '1024', 'util_max': '1024', 'util_min': '600'}"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "# Clamped group\nuclamp_cg = cpu_ctr.cgroup('/uc_capped')\nuclamp_cg.set(util_max=200)\nuclamp_cg.get()",
"execution_count": 122,
"outputs": [
{
"execution_count": 122,
"output_type": "execute_result",
"data": {
"text/plain": "{'shares': '1024', 'util_max': '200', 'util_min': '0'}"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "# Let's configure CPUSets in case they are co-mounted with the CPU controller\ncpuset_ctr = target.cgroups.controller('cpuset')\nuclamp_cg = cpuset_ctr.cgroup('/uc_boosted')\nuclamp_cg.set(cpus=[0,1,2,3,4,5], mems=0)\nuclamp_cg.get()",
"execution_count": 123,
"outputs": [
{
"execution_count": 123,
"output_type": "execute_result",
"data": {
"text/plain": "{'cpu_exclusive': '0',\n 'cpus': '0-5',\n 'effective_cpus': '0-5',\n 'effective_mems': '0',\n 'mem_exclusive': '0',\n 'mem_hardwall': '0',\n 'memory_migrate': '0',\n 'memory_pressure': '0',\n 'memory_spread_page': '0',\n 'memory_spread_slab': '0',\n 'mems': '0',\n 'sched_load_balance': '1',\n 'sched_relax_domain_level': '-1'}"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "uclamp_cg = cpuset_ctr.cgroup('/uc_capped')\nuclamp_cg.set(cpus=[0,1,2,3,4,5], mems=0)\nuclamp_cg.get()",
"execution_count": 124,
"outputs": [
{
"execution_count": 124,
"output_type": "execute_result",
"data": {
"text/plain": "{'cpu_exclusive': '0',\n 'cpus': '0-5',\n 'effective_cpus': '0-5',\n 'effective_mems': '0',\n 'mem_exclusive': '0',\n 'mem_hardwall': '0',\n 'memory_migrate': '0',\n 'memory_pressure': '0',\n 'memory_spread_page': '0',\n 'memory_spread_slab': '0',\n 'mems': '0',\n 'sched_load_balance': '1',\n 'sched_relax_domain_level': '-1'}"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Workload Execution"
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "logging.info('#### Setup FTrace')\nte.ftrace.start()\n\nlogging.info('#### Start RTApp execution')\n\nrtapp_n.run(out_dir=te.res_dir, cgroup='/', cpus=[3], background=True)\nsleep(0.1)\nrtapp_b.run(out_dir=te.res_dir, cgroup='/uc_boosted', cpus=[4], background=True)\nsleep(0.1)\nrtapp_c.run(out_dir=te.res_dir, cgroup='/uc_capped', cpus=[5], background=True)\nsleep(3)\n\nlogging.info('#### Stop FTrace')\nte.ftrace.stop()\n\ntrace_file = os.path.join(te.res_dir, 'trace.dat')\nlogging.info('#### Save FTrace: %s', trace_file)\nte.ftrace.get_trace(trace_file)\n\nlogging.info('#### Save platform description: %s/platform.json', te.res_dir)\n(plt, plt_file) = te.platform_dump(te.res_dir)",
"execution_count": 134,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": "09:08:06 INFO : #### Setup FTrace\n09:08:10 INFO : #### Start RTApp execution\n09:08:14 INFO : #### Stop FTrace\n09:08:14 INFO : #### Save FTrace: /data/Code/lisa/results/uclamp_validation/trace.dat\n09:08:20 INFO : #### Save platform description: /data/Code/lisa/results/uclamp_validation/platform.json\n"
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "# Base folder where tests folder are located\nres_dir = te.res_dir\nlogging.info('Content of the output folder %s', res_dir)\n!tree {res_dir}",
"execution_count": 135,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": "09:08:20 INFO : Content of the output folder /data/Code/lisa/results/uclamp_validation\n"
},
{
"output_type": "stream",
"name": "stdout",
"text": "\u001b[01;34m/data/Code/lisa/results/uclamp_validation\u001b[00m\r\n├── platform.json\r\n├── trace.dat\r\n├── trace.raw.txt\r\n└── trace.txt\r\n\r\n0 directories, 4 files\r\n"
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "with open(os.path.join(res_dir, 'platform.json'), 'r') as fh:\n platform = json.load(fh)\n#print json.dumps(platform, indent=4)\nlogging.info('LITTLE cluster max capacity: %d',\n platform['nrg_model']['little']['cpu']['cap_max'])",
"execution_count": 136,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": "09:08:20 INFO : LITTLE cluster max capacity: 447\n"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Trace Analysis"
},
{
"metadata": {
"collapsed": true,
"trusted": false
},
"cell_type": "code",
"source": "trace_file = '/data/Code/lisa/results/uclamp_validation/trace.dat'\nplatf_file = '/data/Code/lisa/results/uclamp_validation/platform.json'\nwith open(platf_file, 'r') as fh:\n platform = json.load(fh)",
"execution_count": 137,
"outputs": []
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "events = [\"sched_switch\", \"cpu_frequency\", \"next_freq\", \"update_task\", \"update_load\"]\ntrace = Trace(data_dir=trace_file, platform=platform, events=events)\ntrace.available_events",
"execution_count": 138,
"outputs": [
{
"execution_count": 138,
"output_type": "execute_result",
"data": {
"text/plain": "['cpu_frequency_devlib',\n 'next_freq',\n 'cpu_frequency',\n 'update_task',\n 'sched_switch',\n 'update_load']"
},
"metadata": {}
}
]
},
{
"metadata": {
"collapsed": true,
"trusted": false
},
"cell_type": "code",
"source": "pid_normal = trace.getTaskByName('normal')\npid_boosted = trace.getTaskByName('boosted')\npid_clamped = trace.getTaskByName('capped')",
"execution_count": 139,
"outputs": []
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "next_freq_df = trace.data_frame.trace_event('next_freq')\nnext_freq_df = next_freq_df[next_freq_df.cpu == 5]\nnext_freq_df.head()",
"execution_count": 140,
"outputs": [
{
"execution_count": 140,
"output_type": "execute_result",
"data": {
"text/plain": " __comm __cpu __pid cpu cpu_cmax cpu_cmin srd_cmax srd_cmin \\\nTime \n0.310612 sh 5 1686 5 1024 0 1024 0 \n0.314701 <idle> 5 0 5 1024 0 1024 0 \n0.314738 <idle> 5 0 5 1024 0 1024 0 \n0.322713 <idle> 5 0 5 1024 0 1024 0 \n0.330710 <idle> 5 0 5 1024 0 1024 0 \n\n util util_uclamp \nTime \n0.310612 83 83 \n0.314701 84 84 \n0.314738 84 84 \n0.322713 73 73 \n0.330710 63 63 ",
"text/html": "<div>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>__comm</th>\n <th>__cpu</th>\n <th>__pid</th>\n <th>cpu</th>\n <th>cpu_cmax</th>\n <th>cpu_cmin</th>\n <th>srd_cmax</th>\n <th>srd_cmin</th>\n <th>util</th>\n <th>util_uclamp</th>\n </tr>\n <tr>\n <th>Time</th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0.310612</th>\n <td>sh</td>\n <td>5</td>\n <td>1686</td>\n <td>5</td>\n <td>1024</td>\n <td>0</td>\n <td>1024</td>\n <td>0</td>\n <td>83</td>\n <td>83</td>\n </tr>\n <tr>\n <th>0.314701</th>\n <td>&lt;idle&gt;</td>\n <td>5</td>\n <td>0</td>\n <td>5</td>\n <td>1024</td>\n <td>0</td>\n <td>1024</td>\n <td>0</td>\n <td>84</td>\n <td>84</td>\n </tr>\n <tr>\n <th>0.314738</th>\n <td>&lt;idle&gt;</td>\n <td>5</td>\n <td>0</td>\n <td>5</td>\n <td>1024</td>\n <td>0</td>\n <td>1024</td>\n <td>0</td>\n <td>84</td>\n <td>84</td>\n </tr>\n <tr>\n <th>0.322713</th>\n <td>&lt;idle&gt;</td>\n <td>5</td>\n <td>0</td>\n <td>5</td>\n <td>1024</td>\n <td>0</td>\n <td>1024</td>\n <td>0</td>\n <td>73</td>\n <td>73</td>\n </tr>\n <tr>\n <th>0.330710</th>\n <td>&lt;idle&gt;</td>\n <td>5</td>\n <td>0</td>\n <td>5</td>\n <td>1024</td>\n <td>0</td>\n <td>1024</td>\n <td>0</td>\n <td>63</td>\n <td>63</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "next_freq_df.describe()",
"execution_count": 141,
"outputs": [
{
"execution_count": 141,
"output_type": "execute_result",
"data": {
"text/plain": " __cpu __pid cpu cpu_cmax cpu_cmin srd_cmax \\\ncount 136.0 136.000000 136.0 136.000000 136.0 136.000000 \nmean 5.0 1531.183824 5.0 739.235294 0.0 957.352941 \nstd 0.0 1194.464518 0.0 393.309834 0.0 225.497755 \nmin 5.0 0.000000 5.0 200.000000 0.0 200.000000 \n25% 5.0 0.000000 5.0 200.000000 0.0 1024.000000 \n50% 5.0 2491.000000 5.0 1024.000000 0.0 1024.000000 \n75% 5.0 2515.000000 5.0 1024.000000 0.0 1024.000000 \nmax 5.0 2518.000000 5.0 1024.000000 0.0 1024.000000 \n\n srd_cmin util util_uclamp \ncount 136.000000 136.000000 136.000000 \nmean 198.529412 551.220588 514.470588 \nstd 283.362167 288.694397 300.647152 \nmin 0.000000 0.000000 0.000000 \n25% 0.000000 532.500000 200.000000 \n50% 0.000000 647.000000 645.000000 \n75% 600.000000 781.500000 777.750000 \nmax 600.000000 825.000000 825.000000 ",
"text/html": "<div>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>__cpu</th>\n <th>__pid</th>\n <th>cpu</th>\n <th>cpu_cmax</th>\n <th>cpu_cmin</th>\n <th>srd_cmax</th>\n <th>srd_cmin</th>\n <th>util</th>\n <th>util_uclamp</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>count</th>\n <td>136.0</td>\n <td>136.000000</td>\n <td>136.0</td>\n <td>136.000000</td>\n <td>136.0</td>\n <td>136.000000</td>\n <td>136.000000</td>\n <td>136.000000</td>\n <td>136.000000</td>\n </tr>\n <tr>\n <th>mean</th>\n <td>5.0</td>\n <td>1531.183824</td>\n <td>5.0</td>\n <td>739.235294</td>\n <td>0.0</td>\n <td>957.352941</td>\n <td>198.529412</td>\n <td>551.220588</td>\n <td>514.470588</td>\n </tr>\n <tr>\n <th>std</th>\n <td>0.0</td>\n <td>1194.464518</td>\n <td>0.0</td>\n <td>393.309834</td>\n <td>0.0</td>\n <td>225.497755</td>\n <td>283.362167</td>\n <td>288.694397</td>\n <td>300.647152</td>\n </tr>\n <tr>\n <th>min</th>\n <td>5.0</td>\n <td>0.000000</td>\n <td>5.0</td>\n <td>200.000000</td>\n <td>0.0</td>\n <td>200.000000</td>\n <td>0.000000</td>\n <td>0.000000</td>\n <td>0.000000</td>\n </tr>\n <tr>\n <th>25%</th>\n <td>5.0</td>\n <td>0.000000</td>\n <td>5.0</td>\n <td>200.000000</td>\n <td>0.0</td>\n <td>1024.000000</td>\n <td>0.000000</td>\n <td>532.500000</td>\n <td>200.000000</td>\n </tr>\n <tr>\n <th>50%</th>\n <td>5.0</td>\n <td>2491.000000</td>\n <td>5.0</td>\n <td>1024.000000</td>\n <td>0.0</td>\n <td>1024.000000</td>\n <td>0.000000</td>\n <td>647.000000</td>\n <td>645.000000</td>\n </tr>\n <tr>\n <th>75%</th>\n <td>5.0</td>\n <td>2515.000000</td>\n <td>5.0</td>\n <td>1024.000000</td>\n <td>0.0</td>\n <td>1024.000000</td>\n <td>600.000000</td>\n <td>781.500000</td>\n <td>777.750000</td>\n </tr>\n <tr>\n <th>max</th>\n <td>5.0</td>\n <td>2518.000000</td>\n <td>5.0</td>\n <td>1024.000000</td>\n <td>0.0</td>\n <td>1024.000000</td>\n <td>600.000000</td>\n <td>825.000000</td>\n <td>825.000000</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "lines = [\n ('cpu_cmax', 'r', '--'),\n ('srd_cmax', 'r', '-'),\n ('cpu_cmin', 'y', '--'),\n ('srd_cmin', 'y', '-'),\n ('util', 'b', ':'),\n ('util_uclamp', 'b', '--'),\n]\ncolumns = [l for l,_,_ in lines]\ncolors = [c for _,c,_ in lines]\nstyle = [s for _,_,s in lines]\n\nnext_freq_df[columns].plot(\n figsize=(16,8), drawstyle='steps-post',\n color=colors, style=style);",
"execution_count": 142,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA64AAAHjCAYAAAAjX0LpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xt8VPW97//XysWEEExKuCgS5FKDVAKRIqBViPXeHezW\nWvwVoXLcEqEHbT3E4u24/bWc/bMesLa1DzTbbakK+6it3ZZ46bZi9NiCiBi2N4wkxgZRgaEJhJAA\nyfz+WLMmCQnJ+q6ZzKyZvJ+PB49ZM7NukxmS+azv5/v5WMFgEBERERERERG/Son3CYiIiIiIiIj0\nRoGriIiIiIiI+JoCVxEREREREfE1Ba4iIiIiIiLiawpcRURERERExNcUuIqIiIiIiIivKXAVERER\nERERX1PgKiIiIiIiIr6mwFVERERERER8LS3eJ9CbYcOGBceOHRvv0xAREREREZF+8Pbbb+8LBoPD\n+1rP14Hr2LFj2bp1a7xPQ0RERERERPqBZVmfullPqcIiIiIiIiLiawpcRURERERExNcUuIqIiIiI\niIiv+XqOq4iIiBdHjx5l165dtLS0xPtUBozMzExGjx5Nenp6vE9FRESSkAJXERFJOrt27WLIkCGM\nHTsWy7LifTpJLxgMEggE2LVrF+PGjYv36YiISBJSqrCIiCSdlpYW8vLyFLTGiGVZ5OXlaYRbRET6\njQJXERFJSgpaY0s/bxER6U8KXEVERERERMTXFLiKiIiIiIiIrylwFREREREREV9TVWEREUl+xcXd\nHyspgbIyb89XVkbv3ERERKRPGnEVERHpB48//jhTpkxh6tSpLFy4kEWLFrFkyRKmT59OQUEBFRUV\nAKxdu5Zly5aFtyspKaGyl8D4pZdeYtq0aUydOpWLLroIgHvvvZfrr7+eCy64gNNPP51nn32WH//4\nxxQWFnL55Zdz9OhRAH7yk59wzjnnMHnyZEpLSwkGgxw7doxzzjknfMw77riDu+66q39+KCIiIh5p\nxFVERJJfXyOkkT5/nPfff5+VK1fy17/+lWHDhrF//37+x//4H9TV1bFlyxZqamq48MIL2blzp9F+\n9+7dy+LFi3n99dcZN24c+/fvDz9XU1PDq6++ygcffMC5557L73//e+6//36uuuoqnn/+ef7xH/+R\nZcuWcc899wCwcOFCKioqmDt3LmvXruWaa67hV7/6FS+99BJvvvmm0XmJiIj0N424ioiIRNnGjRv5\n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\nWwpcRZKR+rja1MdV4igtLY329vbw/ZaWlrjt7+c//zkjR45k+/bttLe3dwluMzIywsspKSnh+ykp\nKRw7diz8nHVcUa/j74uIiPQnzXEVSRaR9nGtqPBWzVh9XGPPeb+8VOMNBs16uTrVkquqBlRKbzSM\nHDmSPXv2EAgEaG1tDc8LHTJkCAcPHozq/kaPHs1//Md/ANDa2kpzc3OXbRsbGzn11FNJSUnhiSee\noK2tzfj4zzzzDO3t7dTU1FBbW8vEiRON9yEiEjNFRcmX/TTAKXCVbhYsgAkTOgZ1Zsywp9Ll5nYU\nJpk1y77dsCGOJyp989LH1UtKqEnFmlhyCiY56bvJJj/f14Wgyo9cT27jp+Tm2r9Hiovt3y3dfr80\nfsqC5ofjeq79IT09nXvuuYcZM2ZwySWXcOaZZwIdhY6c4kyR7g/giSee4Je//CVTpkzhvPPO44sv\nvuiy7Q9+8AN++9vfMnXqVHbs2MHgwYONX8+YMWOYMWMGV1xxBQ8//LDmt4qISEwpVVi62bQJPvnE\n3bp33gmrV/t7/ldCisaczFj2ca2tNet56pXTx9Xt64okPdhrWrIfA/jOnPROt6OuEaQll570W+5r\nuZX95PS6XiM5VBz7lufj+Nktt9zCLbfc0u3x73znO+Hlyk6/QOvq6jzt74wzzmDjxo3dHn/vvffC\nz//Xf/1X+PGf/exnABQXF1Pc6TPb+VyOf+7iiy/m4YeT7wKDiCQp9XBNOgpcpRtnEMeJDbZsOfG6\nhYW+qr+SPNTHtWd+Tt91qI9rh6IialnU65WtLVugONd5HUrpEhGRKNEX1KSjwFW6OW5qVK8S4WLW\nggX2d+/8fHs6YCBgn/eZZ8LmzfY6TleRggLIyrKfP/dcePLJ+J23sRP1cdVwuDdeCybF66KDz5SX\nw02vVTJzyPtsjvfJJJhAIMBFF13U7fFXXnmFPC9tiaJg7dq1cTmuiIiIQ4GrdNOpS0KfsrL67zyi\nJSvLjkFMpgK6TZXuNxG2VFlVUskDm/aRuqmdU2d0BOOBgB28L10Kc+fCTTc5h6lk/nwoXV8c1Zcx\noKiPaxenngonWwf5++FBfa7bcvCo17PqVTAYTMjKt3l5eVQl4JzsoEnRLxEREUMKXCUiBQXxPoO+\nlZfb/3rT0ND1fkJ2G+mUbrpmDXx+ZBgAR/9mjy73xvmOXBrJ8dXH1aY+roB9YeTslO0QBBjf67qZ\n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\nHi8L4XV9q6BwjaGry01mpbl9drlmQrWqpnGVbx2F5xLscb399nt0/vw/U19f4/Zfty+all6tbJnl\nvKpdvrsyq9s/9ZXqGybFXO9dbY5r1WZmkqvPcW2WohzXarVdWt39SLr6turvRpJu/8LfSWpMjisA\nAPXWkwkmHAqvMaKah/q+8g8FFK4tKng936jVndUst/D9P4x77vl1LVt2vX78Y/c23ZNPNv4di9zK\nM9JPK4857nzrM26p8ApyXIuQ41p8P5KfOa6L+VUEAKiv7Qp+fxVeY0RNlqRlAgUUrrEcPeqOaW6f\nfVd+m1qj6pqtW92xkgm4tCzR+OM/drv3r7lmVOfPN3ZpbM+2rDQYMzuzFjFyXN31dzduTGFNzHF1\nbwTE6L7W7BzXRptZdl594VrxspRL26r/2gAAzGPshV+SJHWWuc7nWEYUo3CNIVhm0Obxa61bb3Wv\nN3t6pPvua/79j45Wfq3ve1x37NipSy65fObP73vfow3f4zoyImni3dqevb+i69/65mPS2VfIca0n\nclxrRo4rACApW8/cI6m4f0LUDiqfQxFQjMI1ht27C0Whrx57TJqcdMfZhobcbe+KMYFSqWr2/x5v\nbA1Ys+eey+nii5fr3nvvkBTscf1l3X77k42709FR6fTpii//h59dJZ0P7Yndv7+w77QSoWWuvqq1\nYVLDBTOTH2jCfb0zgQ321c4iSxr56dWSyheuPWcfyH+W4sYBAADvBb+qwysOo87BTxSuMfT2utbZ\nY2P+ts4+fnzuuuVP/sQdP/GJxo7hscek5culG2+Udu2ShoelzZvdXoJgWcboqPT2t7tZ4c5yazkS\nsmnTgNrb18z8uRl7XKdevVSylS8DXfGGH0vnzkkryXGNRI5rzchxBQCkSVSfhWC7H9KJwjWGLVvc\nCsI1a8pfm5SxMbd3dMmS0tuyWffR19e4+7/lFvefQ1T3ttleftn9e/pauP7ar41odHSNfvVX9+u3\nfmu4KXtc2y86K5kzFV///ItX5vdk5k+Q4+qQ41p8PxI5rgCAlhX1urSS16rwA4VrDHv3uqPP3XA3\nbJDGx6VVq0pva8bEWF9faWHc2yudanzcZ8Ncc82ofvmXxyRJr7xysqH3deLsG6RXK2/Wc+r0613h\neoAc13ogxzWEHFcAQAr1te+WJIUTIKNyXOkqnB4UrjG0t7s9oj7/oAedeqOeoKje9dc/puuvdxuG\n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\nAABJRU5ErkJggg==\n",
"text/plain": "<matplotlib.figure.Figure at 0x7fd6c45e94d0>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# Performance Overheads"
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "kernel_name = 'uclamp'\n# kernel_name = 'baseline'\nkernel_sha1 = target.kernel_version.sha1\ntest_name = \"{}:{}\".format(kernel_name, kernel_sha1)\n\niterations = 10\n\nhbench = PerfMessaging(target, test_name)\nhbench.conf(group=2, loop=5000, thread=False, pipe=True)",
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": "02:37:42 INFO : Setup new workload uclamp:458e595054b2\n"
},
{
"execution_count": 6,
"output_type": "execute_result",
"data": {
"text/plain": "'uclamp:458e595054b2_00'"
},
"metadata": {}
}
]
},
{
"metadata": {
"scrolled": false,
"trusted": false
},
"cell_type": "code",
"source": "logging.info('#### Switch to performance governor')\ntarget.cpufreq.set_all_governors('performance');\nlogging.info(\"CPUFreq governors:\\n%s\", target.cpufreq.get_all_governors())\n\nresults = []\nlogging.info('#### Running %d iterations for %s', iterations, test_name)\nfor i in range(iterations):\n hbench.run(out_dir=te.res_dir)\n completion_time = float(hbench.getCompletionTime())\n logging.info(\"%2d/%d completion time for [%s]: %.3f\", i+1, iterations, test_name, completion_time)\n results.append((kernel_name, kernel_sha1, i+1, completion_time))\n\ntarget.cpufreq.set_all_governors('schedutil');",
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": "02:37:42 INFO : #### Switch to performance governor\n02:37:43 INFO : CPUFreq governors:\n{'1': 'performance', '0': 'performance', '3': 'performance', '2': 'performance', '5': 'performance', '4': 'performance'}\n02:37:43 INFO : #### Running 10 iterations for uclamp:458e595054b2\n02:37:43 INFO : Workload execution START:\n02:37:43 INFO : /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 2 --loop 5000\n02:37:49 INFO : PerfBench - Completion time: 6.016000, Performance 0.166223\n02:37:49 INFO : 1/10 completion time for [uclamp:458e595054b2]: 6.016\n02:37:49 INFO : Workload execution START:\n02:37:49 INFO : /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 2 --loop 5000\n02:37:56 INFO : PerfBench - Completion time: 5.899000, Performance 0.169520\n02:37:56 INFO : 2/10 completion time for [uclamp:458e595054b2]: 5.899\n02:37:56 INFO : Workload execution START:\n02:37:56 INFO : /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 2 --loop 5000\n02:38:01 INFO : PerfBench - Completion time: 5.591000, Performance 0.178859\n02:38:01 INFO : 3/10 completion time for [uclamp:458e595054b2]: 5.591\n02:38:01 INFO : Workload execution START:\n02:38:01 INFO : /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 2 --loop 5000\n02:38:08 INFO : PerfBench - Completion time: 5.909000, Performance 0.169233\n02:38:08 INFO : 4/10 completion time for [uclamp:458e595054b2]: 5.909\n02:38:08 INFO : Workload execution START:\n02:38:08 INFO : /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 2 --loop 5000\n02:38:14 INFO : PerfBench - Completion time: 5.593000, Performance 0.178795\n02:38:14 INFO : 5/10 completion time for [uclamp:458e595054b2]: 5.593\n02:38:14 INFO : Workload execution START:\n02:38:14 INFO : /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 2 --loop 5000\n02:38:20 INFO : PerfBench - Completion time: 5.718000, Performance 0.174886\n02:38:20 INFO : 6/10 completion time for [uclamp:458e595054b2]: 5.718\n02:38:20 INFO : Workload execution START:\n02:38:20 INFO : /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 2 --loop 5000\n02:38:26 INFO : PerfBench - Completion time: 5.732000, Performance 0.174459\n02:38:26 INFO : 7/10 completion time for [uclamp:458e595054b2]: 5.732\n02:38:26 INFO : Workload execution START:\n02:38:26 INFO : /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 2 --loop 5000\n02:38:32 INFO : PerfBench - Completion time: 5.864000, Performance 0.170532\n02:38:32 INFO : 8/10 completion time for [uclamp:458e595054b2]: 5.864\n02:38:32 INFO : Workload execution START:\n02:38:32 INFO : /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 2 --loop 5000\n02:38:38 INFO : PerfBench - Completion time: 5.944000, Performance 0.168237\n02:38:38 INFO : 9/10 completion time for [uclamp:458e595054b2]: 5.944\n02:38:38 INFO : Workload execution START:\n02:38:38 INFO : /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 2 --loop 5000\n02:38:44 INFO : PerfBench - Completion time: 5.635000, Performance 0.177462\n02:38:44 INFO : 10/10 completion time for [uclamp:458e595054b2]: 5.635\n"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Performance Comparision"
},
{
"metadata": {
"trusted": false,
"collapsed": true
},
"cell_type": "code",
"source": "# Remove all data\n# !rm /data/Code/lisa/results/uclamp_validation/perf.csv",
"execution_count": 8,
"outputs": []
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "# Load previously collected completion times\nperf_csv = '/data/Code/lisa/results/uclamp_validation/perf.csv'\ntry:\n perf_df = pd.DataFrame.from_csv(perf_csv)\n logging.info(\"Previous results loaded from CSV\")\n df = pd.DataFrame(results, columns=['kernel', 'sha1', 'iteration', 'time'])\n perf_df = perf_df.append(df)\nexcept:\n perf_df = pd.DataFrame(results, columns=['kernel', 'sha1', 'iteration', 'time'])\n\n# Compute delta vs best time\nbest_time = perf_df.time.min()\nperf_df['delta'] = 100. * (perf_df.time - best_time) / best_time\n \n# Update CSV results\nperf_df.to_csv(perf_csv)\n\n# Set DF index\n# perf_df = perf_df.set_index(['kernel', 'iteration'])",
"execution_count": 15,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": "02:41:50 INFO : Previous results loaded from CSV\n"
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "perf_df.tail()",
"execution_count": 16,
"outputs": [
{
"execution_count": 16,
"output_type": "execute_result",
"data": {
"text/plain": " delta iteration kernel sha1 time\n5 4.285975 6 baseline 458e595054b2 5.718\n6 4.541310 7 baseline 458e595054b2 5.732\n7 6.948751 8 baseline 458e595054b2 5.864\n8 8.407806 9 baseline 458e595054b2 5.944\n9 2.772205 10 baseline 458e595054b2 5.635",
"text/html": "<div>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>delta</th>\n <th>iteration</th>\n <th>kernel</th>\n <th>sha1</th>\n <th>time</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>5</th>\n <td>4.285975</td>\n <td>6</td>\n <td>baseline</td>\n <td>458e595054b2</td>\n <td>5.718</td>\n </tr>\n <tr>\n <th>6</th>\n <td>4.541310</td>\n <td>7</td>\n <td>baseline</td>\n <td>458e595054b2</td>\n <td>5.732</td>\n </tr>\n <tr>\n <th>7</th>\n <td>6.948751</td>\n <td>8</td>\n <td>baseline</td>\n <td>458e595054b2</td>\n <td>5.864</td>\n </tr>\n <tr>\n <th>8</th>\n <td>8.407806</td>\n <td>9</td>\n <td>baseline</td>\n <td>458e595054b2</td>\n <td>5.944</td>\n </tr>\n <tr>\n <th>9</th>\n <td>2.772205</td>\n <td>10</td>\n <td>baseline</td>\n <td>458e595054b2</td>\n <td>5.635</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "perf_df.groupby(['kernel', 'sha1']).describe(percentiles=[.95, .99]).T",
"execution_count": 17,
"outputs": [
{
"execution_count": 17,
"output_type": "execute_result",
"data": {
"text/plain": "kernel baseline \\\nsha1 458e595054b2 \n count mean std min 50% 95% \ndelta 20.0 6.280321 2.582853 1.969725 6.784607 10.046507 \niteration 20.0 5.500000 2.946898 1.000000 5.500000 10.000000 \ntime 20.0 5.827350 0.141618 5.591000 5.855000 6.033850 \n\nkernel uclamp \\\nsha1 c06ddd27753b \n 99% max count mean std min \ndelta 10.282145 10.341054 20.0 4.492066 2.655363 0.000 \niteration 10.000000 10.000000 20.0 5.500000 2.946898 1.000 \ntime 6.046770 6.050000 20.0 5.729300 0.145594 5.483 \n\nkernel \nsha1 \n 50% 95% 99% max \ndelta 4.304213 8.079519 8.079519 8.079519 \niteration 5.500000 10.000000 10.000000 10.000000 \ntime 5.719000 5.926000 5.926000 5.926000 ",
"text/html": "<div>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr>\n <th>kernel</th>\n <th colspan=\"8\" halign=\"left\">baseline</th>\n <th colspan=\"8\" halign=\"left\">uclamp</th>\n </tr>\n <tr>\n <th>sha1</th>\n <th colspan=\"8\" halign=\"left\">458e595054b2</th>\n <th colspan=\"8\" halign=\"left\">c06ddd27753b</th>\n </tr>\n <tr>\n <th></th>\n <th>count</th>\n <th>mean</th>\n <th>std</th>\n <th>min</th>\n <th>50%</th>\n <th>95%</th>\n <th>99%</th>\n <th>max</th>\n <th>count</th>\n <th>mean</th>\n <th>std</th>\n <th>min</th>\n <th>50%</th>\n <th>95%</th>\n <th>99%</th>\n <th>max</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>delta</th>\n <td>20.0</td>\n <td>6.280321</td>\n <td>2.582853</td>\n <td>1.969725</td>\n <td>6.784607</td>\n <td>10.046507</td>\n <td>10.282145</td>\n <td>10.341054</td>\n <td>20.0</td>\n <td>4.492066</td>\n <td>2.655363</td>\n <td>0.000</td>\n <td>4.304213</td>\n <td>8.079519</td>\n <td>8.079519</td>\n <td>8.079519</td>\n </tr>\n <tr>\n <th>iteration</th>\n <td>20.0</td>\n <td>5.500000</td>\n <td>2.946898</td>\n <td>1.000000</td>\n <td>5.500000</td>\n <td>10.000000</td>\n <td>10.000000</td>\n <td>10.000000</td>\n <td>20.0</td>\n <td>5.500000</td>\n <td>2.946898</td>\n <td>1.000</td>\n <td>5.500000</td>\n <td>10.000000</td>\n <td>10.000000</td>\n <td>10.000000</td>\n </tr>\n <tr>\n <th>time</th>\n <td>20.0</td>\n <td>5.827350</td>\n <td>0.141618</td>\n <td>5.591000</td>\n <td>5.855000</td>\n <td>6.033850</td>\n <td>6.046770</td>\n <td>6.050000</td>\n <td>20.0</td>\n <td>5.729300</td>\n <td>0.145594</td>\n <td>5.483</td>\n <td>5.719000</td>\n <td>5.926000</td>\n <td>5.926000</td>\n <td>5.926000</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "fig, axes = plt.subplots(figsize=(16,8))\nperf_df.boxplot(by=['kernel', 'sha1'], ax=axes,\n column='time', return_type='dict',\n grid=True, vert=False);\nfig.suptitle('');\naxes.set_xlabel('Completion Time [s]');",
"execution_count": 18,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABDYAAAHtCAYAAADiEv4HAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmUbmV9J/rvTw4KIoIKISa0HjUOGAdsEU2L9nG43jiP\nETq2Bk0vYwaTttsYEr3RRHODQy9bg9E2RERjjLkqccAgipaYqFGQQRSHxBCVOBtREJXhd/94d4XX\nos6p8pw6VfUcPp+1ap33ffb027ueVVXv9zzP3tXdAQAAABjR9Ta6AAAAAICdJdgAAAAAhiXYAAAA\nAIYl2AAAAACGJdgAAAAAhiXYAAAAAIYl2AAAWANVdYuqurSq9troWgDgukSwAQCwk6rqoqp6YJJ0\n9xe6+0bdfdVG1wUA1yWCDQAAAGBYgg0AgJ1QVa9Pcosk75imoDyrqrqqtkzLF6rqBVX1oWn5O6rq\nZlX1hqr6TlV9rKq2zu3vDlX1nqr6VlV9pqoevzFnBgBjEWwAAOyE7n5iki8keXh33yjJXy+z2jFJ\nnpjkp5PcJsmHk5yU5KZJLkzy3CSpqv2SvCfJXyb5iWm7P62qO+7m0wCA4Qk2AAB2n5O6+5+6+5Ik\nf5vkn7r7vd19ZZL/L8ndpvUeluSi7j6pu6/s7nOSvCXJL2xM2QAwji0bXQAAwB7sq3OvL1/m/Y2m\n17dMcs+q+vbc8i1JXr97ywOA8Qk2AAB2Xq/Rfr6Y5APd/X+t0f4A4DrDVBQAgJ331SS3XoP9vDPJ\n7arqiVW19/R1j6o6bA32DQB7NMEGAMDO++Mkz5mmkDxuZ3fS3d9N8qDMbhr6r0m+kuSFSW6wFkUC\nwJ6sutdqBCUAAADA+jJiAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAY1paNLoA9w0EH\nHdRbt27d6DI2hcsuuyz77bffRpfBHkJ/Yq3oS6wl/Ym1pD+xlvSnPcfZZ5/9je4+eDXrCjZYE1u3\nbs1ZZ5210WVsCgsLC9m2bdtGl8EeQn9irehLrCX9ibWkP7GW9Kc9R1X9y2rXNRUFAAAAGJZgAwAA\nABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAA\nGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAY\nlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiW\nYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZg\nAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmAD\nAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMA\nAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAA\nABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAA\nGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAY\nlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiW\nYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGJZgAwAAABiWYAMAAAAY1paNLgAAdsVd\n/+D0XHL5FRtdxhhOO3XdDrX/Ycfluxcev27HYwOsY3/aFQfsu3fOe+6DNroMAHYjwQYAQ7vk8ity\n0fEP3egyNr2FhYVs27Zt3Y5355OP833Zg613f9oVW48bI4ABYOeZigIAAAAMS7ABAAAADEuwAQAA\nAAxLsAEAAAAMS7ABAAAADEuwAQAAAAxLsMF1SlVtdAkAAAzA340wDsEGAAAAMCzBBgAAADAswQYA\nAAAwrJ0ONqpq36r6QFXttRPbbquqd+7ssXeHqrppVb2nqj43/XuTuWXbqurcqvpkVX1gO9s/r6qe\nuUz71qq6YDvbLFTVEVV1w6o6tao+PR3j+Ll1Xjod+9yq+mxVfXtqv99c+7lV9f2qetS07LVV9c9z\nyw6f2h9ZVedPbWdV1VFz57fs96Oq3jt/LQAAAGAz2ZURG09J8tbuvmqtitlgxyU5o7tvm+SM6X2q\n6sAkf5rkEd39s0l+YTcd/yXdfYckd0ty76p6cJJ09zO6+/DuPjzJnyR569T+/rn2+yf5XpLT5/b3\n24vLu/vcqe2MJHedtnlKkhNXUdfrk/zaWpwgAAAArLVdCTaekORtybX/x7+qTqiqY6fX96iqD1XV\neVX10araf34nVXVkVX24qs6Z1rv91H5sVf3NNHrioqr6jar6H9N6H6mqm07rLVTVy6ZRCBdU1ZEr\nFV5Vv1NVn5hqWhwd8cgkJ0+vT07yqOn1L2YW4HwhSbr7a3P7efY0iuLvktx+rv3u077PS/Lrc+37\nVtVfVdWFVXVKkn2nfX6vu98/vf5hko8nOXSZ0v9Lkjcu0/64JH/b3d/b0Xl396Xd3dPb/ZL03OIb\nT6NGPlNVr6qqxb7x9um4AAAAsOnsVLBRVddPcuvuvmgV670pyW91912TPDDJ5UtW+3SS+3T33ZL8\nfpL/d27ZnZI8Jsk9kvxRku9N6304yZPm1rvhNArh15K8ZoWaHpxZiHHPqaYXTYsO6e4vT6+/kuSQ\n6fXtktxkClDOrqonTfu5e5Jjkhye5CFTjYtOSvL0af/zfnU6h8OSPDfJ3Zep78AkD89sdMV8+y2T\n3CrJ+5Y5rWNy7cDjj6ZpJy+tqhvM7efRVfXpJKdmNmpj0ZFJnp7kjkluk9l1T3f/W5IbVNXNljku\nAAAAbKgtO7ndQUm+vYr1bp/ky939sSTp7u8k13om9AFJTq6q22Y2gmDvuWXv7+7vJvluVV2S5B1T\n+yeS3GVuvTdO+z+zqm5cVQd29/bqe2CSkxZHN3T3t5au0N1dVYujGbZkFkA8ILMRFh+uqo8kuU+S\nUxb3U1Vvn/49MMmB3X3mtP3rkzx4en3fJC+fjnF+VZ0/f9yq2jKdy8u7+/NLyjomyZuXTv2pqpsn\nuXOSd881/25m4cz1k7w6ye8k+cPpuKckOaWq7pvk+dP1SJKPLh6zqt6Y5Kgkb56WfS3JTyX55pJj\nPzXJU5PkkEMOycLCQkaw9bhTd/9BTluHY3DdoT+taJSfPxvp0ksvXffr5Puy59qI/rQr1uV3P7tm\nk/6uG6mfMzPazyfWxs4GG5cn2Wfu/ZX50dEf+2T1np9ZgPHoqtqaZGFu2Q/mXl899/7q/Gjt81Mq\nlnu/Gl+tqpt395ensGBxysmXknyzuy9LcllVnZlk6UiMtfLqJJ/r7v+9zLJjMjetZc7jMwtYrlhs\nmBt58oOqOinJtW5qOoVAt66qgxablq4y93qfXHukTbr71VPNOeKII3rbtm3LntRmc9HxD92t+19Y\nWMgo14LNT39a2dbjTnWNVmHd+9LJ8X3Zgw31s+m0U3f77352zWbtT/VCP8dGtFn7E7vXTk1FmaYn\n7FVViwHGvyS5Y1XdYBqx8ICp/TNJbl5V90iSqtp/GpUw74AkF0+vj92ZepIcPe3/qCSXdPcl0707\nXrfMuu9J8uSquuG0zU2n9rcn+aXp9S9lun/I9O9RVbVl2uaeSS5McmaSR033zdg/s+kjmUaKfHvx\niSOZ3Ytk0ZmZ3bMjVXWnzI06qaoXZHYt/vvSgqvqDkluktkUnKWudd+NKZhJzYbGPCrJBdP7n5na\nUlX/MckNcs0ojCOr6lbTvTWOTvJ3c/v4ySQXLXNsAAAA2FA7O2IjmT2B46gk7+3uL1bVX2f2Afqf\nk5yTzG6EWVVHJ/mTqto3s//1f+CS/bwos6koz8nsvg874/tVdU5m01gW7xtxiyw/yuC0mj3+9Kyq\n+mGSdyX5vSTHJ/nrqvrlzIKax0/rX1hVpyU5P7ORIid292JQ8KYk52U2uuNjc4d5cpLXTNNZ5p9U\n8sokJ1XVhZmFI2dP+zk0ybMzu9/Ix6fs4YTuXnxqyTFJ/mruxp+Zttua5D8kWfoI2jdU1cFJKsm5\nSZ42tT82yZOq6orp2hw9TbvJVP8JSX4myfuTnDJtc/ckH+nuK5deSwAAANhouxJsvCLJM5K8N0m6\n+1lJnrV0pen+Gvda0rwwfaW7P5zZDToXPWdqf22S187tZ+vc6x9ZluQvunvpSId7TjVeS3cfn1mQ\nMd/2zVwz0mTp+i9O8uJl2v8os5uaLm0/Oz86XeVZU/vlmYUUy6nttKe7n7ed9ouS/PQy7fffzvov\nTPLCZdoXMrv/x3KemNnjbgEAAGDT2elgo7s/XlXvr6q9lt7QcjPo7t/e6Br2EBd09xkrrwYAAADr\nb1dGbKS7d/ho1fXQ3ds2uoY9WXf/2UbXAAAAANuzUzcPBQAAANgMBBsAAADAsAQbXKcsebAMAAAs\ny9+NMA7BBgAAADAswQYAAAAwLMEGAAAAMCzBBgAAADAswQYAAAAwLMEGAAAAMKwtG10AAOyqrced\nutEljOG09btO+x/m+7LHW8f+tCsO2HfvjS4BgN1MsAHA0C46/qEbXcIQFhYWsm3btnU8ou/Lnmz9\n+xMAbJ+pKAAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsA\nAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAA\nAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAA\nwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADA\nsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCw\nBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAE\nGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQb\nAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsA\nAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAA\nAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAA\nwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADA\nsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCw\nBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAE\nGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQb\nAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsA\nAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAA\nAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsAQbAAAA\n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\n5PpVdWl3H7fM9fj37+UUtjwsyQOm0SWL9smsHwAAAMCms8N7bExTMfaqqvlw48jpSR3Xy2wqxt8l\nuXGSy5JcUlWHJHlw8u8f3g+YbsT5jCR3nfZxepKnL+5wGkmxM96d5Ferau9pP7erqv2m159e5nxe\n2d0/1d1bMxtp8tnu3jatf/O5VR+dZPGJKV/ILIzJtO97Jfl0kjOSPK6ueeLJTWv21JMtVXXQ1LZ3\nZmHBBdP7gxbvSZLZDTpfM7XfZJpKk2nbeyf51BQwvD+zUChJfinT/U6W1PuIJBdO5/iE7r7FdI7P\nzCxQWQw1rje3r1/M7HuXqvr5JM9K8ojuXjpF53Zz1wIAAAA2lZVGbCSzEOKoJO+d3n8syQlJfiaz\nD92ndPfVVXVOZh/4v5jk76d190/ytikYqcxu2pkkv5nkFVV1/lTDmUmethP1n5jZtJSPTzfa/HqS\nR03hwA6HfyzjRVPA0kkuSrJ4I9JXZHa/jE9O+zypu89Pkqp6TpLTp7DiiiS/nuQbSd49hRp7ZXbd\n/mza17Ykf1xVndk5//rUfliS/1NVV2cWPhzf3Z+alv1Okr+qqhckOSfJn0/tv1lVj8hs6si3khy7\ninO8LLNg6jmZTTE5emo/IckNkrxnGjXzke5e/H7cL4lJagAAAGxKqwk2XpHZaIv3dvdCkvsut1J3\nH7ud7Y9cZt1v5JoP1fPtr03y2un18+baty3Zduv0+uokvzd9/buqethU93ZNN0S909z7J25nvUsz\ne+TrcsvelB+90eaiu29n/TfnmieczLd/KMmdt7PN57P8NfzdTI9l3Z756zm9X/Y+JtOjZK9lGkVy\nRJL/vqPjAAAAwEZZMdjo7o9X1furaq/uvmql9TeD7n7nymuxCrdIctzcU1kAAABgU1nNiI1092t2\ndyFsPt39uSSf2+g6AAAAYHt2ePNQAAAAgM1MsAGwDn70KcoAALBx9rS/TQUbAAAAwLAEGwAAAMCw\nBBsAAADAsAQbAAAAwLAEGwAAAMCwBBsAAADAsLZsdAEAAPO2HnfqRpfAapzm+7Qr9j9MX/8R69Cf\nDth3791+DGBjCDYAgE3jouMfutElsAoLCwvZtm3bRpcxOH19kf4E7CpTUQAAAIBhCTYAAACAYQk2\nAAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYA\nAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAA\nAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAA\ngGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACA\nYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBh\nCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJ\nNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2\nAAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYA\nAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAA\nAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAA\ngGEJNgAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYAAACAYQk2AAAAgGFVd290DewBqurrSf5l\no+vYJA5K8o2NLoI9hv7EWtGXWEv6E2tJf2It6U97jlt298GrWVGwAWusqs7q7iM2ug72DPoTa0Vf\nYi3pT6wl/Ym1pD9dN5mKAgAAAAxLsAEAAAAMS7ABa+/VG10AexT9ibWiL7GW9CfWkv7EWtKfroPc\nYwMAAAAYlhEbAAAAwLC2bHQBMKqquijJd5NcleTKpXdfrqptSd6W5J+nprd29x+uZ42MYaW+NK2z\nLcn/TrJ3km90939ezxoZxyp+Nv12kidMb7ckOSzJwd39rfWskzGsoj8dkOQvktwis/70ku4+ab3r\nZAyr6E83SfKaJLdJ8v0kT+nuC9a7Tja/qjowyYlJ7pSkM+srH55bXkleluQhSb6X5Nju/vhG1Mr6\nEGzArrlfd+/oOdkf7O6HrVs1jGy7fWn65f2nSX6+u79QVT+xvqUxoO32p+5+cZIXJ0lVPTzJM4Qa\nrGBHv+t+PcmnuvvhVXVwks9U1Ru6+4frWB9j2VF/+r0k53b3o6vqDklekeQB61caA3lZktO6+3FV\ndf0kN1wWvkdWAAAHa0lEQVSy/MFJbjt93TPJK6d/2UOZigKw+f1iZiN+vpAk3f21Da6HPcd/SfLG\njS6CoXWS/af/Hb1Rkm8luXJjS2Jgd0zyviTp7k8n2VpVh2xsSWw200ix+yb58yTp7h9297eXrPbI\nJK/rmY8kObCqbr7OpbKOBBuw8zrJ6VV1dlU9dTvr/FxVnVdVf1tVP7uexTGUlfrS7ZLcpKoWpnWe\ntM71MZbV/GxKVd0wyc8necu6VcaIVupPJ2Q2nelfk3wiyW9199XrWSBDWak/nZfkMUlSVUcmuWWS\nQ9exPsZwqyRfT3JSVZ1TVSdW1X5L1vnpJF+ce/+lqY09lKkosPOO6u6Lp2kB76mqT3f3mXPLP57k\nlt19aVU9JMnfZDYcDpZaqS9tSXL3zIbj7pvkw1X1ke7+7EYUy6a3Un9a9PAkf28aCitYqT/930nO\nTXL/zO6L8J6q+mB3f2cjimXTW6k/HZ/kZVV1bmZB2TmZ3Y8D5m1J8h+TPL27/6GqXpbkuCT/z8aW\nxUYyYgN2UndfPP37tSSnJDlyyfLvdPel0+t3Jdm7qg5a90LZ9FbqS5n9L8O7u/uyaV7ymUnuur5V\nMopV9KdFx8Q0FFawiv705MymynV3/2NmN8y+w/pWyShW+bfTk7v78CRPSnJwks+ve6Fsdl9K8qXu\n/ofp/ZszCzrmXZzkP8y9P3RqYw8l2ICdUFX7VdX+i6+TPCjJBUvW+clpzvHicMrrJfnmetfK5raa\nvpTZ03WOqqot0/SBeya5cH0rZQSr7E+L85P/c2Z9C5a1yv70hUw3d5zuhXD7+CDKMlb5t9OB040g\nk+S/JTnT6B+W6u6vJPliVd1+anpAkk8tWe3tSZ5UM/dKckl3f3k962R9mYoCO+eQJKdMucWWJH/Z\n3adV1dOSpLtfleRxSX61qq5McnmSY7q7N6pgNq0V+1J3X1hVpyU5P8nVSU70+Du2YzU/m5Lk0UlO\n7+7LNqZMBrGa/vT8JK+tqk8kqSS/s8LTwrjuWk1/OizJyVXVST6Z5Jc3qlg2vacnecMUhH0+yZOX\n9KV3Zfao13/M7HGvT96oQlkf5XMWAAAAMCpTUQAAAIBhCTYAAACAYQk2AAAAgGEJNgAAAIBhCTYA\nAACAYQk2AIAhVNVPVtVfVdU/VdXZVfWuqrrdbjzetqp65wrrHF5VD5l7/4iqOm4Xj3uzqjp3+vpK\nVV089/76VfWhXdn/do55bFV9vapO3ME6+041/LCqDlrrGgBgZ23Z6AIAAFZSVZXklCQnd/cxU9td\nkxyS5LMbWNrhSY5I8q4k6e63J3n7ruywu7857TdV9bwkl3b3S+ZW+U+7sv8deFN3/8YO6ro8yeFV\nddFuOj4A7BQjNgCAEdwvyRXd/arFhu4+r7s/WDMvrqoLquoTVXV08u8jLj5QVW+rqs9X1fFV9YSq\n+ui03m2m9V5bVa+qqrOq6rNV9bClB6+q/arqNdO251TVI6vq+kn+MMnR00iGo6eRDydM22ytqvdV\n1flVdUZV3WLueC+vqg9NdT3ux7kQVXXpj3l+B1fVW6rqY9PXvVdxjJ+d9nPuVP9tf5waAWA9CTYA\ngBHcKcnZ21n2mMxGONw1yQOTvLiqbj4tu2uSpyU5LMkTk9yuu49McmKSp8/tY2uSI5M8NMmrqmqf\nJcd4dpL3TdveL8mLk+yd5PczG+lweHe/ack2f5LZCJO7JHlDkpfPLbt5kqOSPCzJ8Sue/fat5vxe\nluSl3X2PJI+dlq3kaUle1t2LI1K+tAs1AsBuZSoKADC6o5K8sbuvSvLVqvpAknsk+U6Sj3X3l5Ok\nqv4pyenTNp/ILKBY9NfdfXWSz1XV55PcYckxHpTkEVX1zOn9PklusUJdP5dZ6JIkr0/yorllfzMd\n71NVdcgqz3M5qzm/Bya542w2T5LkxlV1o+6+dAf7/XCSZ1fVoUne2t2f24UaAWC3EmwAACP4ZJIf\na8rG5Adzr6+ee391fvTvoF6y3dL3leSx3f2ZH2msuudO1LS0rtruWj/efrZ3ftdLcq/u/v5qd9rd\nf1lV/5DZCJZ3VdWvdPf7dqFOANhtTEUBAEbwviQ3qKqnLjZU1V2q6j5JPpjZfS72qqqDk9w3yUd/\nzP3/QlVdb7ovxa2TfGbJ8ncnefp0E9NU1d2m9u8m2X87+/xQkmOm10+Y6twIp2du2k1VHb7SBlV1\n6ySf7+6XJ3lbkrvsvvIAYNcINgCATa+7O8mjkzxwetzrJ5P8cZKvZPa0lPOTnJdZAPKs7v7Kj3mI\nL2QWhvxtkqctM7rh+ZndU+P86djPn9rfn9k0j3MXb1o65+lJnlxV52d2/4vf+jFrWiu/meSI6Sag\nn8rs/hkreXySC6rq3Mzub/K63VkgAOyKmv2dAABw3VRVr03yzu5+80bXslGq6tgkR+zoca9z6140\nrfuN3V0XAKyGERsAAFye5MFVtd0nplTVvtMIjr0zu4cHAGwKRmwAAAAAwzJiAwAAABiWYAMAAAAY\nlmADAAAAGJZgAwAAABiWYAMAAAAYlmADAAAAGNb/D3WViFfAbZdhAAAAAElFTkSuQmCC\n",
"text/plain": "<matplotlib.figure.Figure at 0x7fd8bc645ad0>"
},
"metadata": {}
}
]
}
],
"metadata": {
"kernelspec": {
"name": "python2",
"display_name": "Python 2",
"language": "python"
},
"toc": {
"threshold": 4,
"number_sections": true,
"toc_cell": false,
"toc_window_display": false,
"toc_section_display": "block",
"sideBar": true,
"navigate_menu": true,
"moveMenuLeft": true,
"colors": {
"hover_highlight": "#DAA520",
"selected_highlight": "#FFD700",
"running_highlight": "#FF0000"
},
"nav_menu": {
"width": "252px",
"height": "119px"
}
},
"language_info": {
"mimetype": "text/x-python",
"nbconvert_exporter": "python",
"name": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12",
"file_extension": ".py",
"codemirror_mode": {
"version": 2,
"name": "ipython"
}
},
"gist": {
"id": "",
"data": {
"description": "UtilClamp Evaluation",
"public": false
}
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment