diff --git a/ipynb/profiling/kernel_functions_profiling.ipynb b/ipynb/profiling/kernel_functions_profiling.ipynb index 1ef7d1a6be4e1fa21c044b1bcffb1c748139cbb3..ce6bb64ed7a6d74ac584241be70bdaac6ea69120 100644 --- a/ipynb/profiling/kernel_functions_profiling.ipynb +++ b/ipynb/profiling/kernel_functions_profiling.ipynb @@ -15,6 +15,18 @@ "collapsed": true }, "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], "source": [ "import logging\n", "reload(logging)\n", @@ -28,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": { "collapsed": false }, @@ -53,7 +65,8 @@ "import pandas\n", "\n", "# Support to tests execution\n", - "from executor import Executor" + "from executor import Executor\n", + "from env import TestEnv" ] }, { @@ -65,11 +78,51 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": { - "collapsed": true + "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "01:43:51 INFO : Target - Using base path: /home/bjackman/sources/lisa\n", + "01:43:51 INFO : Target - Loading custom (inline) target configuration\n", + "01:43:51 INFO : Target - Loading custom (inline) test configuration\n", + "01:43:51 INFO : Target - Devlib modules to load: ['bl', 'cpufreq']\n", + "01:43:51 INFO : Target - Connecting linux target:\n", + "01:43:51 INFO : Target - username : brendan\n", + "01:43:51 INFO : Target - host : 192.168.0.1\n", + "01:43:51 INFO : Target - password : \n", + "01:43:51 INFO : Target - Connection settings:\n", + "01:43:51 INFO : Target - {'username': 'brendan', 'host': '192.168.0.1', 'password': ''}\n", + "01:43:58 INFO : Target - Initializing target workdir:\n", + "01:43:58 INFO : Target - /home/brendan/devlib-target\n", + "01:44:04 INFO : Target - Topology:\n", + "01:44:04 INFO : Target - [[0, 3, 4, 5], [1, 2]]\n", + "01:44:07 INFO : Platform - Loading default EM:\n", + "01:44:07 INFO : Platform - /home/bjackman/sources/lisa/libs/utils/platforms/juno.json\n", + "01:44:11 INFO : FTrace - Enabled tracepoints:\n", + "01:44:11 INFO : FTrace - sched:*\n", + "01:44:11 INFO : FTrace - Kernel functions profiled:\n", + "01:44:11 INFO : FTrace - select_task_rq_fair\n", + "01:44:11 INFO : FTrace - enqueue_task_fair\n", + "01:44:11 INFO : FTrace - dequeue_task_fair\n", + "01:44:11 WARNING : Target - Using configuration provided RTApp calibration\n", + "01:44:11 INFO : Target - Using RT-App calibration values:\n", + "01:44:11 INFO : Target - {\"0\": 358, \"1\": 138, \"2\": 138, \"3\": 357, \"4\": 359, \"5\": 355}\n", + "01:44:11 WARNING : TestEnv - Wipe previous contents of the results folder:\n", + "01:44:11 WARNING : TestEnv - /home/bjackman/sources/lisa/results/KernelFunctionsProfilingExample\n", + "01:44:11 INFO : HWMon - HWMON module not enabled\n", + "01:44:11 WARNING : HWMon - Energy sampling disabled by configuration\n", + "01:44:11 INFO : TestEnv - Set results folder to:\n", + "01:44:11 INFO : TestEnv - /home/bjackman/sources/lisa/results/KernelFunctionsProfilingExample\n", + "01:44:11 INFO : TestEnv - Experiment results available also in:\n", + "01:44:11 INFO : TestEnv - /home/bjackman/sources/lisa/results_latest\n" + ] + } + ], "source": [ "# Setup a target configuration\n", "target_conf = {\n", @@ -80,7 +133,7 @@ "\n", " # Login credentials\n", " \"host\" : \"192.168.0.1\",\n", - " \"username\" : \"root\",\n", + " \"username\" : \"brendan\",\n", " \"password\" : \"\",\n", "\n", " # Local installation path\n", @@ -97,7 +150,16 @@ "\n", "}\n", "\n", - "tests_conf = {\n", + "test_conf = {\n", + " # Tools to deploy\n", + " \"tools\" : [ \"rt-app\", 'trace-cmd' ],\n", + " \n", + " # Where results are collected\n", + " # NOTE: this folder will be wiped before running the experiments\n", + " \"results_dir\" : \"KernelFunctionsProfilingExample\",\n", + "\n", + " # Modules required by these experiments\n", + " \"exclude_modules\" : [ \"hwmon\" ],\n", " \n", " # Kernel functions to profile for all the test\n", " # configurations which have the \"ftrace\" flag enabled\n", @@ -109,7 +171,42 @@ " ],\n", " \"buffsize\" : 80 * 1024,\n", " },\n", + "}\n", + "\n", + "env = TestEnv(target_conf, test_conf)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "01:50:59 INFO : Target - Loading custom (inline) test configuration\n", + "01:50:59 INFO : \n", + "01:50:59 INFO : ################################################################################\n", + "01:50:59 INFO : Executor - Experiments configuration\n", + "01:50:59 INFO : ################################################################################\n", + "01:50:59 INFO : Executor - Configured to run:\n", + "01:50:59 INFO : Executor - 2 target configurations:\n", + "01:50:59 INFO : Executor - base, eas\n", + "01:50:59 INFO : Executor - 1 workloads (3 iterations each)\n", + "01:50:59 INFO : Executor - rta\n", + "01:50:59 INFO : Executor - Total: 6 experiments\n", + "01:50:59 INFO : Executor - Results will be collected under:\n", + "01:50:59 INFO : Executor - /home/bjackman/sources/lisa/results/KernelFunctionsProfilingExample\n" + ] + } + ], + "source": [ + "# Setup tests executions based on our configuration\n", " \n", + "tests_conf = {\n", " # Platform configurations to test\n", " \"confs\" : [\n", " {\n", @@ -138,7 +235,7 @@ " \"class\" : \"profile\",\n", " \"params\" : {\n", " \"p20\" : {\n", - " \"kind\" : \"periodic\",\n", + " \"kind\" : \"Periodic\",\n", " \"params\" : {\n", " \"duty_cycle_pct\" : 20,\n", " },\n", @@ -151,81 +248,9 @@ " \n", " # Number of iterations for each configuration/workload pair\n", " \"iterations\" : 3,\n", - " \n", - " # Tools to deploy\n", - " \"tools\" : [ \"rt-app\", 'trace-cmd' ],\n", - " \n", - " # Where results are collected\n", - " # NOTE: this folder will be wiped before running the experiments\n", - " \"results_dir\" : \"KernelFunctionsProfilingExample\",\n", - "\n", - " # Modules required by these experiments\n", - " \"exclude_modules\" : [ \"hwmon\" ],\n", + "}\n", "\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "03:43:22 INFO : Target - Loading custom (inline) test configuration\n", - "03:43:22 INFO : Target - Using base path: /home/derkling/Code/lisa\n", - "03:43:22 INFO : Target - Loading custom (inline) target configuration\n", - "03:43:22 INFO : Target - Loading custom (inline) test configuration\n", - "03:43:22 INFO : Target - Devlib modules to load: ['bl', 'cpufreq']\n", - "03:43:22 INFO : Target - Connecting linux target:\n", - "03:43:22 INFO : Target - username : root\n", - "03:43:22 INFO : Target - host : 192.168.0.1\n", - "03:43:22 INFO : Target - password : \n", - "03:43:26 INFO : Target - Initializing target workdir:\n", - "03:43:26 INFO : Target - /root/devlib-target\n", - "03:43:34 INFO : Target - Topology:\n", - "03:43:34 INFO : Target - [[0, 3, 4, 5], [1, 2]]\n", - "03:43:36 INFO : Platform - Loading default EM:\n", - "03:43:36 INFO : Platform - /home/derkling/Code/lisa/libs/utils/platforms/juno.json\n", - "03:43:38 INFO : FTrace - Enabled tracepoints:\n", - "03:43:38 INFO : FTrace - sched:*\n", - "03:43:38 INFO : FTrace - Kernel functions profiled:\n", - "03:43:38 INFO : FTrace - select_task_rq_fair\n", - "03:43:38 INFO : FTrace - enqueue_task_fair\n", - "03:43:38 INFO : FTrace - dequeue_task_fair\n", - "03:43:38 INFO : EnergyMeter - HWMON module not enabled\n", - "03:43:38 WARNING : EnergyMeter - Energy sampling disabled by configuration\n", - "03:43:38 WARNING : Target - Using configuration provided RTApp calibration\n", - "03:43:38 INFO : Target - Using RT-App calibration values:\n", - "03:43:38 INFO : Target - {\"0\": 358, \"1\": 138, \"2\": 138, \"3\": 357, \"4\": 359, \"5\": 355}\n", - "03:43:38 WARNING : TestEnv - Wipe previous contents of the results folder:\n", - "03:43:38 WARNING : TestEnv - /home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\n", - "03:43:38 INFO : TestEnv - Set results folder to:\n", - "03:43:38 INFO : TestEnv - /home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\n", - "03:43:38 INFO : TestEnv - Experiment results available also in:\n", - "03:43:38 INFO : TestEnv - /home/derkling/Code/lisa/results_latest\n", - "03:43:38 INFO : \n", - "03:43:38 INFO : ################################################################################\n", - "03:43:38 INFO : Executor - Experiments configuration\n", - "03:43:38 INFO : ################################################################################\n", - "03:43:38 INFO : Executor - Configured to run:\n", - "03:43:38 INFO : Executor - 2 targt configurations:\n", - "03:43:38 INFO : Executor - base, eas\n", - "03:43:38 INFO : Executor - 1 workloads (3 iterations each)\n", - "03:43:38 INFO : Executor - rta\n", - "03:43:38 INFO : Executor - Total: 6 experiments\n", - "03:43:38 INFO : Executor - Results will be collected under:\n", - "03:43:38 INFO : Executor - /home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\n" - ] - } - ], - "source": [ - "# Setup tests executions based on our configuration\n", - "executor = Executor(target_conf, tests_conf)" + "executor = Executor(env, tests_conf)" ] }, { @@ -237,110 +262,216 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 10, "metadata": { "collapsed": false, - "scrolled": false + "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "03:43:38 INFO : \n", - "03:43:38 INFO : ################################################################################\n", - "03:43:38 INFO : Executor - Experiments execution\n", - "03:43:38 INFO : ################################################################################\n", - "03:43:38 INFO : \n", - "03:43:38 INFO : ================================================================================\n", - "03:43:38 INFO : TargetConfig - configuring target for [base] experiments\n", - "03:43:39 INFO : SchedFeatures - Set scheduler feature: NO_ENERGY_AWARE\n", - "03:43:39 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", - "03:43:40 INFO : WlGen - Setup new workload rta\n", - "03:43:40 INFO : RTApp - Workload duration defined by longest task\n", - "03:43:40 INFO : RTApp - Default policy: SCHED_OTHER\n", - "03:43:40 INFO : RTApp - ------------------------\n", - "03:43:40 INFO : RTApp - task [task_p20], sched: using default policy\n", - "03:43:40 INFO : RTApp - | calibration CPU: 1\n", - "03:43:40 INFO : RTApp - | loops count: 1\n", - "03:43:40 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", - "03:43:40 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", - "03:43:40 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", - "03:43:41 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "03:43:41 INFO : Executor - Experiment 1/6, [base:rta] 1/3\n", - "03:43:41 WARNING : Executor - FTrace events collection enabled\n", - "03:43:46 INFO : WlGen - Workload execution START:\n", - "03:43:46 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "03:43:51 INFO : Executor - Collected FTrace binary trace:\n", - "03:43:51 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", - "03:43:52 INFO : Executor - Collected FTrace function profiling:\n", - "03:43:52 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", - "03:43:52 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "03:43:52 INFO : Executor - Experiment 2/6, [base:rta] 2/3\n", - "03:43:52 WARNING : Executor - FTrace events collection enabled\n", - "03:43:58 INFO : WlGen - Workload execution START:\n", - "03:43:58 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "03:44:02 INFO : Executor - Collected FTrace binary trace:\n", - "03:44:02 INFO : Executor - /rtapp:base:rta/2/trace.dat\n", - "03:44:03 INFO : Executor - Collected FTrace function profiling:\n", - "03:44:03 INFO : Executor - /rtapp:base:rta/2/trace_stat.json\n", - "03:44:03 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "03:44:03 INFO : Executor - Experiment 3/6, [base:rta] 3/3\n", - "03:44:03 WARNING : Executor - FTrace events collection enabled\n", - "03:44:09 INFO : WlGen - Workload execution START:\n", - "03:44:09 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "03:44:14 INFO : Executor - Collected FTrace binary trace:\n", - "03:44:14 INFO : Executor - /rtapp:base:rta/3/trace.dat\n", - "03:44:14 INFO : Executor - Collected FTrace function profiling:\n", - "03:44:14 INFO : Executor - /rtapp:base:rta/3/trace_stat.json\n", - "03:44:14 INFO : \n", - "03:44:14 INFO : ================================================================================\n", - "03:44:14 INFO : TargetConfig - configuring target for [eas] experiments\n", - "03:44:15 INFO : SchedFeatures - Set scheduler feature: ENERGY_AWARE\n", - "03:44:15 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", - "03:44:16 INFO : WlGen - Setup new workload rta\n", - "03:44:16 INFO : RTApp - Workload duration defined by longest task\n", - "03:44:16 INFO : RTApp - Default policy: SCHED_OTHER\n", - "03:44:16 INFO : RTApp - ------------------------\n", - "03:44:16 INFO : RTApp - task [task_p20], sched: using default policy\n", - "03:44:16 INFO : RTApp - | calibration CPU: 1\n", - "03:44:16 INFO : RTApp - | loops count: 1\n", - "03:44:16 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", - "03:44:16 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", - "03:44:16 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", - "03:44:16 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "03:44:16 INFO : Executor - Experiment 4/6, [eas:rta] 1/3\n", - "03:44:16 WARNING : Executor - FTrace events collection enabled\n", - "03:44:22 INFO : WlGen - Workload execution START:\n", - "03:44:22 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "03:44:28 INFO : Executor - Collected FTrace binary trace:\n", - "03:44:28 INFO : Executor - /rtapp:eas:rta/1/trace.dat\n", - "03:44:28 INFO : Executor - Collected FTrace function profiling:\n", - "03:44:28 INFO : Executor - /rtapp:eas:rta/1/trace_stat.json\n", - "03:44:28 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "03:44:28 INFO : Executor - Experiment 5/6, [eas:rta] 2/3\n", - "03:44:28 WARNING : Executor - FTrace events collection enabled\n", - "03:44:34 INFO : WlGen - Workload execution START:\n", - "03:44:34 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "03:44:40 INFO : Executor - Collected FTrace binary trace:\n", - "03:44:40 INFO : Executor - /rtapp:eas:rta/2/trace.dat\n", - "03:44:40 INFO : Executor - Collected FTrace function profiling:\n", - "03:44:40 INFO : Executor - /rtapp:eas:rta/2/trace_stat.json\n", - "03:44:40 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "03:44:40 INFO : Executor - Experiment 6/6, [eas:rta] 3/3\n", - "03:44:40 WARNING : Executor - FTrace events collection enabled\n", - "03:44:46 INFO : WlGen - Workload execution START:\n", - "03:44:46 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "03:44:52 INFO : Executor - Collected FTrace binary trace:\n", - "03:44:52 INFO : Executor - /rtapp:eas:rta/3/trace.dat\n", - "03:44:52 INFO : Executor - Collected FTrace function profiling:\n", - "03:44:52 INFO : Executor - /rtapp:eas:rta/3/trace_stat.json\n", - "03:44:52 INFO : \n", - "03:44:52 INFO : ################################################################################\n", - "03:44:52 INFO : Executor - Experiments execution completed\n", - "03:44:52 INFO : ################################################################################\n", - "03:44:52 INFO : Executor - Results available in:\n", - "03:44:52 INFO : Executor - /home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\n" + "01:51:01 INFO : \n", + "01:51:01 INFO : ################################################################################\n", + "01:51:01 INFO : Executor - Experiments execution\n", + "01:51:01 INFO : ################################################################################\n", + "01:51:01 INFO : \n", + "01:51:01 INFO : ================================================================================\n", + "01:51:01 INFO : TargetConfig - configuring target for [base] experiments\n", + "01:51:03 INFO : SchedFeatures - Set scheduler feature: NO_ENERGY_AWARE\n", + "01:51:04 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", + "01:51:05 INFO : WlGen - Setup new workload rta\n", + "01:51:05 INFO : RTApp - Workload duration defined by longest task\n", + "01:51:05 INFO : RTApp - Default policy: SCHED_OTHER\n", + "01:51:05 INFO : RTApp - ------------------------\n", + "01:51:05 INFO : RTApp - task [task_p200], sched: using default policy\n", + "01:51:05 INFO : RTApp - | calibration CPU: 1\n", + "01:51:05 INFO : RTApp - | loops count: 1\n", + "01:51:05 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:51:05 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:51:05 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:51:05 INFO : RTApp - ------------------------\n", + "01:51:05 INFO : RTApp - task [task_p201], sched: using default policy\n", + "01:51:05 INFO : RTApp - | calibration CPU: 1\n", + "01:51:05 INFO : RTApp - | loops count: 1\n", + "01:51:05 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:51:05 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:51:05 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:51:05 INFO : RTApp - ------------------------\n", + "01:51:05 INFO : RTApp - task [task_p202], sched: using default policy\n", + "01:51:05 INFO : RTApp - | calibration CPU: 1\n", + "01:51:05 INFO : RTApp - | loops count: 1\n", + "01:51:05 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:51:05 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:51:05 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:51:05 INFO : RTApp - ------------------------\n", + "01:51:05 INFO : RTApp - task [task_p203], sched: using default policy\n", + "01:51:05 INFO : RTApp - | calibration CPU: 1\n", + "01:51:05 INFO : RTApp - | loops count: 1\n", + "01:51:05 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:51:05 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:51:05 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:51:05 INFO : RTApp - ------------------------\n", + "01:51:05 INFO : RTApp - task [task_p204], sched: using default policy\n", + "01:51:05 INFO : RTApp - | calibration CPU: 1\n", + "01:51:05 INFO : RTApp - | loops count: 1\n", + "01:51:05 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:51:05 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:51:05 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:51:05 INFO : RTApp - ------------------------\n", + "01:51:05 INFO : RTApp - task [task_p205], sched: using default policy\n", + "01:51:05 INFO : RTApp - | calibration CPU: 1\n", + "01:51:05 INFO : RTApp - | loops count: 1\n", + "01:51:05 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:51:05 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:51:05 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:51:06 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:51:06 INFO : Executor - Experiment 0/6, [base:rta] 1/3\n", + "01:51:06 WARNING : Executor - FTrace events collection enabled\n", + "01:51:17 INFO : WlGen - Workload execution START:\n", + "01:51:17 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:51:30 INFO : Executor - Collected FTrace binary trace:\n", + "01:51:30 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", + "01:51:31 INFO : Executor - Collected FTrace function profiling:\n", + "01:51:31 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", + "01:51:31 INFO : --------------------------------------------------------------------------------\n", + "01:51:31 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:51:31 INFO : Executor - Experiment 1/6, [base:rta] 2/3\n", + "01:51:31 WARNING : Executor - FTrace events collection enabled\n", + "01:51:43 INFO : WlGen - Workload execution START:\n", + "01:51:43 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:51:52 INFO : Executor - Collected FTrace binary trace:\n", + "01:51:52 INFO : Executor - /rtapp:base:rta/2/trace.dat\n", + "01:51:53 INFO : Executor - Collected FTrace function profiling:\n", + "01:51:53 INFO : Executor - /rtapp:base:rta/2/trace_stat.json\n", + "01:51:53 INFO : --------------------------------------------------------------------------------\n", + "01:51:53 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:51:53 INFO : Executor - Experiment 2/6, [base:rta] 3/3\n", + "01:51:53 WARNING : Executor - FTrace events collection enabled\n", + "01:52:05 INFO : WlGen - Workload execution START:\n", + "01:52:05 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:52:19 INFO : Executor - Collected FTrace binary trace:\n", + "01:52:19 INFO : Executor - /rtapp:base:rta/3/trace.dat\n", + "01:52:20 INFO : Executor - Collected FTrace function profiling:\n", + "01:52:20 INFO : Executor - /rtapp:base:rta/3/trace_stat.json\n", + "01:52:20 INFO : --------------------------------------------------------------------------------\n", + "01:52:20 INFO : \n", + "01:52:20 INFO : ================================================================================\n", + "01:52:20 INFO : TargetConfig - configuring target for [eas] experiments\n", + "01:52:22 INFO : SchedFeatures - Set scheduler feature: ENERGY_AWARE\n", + "01:52:23 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", + "01:52:24 INFO : WlGen - Setup new workload rta\n", + "01:52:24 INFO : RTApp - Workload duration defined by longest task\n", + "01:52:24 INFO : RTApp - Default policy: SCHED_OTHER\n", + "01:52:24 INFO : RTApp - ------------------------\n", + "01:52:24 INFO : RTApp - task [task_p200], sched: using default policy\n", + "01:52:24 INFO : RTApp - | calibration CPU: 1\n", + "01:52:24 INFO : RTApp - | loops count: 1\n", + "01:52:24 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:52:24 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:52:24 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:52:24 INFO : RTApp - ------------------------\n", + "01:52:24 INFO : RTApp - task [task_p201], sched: using default policy\n", + "01:52:24 INFO : RTApp - | calibration CPU: 1\n", + "01:52:24 INFO : RTApp - | loops count: 1\n", + "01:52:24 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:52:24 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:52:24 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:52:24 INFO : RTApp - ------------------------\n", + "01:52:24 INFO : RTApp - task [task_p202], sched: using default policy\n", + "01:52:24 INFO : RTApp - | calibration CPU: 1\n", + "01:52:24 INFO : RTApp - | loops count: 1\n", + "01:52:24 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:52:24 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:52:24 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:52:24 INFO : RTApp - ------------------------\n", + "01:52:24 INFO : RTApp - task [task_p203], sched: using default policy\n", + "01:52:24 INFO : RTApp - | calibration CPU: 1\n", + "01:52:24 INFO : RTApp - | loops count: 1\n", + "01:52:24 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:52:24 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:52:24 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:52:24 INFO : RTApp - ------------------------\n", + "01:52:24 INFO : RTApp - task [task_p204], sched: using default policy\n", + "01:52:24 INFO : RTApp - | calibration CPU: 1\n", + "01:52:24 INFO : RTApp - | loops count: 1\n", + "01:52:24 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:52:24 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:52:24 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:52:24 INFO : RTApp - ------------------------\n", + "01:52:24 INFO : RTApp - task [task_p205], sched: using default policy\n", + "01:52:24 INFO : RTApp - | calibration CPU: 1\n", + "01:52:24 INFO : RTApp - | loops count: 1\n", + "01:52:24 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "01:52:24 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "01:52:24 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "01:52:24 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:52:24 INFO : Executor - Experiment 0/6, [base:rta] 1/3\n", + "01:52:24 WARNING : Executor - FTrace events collection enabled\n", + "01:52:37 INFO : WlGen - Workload execution START:\n", + "01:52:37 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:52:47 INFO : Executor - Collected FTrace binary trace:\n", + "01:52:47 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", + "01:52:48 INFO : Executor - Collected FTrace function profiling:\n", + "01:52:48 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", + "01:52:48 INFO : --------------------------------------------------------------------------------\n", + "01:52:48 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:52:48 INFO : Executor - Experiment 1/6, [base:rta] 2/3\n", + "01:52:48 WARNING : Executor - FTrace events collection enabled\n", + "01:53:00 INFO : WlGen - Workload execution START:\n", + "01:53:00 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:53:12 INFO : Executor - Collected FTrace binary trace:\n", + "01:53:12 INFO : Executor - /rtapp:base:rta/2/trace.dat\n", + "01:53:13 INFO : Executor - Collected FTrace function profiling:\n", + "01:53:13 INFO : Executor - /rtapp:base:rta/2/trace_stat.json\n", + "01:53:13 INFO : --------------------------------------------------------------------------------\n", + "01:53:13 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:53:13 INFO : Executor - Experiment 2/6, [base:rta] 3/3\n", + "01:53:13 WARNING : Executor - FTrace events collection enabled\n", + "01:53:25 INFO : WlGen - Workload execution START:\n", + "01:53:25 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:53:35 INFO : Executor - Collected FTrace binary trace:\n", + "01:53:35 INFO : Executor - /rtapp:base:rta/3/trace.dat\n", + "01:53:36 INFO : Executor - Collected FTrace function profiling:\n", + "01:53:36 INFO : Executor - /rtapp:base:rta/3/trace_stat.json\n", + "01:53:36 INFO : --------------------------------------------------------------------------------\n", + "01:53:36 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:53:36 INFO : Executor - Experiment 3/6, [eas:rta] 1/3\n", + "01:53:36 WARNING : Executor - FTrace events collection enabled\n", + "01:53:48 INFO : WlGen - Workload execution START:\n", + "01:53:48 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:53:57 INFO : Executor - Collected FTrace binary trace:\n", + "01:53:57 INFO : Executor - /rtapp:eas:rta/1/trace.dat\n", + "01:53:58 INFO : Executor - Collected FTrace function profiling:\n", + "01:53:58 INFO : Executor - /rtapp:eas:rta/1/trace_stat.json\n", + "01:53:58 INFO : --------------------------------------------------------------------------------\n", + "01:53:58 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:53:58 INFO : Executor - Experiment 4/6, [eas:rta] 2/3\n", + "01:53:58 WARNING : Executor - FTrace events collection enabled\n", + "01:54:10 INFO : WlGen - Workload execution START:\n", + "01:54:10 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:54:22 INFO : Executor - Collected FTrace binary trace:\n", + "01:54:22 INFO : Executor - /rtapp:eas:rta/2/trace.dat\n", + "01:54:23 INFO : Executor - Collected FTrace function profiling:\n", + "01:54:23 INFO : Executor - /rtapp:eas:rta/2/trace_stat.json\n", + "01:54:23 INFO : --------------------------------------------------------------------------------\n", + "01:54:23 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "01:54:23 INFO : Executor - Experiment 5/6, [eas:rta] 3/3\n", + "01:54:23 WARNING : Executor - FTrace events collection enabled\n", + "01:54:35 INFO : WlGen - Workload execution START:\n", + "01:54:35 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "01:54:45 INFO : Executor - Collected FTrace binary trace:\n", + "01:54:45 INFO : Executor - /rtapp:eas:rta/3/trace.dat\n", + "01:54:46 INFO : Executor - Collected FTrace function profiling:\n", + "01:54:46 INFO : Executor - /rtapp:eas:rta/3/trace_stat.json\n", + "01:54:46 INFO : --------------------------------------------------------------------------------\n", + "01:54:46 INFO : \n", + "01:54:46 INFO : ################################################################################\n", + "01:54:46 INFO : Executor - Experiments execution completed\n", + "01:54:46 INFO : ################################################################################\n", + "01:54:46 INFO : Executor - Results available in:\n", + "01:54:46 INFO : Executor - /home/bjackman/sources/lisa/results/KernelFunctionsProfilingExample\n" ] } ], @@ -351,19 +482,11 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\n" - ] - } - ], + "outputs": [], "source": [ "res_dir = \"/home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\"\n", "out_dir = \"/home/derkling/Code/lisa/results/KernelFunctionsProfilingExample/rtapp:eas:rta/2/trace.dat\"\n", @@ -373,7 +496,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 11, "metadata": { "collapsed": false, "scrolled": false @@ -383,31 +506,46 @@ "name": "stderr", "output_type": "stream", "text": [ - "03:44:52 INFO : Content of the output folder /home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\n" + "01:56:21 INFO : Content of the output folder /home/bjackman/sources/lisa/results/KernelFunctionsProfilingExample\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[01;34m/home/derkling/Code/lisa/results/KernelFunctionsProfilingExample\u001b[00m\r\n", + "\u001b[01;34m/home/bjackman/sources/lisa/results/KernelFunctionsProfilingExample\u001b[00m\r\n", "├── \u001b[01;34mrtapp:base:rta\u001b[00m\r\n", "│   ├── \u001b[01;34m1\u001b[00m\r\n", "│   │   ├── output.log\r\n", "│   │   ├── rta_00.json\r\n", - "│   │   ├── rt-app-task_p20-0.log\r\n", + "│   │   ├── rt-app-task_p200-0.log\r\n", + "│   │   ├── rt-app-task_p201-1.log\r\n", + "│   │   ├── rt-app-task_p202-2.log\r\n", + "│   │   ├── rt-app-task_p203-3.log\r\n", + "│   │   ├── rt-app-task_p204-4.log\r\n", + "│   │   ├── rt-app-task_p205-5.log\r\n", "│   │   ├── trace.dat\r\n", "│   │   └── trace_stat.json\r\n", "│   ├── \u001b[01;34m2\u001b[00m\r\n", "│   │   ├── output.log\r\n", "│   │   ├── rta_00.json\r\n", - "│   │   ├── rt-app-task_p20-0.log\r\n", + "│   │   ├── rt-app-task_p200-0.log\r\n", + "│   │   ├── rt-app-task_p201-1.log\r\n", + "│   │   ├── rt-app-task_p202-2.log\r\n", + "│   │   ├── rt-app-task_p203-3.log\r\n", + "│   │   ├── rt-app-task_p204-4.log\r\n", + "│   │   ├── rt-app-task_p205-5.log\r\n", "│   │   ├── trace.dat\r\n", "│   │   └── trace_stat.json\r\n", "│   ├── \u001b[01;34m3\u001b[00m\r\n", "│   │   ├── output.log\r\n", "│   │   ├── rta_00.json\r\n", - "│   │   ├── rt-app-task_p20-0.log\r\n", + "│   │   ├── rt-app-task_p200-0.log\r\n", + "│   │   ├── rt-app-task_p201-1.log\r\n", + "│   │   ├── rt-app-task_p202-2.log\r\n", + "│   │   ├── rt-app-task_p203-3.log\r\n", + "│   │   ├── rt-app-task_p204-4.log\r\n", + "│   │   ├── rt-app-task_p205-5.log\r\n", "│   │   ├── trace.dat\r\n", "│   │   └── trace_stat.json\r\n", "│   ├── kernel.config\r\n", @@ -417,26 +555,41 @@ " ├── \u001b[01;34m1\u001b[00m\r\n", " │   ├── output.log\r\n", " │   ├── rta_00.json\r\n", - " │   ├── rt-app-task_p20-0.log\r\n", + " │   ├── rt-app-task_p200-0.log\r\n", + " │   ├── rt-app-task_p201-1.log\r\n", + " │   ├── rt-app-task_p202-2.log\r\n", + " │   ├── rt-app-task_p203-3.log\r\n", + " │   ├── rt-app-task_p204-4.log\r\n", + " │   ├── rt-app-task_p205-5.log\r\n", " │   ├── trace.dat\r\n", " │   └── trace_stat.json\r\n", " ├── \u001b[01;34m2\u001b[00m\r\n", " │   ├── output.log\r\n", " │   ├── rta_00.json\r\n", - " │   ├── rt-app-task_p20-0.log\r\n", + " │   ├── rt-app-task_p200-0.log\r\n", + " │   ├── rt-app-task_p201-1.log\r\n", + " │   ├── rt-app-task_p202-2.log\r\n", + " │   ├── rt-app-task_p203-3.log\r\n", + " │   ├── rt-app-task_p204-4.log\r\n", + " │   ├── rt-app-task_p205-5.log\r\n", " │   ├── trace.dat\r\n", " │   └── trace_stat.json\r\n", " ├── \u001b[01;34m3\u001b[00m\r\n", " │   ├── output.log\r\n", " │   ├── rta_00.json\r\n", - " │   ├── rt-app-task_p20-0.log\r\n", + " │   ├── rt-app-task_p200-0.log\r\n", + " │   ├── rt-app-task_p201-1.log\r\n", + " │   ├── rt-app-task_p202-2.log\r\n", + " │   ├── rt-app-task_p203-3.log\r\n", + " │   ├── rt-app-task_p204-4.log\r\n", + " │   ├── rt-app-task_p205-5.log\r\n", " │   ├── trace.dat\r\n", " │   └── trace_stat.json\r\n", " ├── kernel.config\r\n", " ├── kernel.version\r\n", " └── platform.json\r\n", "\r\n", - "8 directories, 36 files\r\n" + "8 directories, 66 files\r\n" ] } ], @@ -456,7 +609,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 12, "metadata": { "collapsed": false, "scrolled": false @@ -507,7 +660,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 13, "metadata": { "collapsed": false }, @@ -543,7 +696,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -562,7 +715,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 15, "metadata": { "collapsed": false, "scrolled": false @@ -572,16 +725,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "03:44:53 INFO : Plotting stats for [dequeue_task_fair] function\n", - "03:44:53 INFO : Plotting stats for [enqueue_task_fair] function\n", - "03:44:53 INFO : Plotting stats for [select_task_rq_fair] function\n" + "01:56:33 INFO : Plotting stats for [dequeue_task_fair] function\n", + "01:56:33 INFO : Plotting stats for [enqueue_task_fair] function\n", + "01:56:33 INFO : Plotting stats for [select_task_rq_fair] function\n", + "/usr/lib/pymodules/python2.7/matplotlib/collections.py:548: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + " if self._edgecolors == 'face':\n" ] }, { "data": { - "image/png": "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\nqwKqWu8aAAAAmBtVtX8WNQIAAFis1q5dm/Xr1/cuY95as2ZN7r777kfVxhlSAACAvTA809e7jHlr\nd+/Pns6QznqVXQAAANgXAikAAABdCKQAAAB0IZACAADQhUAKAABAFwIpAADAPlq1am2qas4eq1at\n7f0S55TbvgAAAOyFmW5rUlVJ5jLPLJxbzbjtCwAAwAHq3nvvzTnnnJNjjjkmJ510Ut773vcmSW65\n5ZY861nPylFHHZXVq1fnoosuyo4dO6bave51r8vKlStzxBFH5GlPe1rWrVu332oWSAEAABa41lrO\nOuusnHbaabn33ntzww035D3veU8++9nPZunSpXn3u9+diYmJfPGLX8yNN96Y97///UmS66+/Pjfd\ndFO+8Y1v5L777svHP/7xrFixYr/VLZACAAAscLfccku+973v5dJLL81BBx2UtWvX5lWvelWuvvrq\nnHbaaTn99NNTVTnhhBPy6le/Op/73OeSJAcffHDuv//+rFu3Lq21nHzyyVm5cuV+q3vpfhsJAACA\nObF+/fps3Lgxy5cvTzJ5xnTnzp157nOfmzvvvDOvf/3rc+utt+YHP/hBduzYkac//elJkuc973m5\n8MIL89rXvjYbNmzIi1/84lx++eU57LDD9kvdzpACAAAscMcff3ye+MQnZmJiIhMTE9myZUvuu+++\nXHfddXnNa16TU045JXfddVe2bt2at73tbT+2+NCFF16YW2+9NevWrcsdd9yRd77znfutboEUAABg\ngTv99NNz+OGH5x3veEcefPDBPPTQQ/nKV76SW2+9Ndu3b8+yZcty6KGH5mtf+1quuOKKqXa33npr\nbr755uzYsSOHHHJIHve4x2XJkv0XEwVSAACAfbRy5ZokNWePyf4f2ZIlS/LpT386t912W0488cQc\nc8wxOf/887Nt27Zcfvnl+ehHP5ply5blggsuyLnnnjvVbtu2bTn//POzfPnynHjiiTn66KPzhje8\nYdbvy95yH1IAAIC9sLv7bDLJfUgBAABYMARSAAAAuhBIAQAA6EIgBQAAoAuBFAAAgC4EUgAAALoQ\nSAEAAOhCIAUAAKALgRQAAGAROPHEE3PjjTf2LuNREUgBAAD20arjVqWq5uyx6rhVvV/inFrauwAA\nAICFavPGzcnYHPY/tnnuOp8HnCEFAABYJG6++eY85SlPyYoVK/LKV74yP/zhD7N169acddZZOeaY\nY7JixYqcddZZ2bhx41Sb3//9389JJ52UZcuW5aSTTspVV1019dwHP/jBPPnJT86KFSvywhe+MBs2\nbBhpvQIpAADAIvGxj30sn/3sZ3PXXXfljjvuyFvf+ta01vKKV7wi99xzTzZs2JBDDz00F154YZLk\ngQceyMUXX5zPfOYz2bZtW77whS/k1FNPTZJ86lOfytvf/vZ88pOfzHe/+9085znPyUtf+tKR1iuQ\nAgAALBIXXXRRjj322Bx55JG59NJLc9VVV+Woo47KL/zCL+Sxj31sHv/4x+eSSy7J5z//+ak2Bx10\nUG6//fY8+OCDWblyZU455ZQkyZVXXplLLrkkT3rSk7JkyZK88Y1vzG233ZZ77rlnZPUKpAAAAIvE\ncccdN7W9Zs2afPvb386DDz6YCy64IGvXrs2RRx6ZM844I1u3bk1rLYceemiuueaaXHHFFXnCE56Q\ns846K1//+teTJOvXr8/FF1+c5cuXZ/ny5VmxYkWq6sem+86WQAoAALBITD97uX79+hx77LG5/PLL\nc+edd+aWW27J1q1bp86OttaSJGeeeWauv/76bNq0KSeffHLOP//8JMnxxx+fK6+8MhMTE5mYmMiW\nLVuyffv2PPOZzxxZvQIpAADAIvG+970vGzduzMTERC677LK85CUvyfbt23PIIYdk2bJlmZiYyNjY\n2NTx3/nOd3LttdfmgQceyMEHH5zDDjssS5ZMxsRf+qVfymWXXZZ169YlSe6777584hOfGGm9bvsC\nAACwj1auXjmnt2ZZuXrlXh9bVTnvvPPyghe8IPfee2/OPvvsvOlNb8qWLVty3nnn5eijj87q1avz\nq7/6q7n22muTJDt37sy73vWuvOxlL0tV5dRTT80VV1yRJDn77LPz/e9/P+eee242bNiQI444Imee\neWbOOeeckb2+evg0bS9V1XrXAAAA8EiqKrLL7u3u/Rnur5namLILAABAFwIpAAAAXQikAAAAdCGQ\nAgAA0IVACgAAQBcCKQAAAF24DykAAMBeWLNmTapmvHsJmXx/Hi33IQUAAGDOuA8pAAAA844puwDA\nojQ+Pp7x8fGp7cFgkCQZDAZT2wD0ZcouALDoDaeL9S4D4IBkyi4AAADzjkAKAABAFwIpAAAAXQik\nAAAAdCGQAgAA0IVACgAAQBcCKQAAAF0IpAAAAHQhkAIAANDFrANpVR1XVTdW1Veq6vaqumi4/81V\n9a2q+qvh41/MvlwAAAAWi2qtza6DqlVJVrXWbquqw5J8KcnPJ3lJkvtba+96hPZttjUAAOxJVcXv\nGwB9DL8H10zPLZ1t5621TUk2Dbe3V9VXk6x+eOzZ9g8AAMDiNNJrSKtqbZJTk/yf4a4Lq+q2qvq9\nqjpilGMBAACwsM36DOnDhtN1P5Hk4uGZ0vcn+c3WWquqtyZ5V5JXztR2bGxsanswGGQwGIyqLAAA\nAPaj8fHxjI+P79Wxs76GNEmqammSTyf5X62198zw/Jok17XWnjrDc64hBQDmlGtIAfrZ0zWko5qy\n+8Ek66aH0eFiRw97cZIvj2gsAAAAFoFRrLL77CSfT3J7kjZ8/EaS8zJ5PenOJHcnuaC1tnmG9s6Q\nAgBzyhlSgH72dIZ0JFN2Z0MgBQDmmkAK0M/+mLILAAAAj4pACgAAQBcCKQAAAF0IpAAAAHSxtHcB\nAAAAc2l8fDzj4+NT24PBIEkyGAymtunDKrsAwKJnlV3gYb4f7H9W2QUAAGDeEUgBAADoQiAFAACg\nC4EUAACALgRSAAAAuhBIAQAA6EIgBQAAoAuBFAAAgC4EUgAAALoQSAEAAOhCIAUAAKALgRQAAIAu\nBFIAAAC6WNq7AAAAgAPN+Ph4xsfHp7YHg0GSZDAYTG0fCKq11reAqta7BgBgcauq+H0DSObn94P5\nWNMoDV9fzfScKbsAAAB0IZACAADQhUAKAABAFwIpAAAAXQikAAAAdCGQAgAA0IVACgAAQBcCKQAA\nAF0IpAAAAHQhkAIAANCFQAoAAEAXAikAAABdCKQAAAB0IZACAADQhUAKAABAFwIpAAAAXQikAAAA\ndCGQAgAA0IVACgAAQBcCKQAAAF0IpAAAAHQhkAIAANCFQAoAAEAXAikAAABdCKQAAAB0IZACAADQ\nhUAKAABAFwIpAAAAXQikAAAAdCGQAgAA0IVACgAAQBcCKQAAAF0IpAAAAHQhkAIAANCFQAoAAEAX\nsw6kVXVcVd1YVV+pqtur6j8O9x9VVddX1R1V9ZmqOmL25QIAALBYVGttdh1UrUqyqrV2W1UdluRL\nSX4+ycuT/G1r7R1V9etJjmqtvXGG9m22NQAA7ElVxe8bQDI/vx/Mx5pGafj6aqbnZn2GtLW2qbV2\n23B7e5KvJjkuk6H0w8PDPpzk7NmOBQAAwOIx0mtIq2ptklOT/GWSla21zclkaE1yzCjHAgAAYGEb\nWSAdTtf9RJKLh2dKdz3nvHjPQQMAAPCoLR1FJ1W1NJNh9COttU8Nd2+uqpWttc3D60y/s7v2Y2Nj\nU9uDwSCDwWAUZQEAALCfjY+PZ3x8fK+OnfWiRklSVf89yfdaa6+ftu+3kky01n7LokYAQE+LfcEQ\nYO/Nx+8H87GmUdrTokajWGX32Uk+n+T2TE7LbUl+I8nNST6e5Pgk65P8Ymtt6wztBVIAYE4t9l/2\ngL03H78fzMeaRmlOA+lsCaQAsPBNn541Pj4+dfnNfLkUZ7H/sgfsvfn4/WA+1jRKAikAsN/Mx1+s\n5mNNQB/z8fvBfKxplOb0PqQAAACwLwRSAAAAuhBIAQAA6EIgBQAAoAuBFAAAgC4EUgAAALoQSAEA\nAOhCIAUAAKALgRQAAIAuBFIAAAC6EEgBAADoQiAFAACgC4EUAACALgRSAAAAuhBIAQAA6EIgBQAA\noAuBFAAAgC4EUgAAALoQSAEAAOhCIAUAAKALgRQAAIAuBFIAAAC6EEgBAADoQiAFAACgi6W9C2D/\nGB8fz/j4+NT2YDBIkgwGg6ltAACYr1atWpvNm9ePpK+qGkk/K1euyaZNd4+krwNVtdb6FlDVetdw\noKmqeM8BmCvz8efMfKwJeHQmQ+Qo/j8eVT+TfY3ie8ti/x41fH0z/hXAlF0AAAC6EEgBAADoQiAF\nAACgC4EUAACALgRSAAAAuhBIAQAA6EIgBQAAoIulvQtYjMbHxzM+Pj61PRgMkiSDwWBqGwDYs1XH\nrcrmjZtH1t/kPQxnZ+Xqldn0rU0jqAaAJKneN2Ctqta7hrk0H29yOx9rAmDxGNXPmapKxmZfT5LJ\nfkbR11j8DIVOJv+oNIr//0bVz2Rfo/p+t5i/twxf34x/FTRlFwAAgC4EUgAAALoQSAEAAOhCIAUA\nAKALgRQAAIAuBFIAAAC6EEgBAADoQiAFAACgC4EUAACALpb2LgAAAKYbHx/P+Pj41PZgMEiSDAaD\nqW1gcajWWt8CqlrvGuZSVWW+vb75WBMAi8eofs5UVTI2+3qSTPYzir7G4mfofub3Fh5WVUlG8VkY\nVT+TfY3q+91i/pwPX1/N9JwpuwAAAHQhkAIAANCFQAoAAEAXAikAAABdCKQAAAB04bYvAAAA++Kg\nh1f/nb1R9bNy9cps+tamkfS1PwikAAAA++KhjOyWUqO6zdXmsc2j6Wg/MWUXAACALgRSAAAAujBl\nFxaA8fHxjI+PT20PBoMkyWAwmNoGAICFZiSBtKo+kORFSTa31p463PfmJOcn+c7wsN9orf3pKMaD\nA8304FlVU+EUAAAWslFN2f1Qkp+bYf+7Wms/PXwIowAAAEwZSSBtrd2UZMsMT41m7WIAAAAWnble\n1OjCqrqtqn6vqo6Y47EAAABYQOZyUaP3J/nN1lqrqrcmeVeSV8504NjY2NS2RVoAAAAWrukLcj6S\nOQukrbXvTvvyvyW5bnfHTg+kAAAALFy7nmR8y1vesttjRzlltzLtmtGqWjXtuRcn+fIIxwIAAGCB\nG9VtXz6WZJBkRVVtSPLmJM+rqlOT7Exyd5ILRjEWAAAAi8NIAmlr7bwZdn9oFH0DAACwOM3lokYA\nzFPTFxsYHx+fus7DwnIAwP4kkAIcgKYHz6ra65XwAABGaa7vQwoAAAAzEkgBAADoQiAFAACgC9eQ\nAgBZtWptNm9eP7L+quqRDwLggCeQAgDDMNpG1FuNqC+hFmCxM2UXAACALgRSAAAAuhBIAQAA6EIg\nBQAAoAuBFAAAgC6ssgvAvDA+Pp7x8fGp7cFgkCQZDAZT2wDA4iKQAjAvTA+eVTUVTgGAxcuUXQAA\nALoQSAEAAOjClF1gn7jeDwCA2RJIgX3iej8AAGbLlF0AAAC6EEgBAADoQiAFAACgC9eQ7saqVWuz\nefP6kfRVVSPpZ8ljlmTnD3eOpK9R1bRy9cps+tamkfQFAAAcWATS3ZgMo20EPdWI+kl2/rCSsRF0\nNJbR9JNk89jm0XQEAAAccEzZBQAAoAuBFAAAgC4EUgAAALoQSAEAAOhCIAUAYORWrVqbqpr1I8lI\n+qmqrFq1tu+bAvwDVtkFAGDk5uMdCzZvnt1t78bHxzM+Pj61PRgMkiSDwWBqG3h0BFIAANgL04Nn\nVU2FU2DfmbILAABAFwIpAAAAXQikAAAAdCGQAgAA0IVACgAAQBcCKQAAAF0IpAAAAHQhkAIAANCF\nQAoAAEAXAikAAABdCKQAAAB0IZACAADQhUAKAABAFwIpAAAAXQikAAvQqlVrU1UjeSQZST+rVq3t\n+6YAAAvO0t4FAPDobd68PkkbUW81kr42b67ZlwIAHFAEUgAAYJEbHz6S5IwkY8PtwfBBLwIpAACw\nyA0ieM5PriGF/WA+Xu/nmj8AAHpzhhT2g/l4vV/imj8AAPpyhhQAAIAuBFIAAAC6EEgBAADoQiAF\nAACgC4EUAACALgRSAAAAunDbFwAADgwHZeqe3qMwir5Wrl6ZTd/aNIJqYGEaSSCtqg8keVGSza21\npw73HZXkmiRrktyd5Bdba/eNYjwAAHjUHkoyNqK+xkbT1+axzbPvBBawUU3Z/VCSn9tl3xuT/Flr\n7eQkNya5ZERjAQAAsAiMJJC21m5KsmWX3T+f5MPD7Q8nOXsUYwEAALA4zOWiRse01jYnSWttU5Jj\n5nAsAAAAFpj9uahR290TY2NjU9uDwSCDwWA/lAMAAMCojY+PZ3x8fK+OnctAurmqVrbWNlfVqiTf\n2d2B0wMpsB+NcLXBUfVjtUEAgIVt15OMb3nLW3Z77CgDaQ0fD7s2yX9I8ltJXpbkUyMcCxiFUa02\nODaifmK1QQCAA8lIriGtqo8l+UKSJ1XVhqp6eZK3Jzmzqu5I8s+GXwMAAECSEZ0hba2dt5un/vko\n+gcAAGDx2Z+LGgGwmI3wmuTEdckAcCAQSAEYjVFdk5y4LhkADhBzeR9SAAAA2C2BFAAAgC4EUgAA\nALoQSAEAAOhCIAUAAKALgRQAAIAu3PZlTowPH0lyRv7+3gWD4QMAAACBdE4MIngCAOyr8fjjPhwY\nBFIAYATGI0AwOoP43MCBQSAFAEZgEAECgEfLokYAAAB0IZACAADQhUAKAABAFwIpAAAAXQikAAAA\ndGGV3QPFN5PcPdxek+TPh9trk5zYoR4AADiQ+f08iUB64DgxB9QHGwBg5AQIRsnv50kEUgAA2DsC\nBIycQAoALE7OZgHMewIpALA4OZsFMO8JpAAHpPHhI0nOSDI23B4MHwAAc08gBTggDSJ4AgC9uQ8p\nAAAAXQikAAAAdCGQAgAA0IVACgAAQBcCKQAAAF0IpAAAAHQhkAIAANCFQAoAAEAXAikAAABdCKQA\nAAB0IZACAADQhUAKAABAFwIpAAAAXQikAAAAdCGQAgAA0IVACgAAQBdLexcA7I3x4SNJzkgyNtwe\nDB8AALDwCKSwIAwieAIAsNgIpMC++WaSu4fba5L8+XB7bZITO9QDAMCCI5AC++bECJ4AAMyKRY0A\nAADoQiAFAACgC4EUAACALgRSAAAAuhBIAQAA6EIgBQAAoAuBFAAAgC4EUgAAALoQSAEAAOhCIAUA\nAKCLpb0LAIAkyTeT3D3cXpPkz4fba5Oc2KEeAGDOCaQAzA8nRvAEgAPMnAfSqro7yX1Jdib5UWvt\n9LkeEwAAgPlvf5wh3Zlk0Frbsh/GAgAAYIHYH4sa1X4aBwAAgAVkfwTFluSzVXVLVZ2/H8YDAABg\nAdgfU3af3Vq7t6p+IpPB9KuttZumHzA2Nja1PRgMMhgM9kNZAAAAjNr4+HjGx8f36tg5D6SttXuH\n/363qv44yelJdhtIAQAAWLh2Pcn4lre8ZbfHzumU3ao6tKoOG24/PskLknx5LscEAABgYZjrM6Qr\nk/xxVbXhWB9trV0/x2MCAACwAMxpIG2tfTPJqXM5BgAAAAuT27EAAADQhUAKAABAFwIpAAAAXQik\nAAAAdCGQAgAA0IVACgAAQBcCKQAAAF0IpAAAAHQhkAIAANCFQAoAAEAXAikAAABdCKQAAAB0IZAC\nAADQhUAKAABAFwIpAAAAXQikAAAAdCGQAgAA0IVACgAAQBcCKQAAAF0IpAAAAHQhkAIAANCFQAoA\nAEAXAikAAABdCKQAAAB0IZACAADQhUAKAABAFwIpAAAAXQikAAAAdCGQAgAA0IVACgAAQBcCKQAA\nAF0IpAAAAHQhkAIAANCFQAoAAEAXAikAAABdCKQAAAB0IZACAADQhUAKAABAFwIpAAAAXQikAAAA\ndCGQAgAA0IVACgAAQBcCKQAAAF0IpAAAAHQhkAIAANCFQAoAAEAXAikAAABdCKQAAAB0IZACAADQ\nhUAKAABAFwIpAAAAXQikAAAAdCGQAgAA0IVACgAAQBcCKQAAAF0IpAAAAHQhkAIAANDFnAfSqvoX\nVfW1qvp6Vf36XI8HAADAwjCngbSqliT5nSQ/l+QpSV5aVT81l2MCAACwMMz1GdLTk9zZWlvfWvtR\nkquT/PwcjwkAAMACMNeBdHWSe6Z9/a3hPgAAAA5w1Vqbu86r/k2Sn2utvXr49b9Pcnpr7T9OO2bu\nCgAAAKC71lrNtH/pHI+7MckJ074+brhvyu4KAwAAYHGb6ym7tyT5yapaU1WPSXJukmvneEwAAAAW\ngDk9Q9pae6iqLkxyfSbD7wdaa1+dyzEBAABYGOb0GlIAAADYnbmesgsAAAAzmutFjdhHVfVTmbxn\n68O3ydmY5FpTnoH5Yvh9anWS/9Na2z5t/79orf1pv8pYqKrq2Um2tNbWVdUZSZ6R5LbW2g2dS2MR\nqKr/3lr7f3vXweJRVT+b5PQkX26tXd+7noXKlN15qKp+PclLk1ydyXu3JpMrFJ+b5OrW2tt71cbi\nVFUvb619qHcdLBxV9R+TvDbJV5OcmuTi1tqnhs/9VWvtp3vWx8JTVZcleX4mZ2+NJ3lukj9JcmYm\n/yB7eb8FzktdAAAgAElEQVTqWGiqatdFNCvJ85LcmCSttX+934tiwauqm1trpw+3z8/kz8E/TvKC\nJNf5HX3fCKTzUFV9PclTWms/2mX/Y5J8pbX2j/pUxmJVVRtaayc88pEwqapuT/JPW2vbq2ptkk8k\n+Uhr7T1V9dettdO6FsiCU1VfSfLUJI9NsinJca21bVV1SJK/bK09rWuBLChV9VdJ1iX5vSQtk4H0\nqkz+cT+ttc/1q46FavrPt6q6Jcm/bK19t6oen8nvU/+kb4ULkym789POJMcmWb/L/icMn4NHrar+\nv909lWTl/qyFRWHJw9N0W2t3V9UgySeqak0mP1PwaP2wtfZQkgeq6q7W2rYkaa39oKr87OPRekaS\ni5NcmuQNrbXbquoHgiiztKSqjsrkTI6DWmvfTZLW2verakff0hYugXR++pUkN1TVnUnuGe47IclP\nJrmwW1UsdCuT/FySLbvsryRf2P/lsMBtrqpTW2u3JcnwTOmLknwwib8Qsy9+WFWHttYeSPL0h3dW\n1RGZPMMFe621tjPJb1fVHw7/3Ry/9zJ7RyT5UiZ/d2pV9YTW2r1VdVj8MXafmbI7T1XVkkxeJD19\nUaNbhn89hketqj6Q5EOttZtmeO5jrbXzOpTFAlVVxyXZ0VrbNMNzz26t/e8OZbGAVdVjW2t/N8P+\no5M8obV2e4eyWCSq6l8leXZr7Td618LiU1WHJlnZWvtm71oWIoEUAACALtyHFAAAgC4EUgAAALoQ\nSAEAAOhCIAUAAKALgRQAAIAuBFIAAAC6EEgBAADoQiAFAACgC4EUAACALgRSAAAAuhBIAQAA6EIg\nBQAAoAuBFAAAgC4EUgAAALoQSAEAAOhCIAUAAKALgRQAAIAuBFIAAAC6EEgBAADoQiAFAACgC4EU\nAACALgRSAAAAuhBIAQAA6EIgBQAAoAuBFAAAgC4EUgAAALoQSAEAAOhCIAUAAKALgRQAAIAuBFIA\nAAC6EEgBAADoQiAFAACgC4EUAACALgRSAAAAuhBIAQAA6EIgBQAAoAuBFAAAgC4EUgAAALoQSAEA\nAOhCIAUAAKALgRQAAIAuBFIAAAC6EEgBAADoQiAFAACgC4EUAACALgRSAAAAuhBIAQAA6EIgBQAA\noAuBFAAAgC4EUgAAALoQSAEAAOhCIAUAAKALgRQAFomq+lBV/eajbPO4qrquqrZW1TV7cfyXq+q5\n+14lAPy9pb0LAIADWVWdkeQPWmvHdyrhnCQ/keSo1lp7pINba/947ksC4EDhDCkA9FVJHjEIzqE1\nSb6+N2H0kVTVQSOoB4ADiEAKwLxVVU+oqk9U1Xeq6q6qumi4/81VdU1VfbiqtlXV7VX109PanVZV\nX6qq+6rq6qq66uGprFX1sqr6i13G2VlVTxxuP6aqLq+q9VV1b1W9v6oeO9u2u3l9hyb5n0mOrar7\nh69lVVX9TFV9oaq2VNXGqnpvVS2d1u63q2rz8PX9TVU9eYa+D6+qG6vq3XsYfyzJf05y7nDsl1fV\nE6vqhqr63vB9/4OqWjatzTer6vnT/jv8YVV9pKq2JnnZ7sYCgJkIpADMS1VVSa5L8tdJnpDknyW5\nuKrOHB5yVpKPJTlieNz7hu0OTvLHST6cZHmSP0zyb3bpftezgdO//q0kP5nkqcN/V2cytI2i7Y83\nbO2BJC9M8u3W2uGttWWttU1JHkryK8P6/2mS5yf55eHre0GSn03yk621I5L8YpK/nd5vVS1P8mdJ\n/qK19it7GH8syWVJrh6O/aFMnrG9LMmqJKckOS7J2O76SPKvk3y8tXZkko/u4TgA+AcEUgDmq59J\ncnRr7W2ttYdaa3cn+b0kLx0+f1Nr7TPDqaYfyWQITCYD3NLW2n8ZtvujJLc8wlg1bfv8JK9rrd3X\nWvt+krdPG3PUbWfUWvur1trNbdKGJL+b5Izh0z9KcniSJ1dVtdbuaK1tntZ8dZLPJbmmtfbmfRj7\nrtbaDa21Ha21v03y29PGnskXW2vXDdv+3aMdD4ADm0WNAJiv1iRZXVUTw68rk39I/Ysk65Nsmnbs\nA0keV1VLMnk2deMufa3fmwGr6ieSHJrkS5MnaJPhmLXbRiNoO0Nf/yjJu5I8I8khmfx5/aUkaa39\neVX9TibPCJ9QVf8jya+11rYPm/+rJPcnufLRjjsc+5gk70nynCSHJTkoycQemtyzL+MAQOIMKQDz\n1z1J/m9rbfnwcVRr7YjW2oseod29mTxLON0J07a/n8ngmCSpqlXTnvteJsPtU6aNe+Rwauxs2+7O\nTIsJXZHkq0lOGk6FvTTTgm1r7Xdaa89I8uQkJyd5w7S2v5vkT5P8r6o65BHGnsllSXYOX8eRSf59\n9hyqey7IBMACJ5ACMF/dnOT+qvpPw3tlHlRVT6mqZ+zm+IdD0xeT7Kiqi6pqaVW9OMnp0477myRP\nqaqnDhccenOGoWo4/fe/JXn38Ixnqmr18LrN2bbdnc1JVkxfOCiTU3K3tdYeqKqfSvKaqRdZ9Yyq\nOn24yNEPkjyYyQA5pbV2UZI7kny6qh73COPv6vAk2zP53q/Oj4ddABgpgRSAeam1tjPJi5KcmuSb\nSb6TycC3bHdNhu1+lOTFSV6eycV+/m2SP5rW751JfjPJDUm+nskpwNP9epJvJPnL4cqx1yd50mzb\n7uF13pHkqiT/t6omhmddfy3Jv6uqbZmcenv1tCbLhu/DxPB9+V6Sd87Q9aszeZb5k1X1mD3VsIu3\nJHl6kq2ZXCzqj3Z53hlRAEamRnDbsVTVBzL5S8Pm1tpTh/t+JpPXtxycyQUYfrm1duusBwOAR6mq\nPpTkntbable8BQD2v1GdIf1Qkp/bZd87kryptXZaJqc0zfTXWwAAAA5QIwmkrbWbkmzZZfe9mbw3\nXJIcmX+44iEA7C9dp5lW1SVVdX9Vbdvl8Sf7afwv7zLuw7U86lvSAMAojWTKbpJU1Zok102bsntC\nkv+dyV8CKsmzWmuWhgcAACDJ3N6H9ANJLmqtfbKqzknywSRn7npQVVkcAQAAYBFrrc14C7G5PEO6\nrbW2bNrz9810L7aqaqOqYbEbGxvL2NhY7zJYRHymGCWfJ0bNZ4pR85li1Hym9k5V7TaQjvK2L5Uf\nv3H2nVV1xrCAf5bJ5fEBAAAgyYim7FbVx5IMMnlj7w2ZXFX31UneP7z32YPDrwEAACDJiAJpa+28\n3Tz1/4yifyYNBoPeJbDI+EwxSj5PjJrPFKPmM8Wo+UzN3siuId3nAlxDCgAAsGjt6RrSuVxlFwAA\nYNFYu3Zt1q9f37uMeWvNmjW5++67H1UbZ0gBAAD2wvBMX+8y5q3dvT/7a5VdAAAA2GsCKQAAAF0I\npAAAAHQhkAIAANCFQAoAALCPVq1am6qas8eqVWt7v8Q5ZZVdAACAvTDTKrJVlWQu88zCWdnXKrsA\nAAAsGAIpAADAInDvvffmnHPOyTHHHJOTTjop733ve5Mkt9xyS571rGflqKOOyurVq3PRRRdlx44d\nU+1e97rXZeXKlTniiCPytKc9LevWrdtvNQukAAAAC1xrLWeddVZOO+203Hvvvbnhhhvynve8J5/9\n7GezdOnSvPvd787ExES++MUv5sYbb8z73//+JMn111+fm266Kd/4xjdy33335eMf/3hWrFix3+oW\nSAEAABa4W265Jd/73vdy6aWX5qCDDsratWvzqle9KldffXVOO+20nH766amqnHDCCXn1q1+dz33u\nc0mSgw8+OPfff3/WrVuX1lpOPvnkrFy5cr/VvXS/jQQAAMCcWL9+fTZu3Jjly5cnmTxjunPnzjz3\nuc/NnXfemde//vW59dZb84Mf/CA7duzI05/+9CTJ8573vFx44YV57Wtfmw0bNuTFL35xLr/88hx2\n2GH7pW5nSAEAABa4448/Pk984hMzMTGRiYmJbNmyJffdd1+uu+66vOY1r8kpp5ySu+66K1u3bs3b\n3va2H1sN98ILL8ytt96adevW5Y477sg73/nO/Va3QAoAALDAnX766Tn88MPzjne8Iw8++GAeeuih\nfOUrX8mtt96a7du3Z9myZTn00EPzta99LVdcccVUu1tvvTU333xzduzYkUMOOSSPe9zjsmTJ/ouJ\nAikAAMA+WrlyTZKas8dk/49syZIl+fSnP53bbrstJ554Yo455picf/752bZtWy6//PJ89KMfzbJl\ny3LBBRfk3HPPnWq3bdu2nH/++Vm+fHlOPPHEHH300XnDG94w6/dlb1Xvm6xWVetdAwAAwCOpqsgu\nu7e792e4v2Zq4wwpAAAAXQikAAAAdCGQAgAA0IVACgAAQBcCKQAAAF0IpAAAAHQhkAIAANCFQAoA\nAEAXS3sXAAAAMJfGx8czPj4+tT0YDJIkg8FgantfrTpuVTZv3Dy7Avdg5eqV2fStTXt17IknnpgP\nfOADef7znz9n9Yxatdb6FlDVetcAAAAcGKoq+5o/ZmpbVcnYCArbnbHsdb29A+nu3tvh/pqpjSm7\nAAAAdCGQAgAALBI333xznvKUp2TFihV55StfmR/+8IfZunVrzjrrrBxzzDFZsWJFzjrrrGzcuHGq\nze///u/npJNOyrJly3LSSSflqquumnrugx/8YJ785CdnxYoVeeELX5gNGzaMtF6BFAAAYJH42Mc+\nls9+9rO56667cscdd+Stb31rWmt5xStekXvuuScbNmzIoYcemgsvvDBJ8sADD+Tiiy/OZz7zmWzb\nti1f+MIXcuqppyZJPvWpT+Xtb397PvnJT+a73/1unvOc5+SlL33pSOsVSAEAABaJiy66KMcee2yO\nPPLIXHrppbnqqqty1FFH5Rd+4Rfy2Mc+No9//ONzySWX5POf//xUm4MOOii33357HnzwwaxcuTKn\nnHJKkuTKK6/MJZdckic96UlZsmRJ3vjGN+a2227LPffcM7J6BVIAAIBF4rjjjpvaXrNmTb797W/n\nwQcfzAUXXJC1a9fmyCOPzBlnnJGtW7emtZZDDz0011xzTa644oo84QlPyFlnnZWvf/3rSZL169fn\n4osvzvLly7N8+fKsWLEiVfVj031nSyAFAABYJKafvVy/fn2OPfbYXH755bnzzjtzyy23ZOvWrVNn\nRx9eEffMM8/M9ddfn02bNuXkk0/O+eefnyQ5/vjjc+WVV2ZiYiITExPZsmVLtm/fnmc+85kjq1cg\nBQAAWCTe9773ZePGjZmYmMhll12Wl7zkJdm+fXsOOeSQLFu2LBMTExkbG5s6/jvf+U6uvfbaPPDA\nAzn44INz2GGHZcmSyZj4S7/0S7nsssuybt26JMl9992XT3ziEyOtd+koOqmqDyR5UZLNrbWnTtt/\nUZJfTrIjyZ+01t44ivEAAADmg5WrV2bz2OY57X9vVVXOO++8vOAFL8i9996bs88+O29605uyZcuW\nnHfeeTn66KOzevXq/Oqv/mquvfbaJMnOnTvzrne9Ky972ctSVTn11FNzxRVXJEnOPvvsfP/738+5\n556bDRs25IgjjsiZZ56Zc845Z2Svr/b1prA/1knVzybZnuS/PxxIq2qQ5DeS/MvW2o6qOrq19r0Z\n2rZR1AAAAPBIqir7mj9m0/ZAsLv3Z7i/Zmozkim7rbWbkmzZZfdrkry9tbZjeMw/CKMAAAAcuOby\nGtInJXluVf1lVf15VT1jDscCAABggRnJNaR76Puo1tozq+pnknw8yRNnOnD6RbWDwSCDwWAOywIA\nAGCujI+PZ3x8fK+OHck1pElSVf8/e/ceL3ld33n+/YH2AiJXhz5KSzeS0SFmDcYsceOqpQ4xmkFJ\n1iTIZryGmKwoo8ZVNLMeNoZxlI26meg6j3gf0aizUchmIiqWrppEiDISWvEy2o0I7aW5iEgU+e4f\np/rk2Hu6abp/db6nznk+H4968DtVv/r9vnWorupX/26bk1y85BjSv0ry71trH5/8/JUkv9Ba++5u\nz3MMKQAAsCIcQzo93Y4h3bWeyW2XDyR57GQAD0xyt91jFAAAgPVrqMu+XJhklOSYqtqe5BVJ3pLk\n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\nnj7EugBgpVTVmVX1vaq6ecnte1V15Qqt/692W/+u6ZfexeVs2sPruHnyHQ4AXQyyy25VvS8Lx9Ec\nkeRFk112b2itHbVknp2ttaP3uBAAAADWlQO+DmlV/UqSHa21K6pqtJdZly3fqnIyBAAAgDWstbbs\nGdoPOEiTPCLJk6rqiUkOSXLvqnpnkuuramNrbUdVzSX51l4GN8Aw1r75+fnMz8/3HgZriPcUQ/J+\nYmjeUwzNe4qheU/tm6o9Xy3sgI8hba29rLV2fGvtAUnOSHJpa+1fZ+F098+YzPb0LJymHwAAAJJM\n9zqkr0pyalVdneRxk58BAAAgyTC77C5qrX08yccn0zuT/Mshl7/ejUaj3kNgjfGeYkjeTwzNe4qh\neU8xNO+pAzfIWXYPaABVrfcYAAAAmI6qmupJjQCYMePxOOPxeHF617/wjkYj/9oLAHuwZcuWbNu2\nrfcwVq3Nmzfn61//+l16ji2kAOvc5F8tew8DAFY935l7t6ffz962kE7zpEYAAACwR4IUAACALgQp\nAAAAXQhSAAAAuhCkAAAA+2lubkuqamq3ubktvV/iVDnLLsA654yBALBvlvvOrKok0/wenZ3vaWfZ\nBQAAWKeuu+66POUpT8mxxx6bE088MX/yJ3+SJLnsssvyi7/4iznqqKNy3HHH5XnPe15uv/32xee9\n4AUvyMaNG3PEEUfkZ3/2Z7N169YVG7MgBQAAmHGttZx22ml56EMfmuuuuy4f/ehH8/rXvz4f/vCH\ns2HDhrzuda/Lzp078zd/8ze59NJL84Y3vCFJcskll+STn/xkvvKVr+Smm27Ke9/73hxzzDErNm5B\nCgAAMOMuu+yyfOc738nLX/7yHHzwwdmyZUt++7d/O+95z3vy0Ic+NKecckqqKscff3x+53d+Jx//\n+MeTJHe7293yve99L1u3bk1rLQ960IOycePGFRv3hhVbEwAAAFOxbdu2XHvttTn66KOTLGwxveOO\nO/KoRz0qX/7yl/PCF74wl19+eX7wgx/k9ttvz8Me9rAkyWMe85icffbZee5zn5vt27fn137t13LB\nBRfksMMOW5Fx20IKAAAw4+5///vnAQ94QHbu3JmdO3fmhhtuyE033ZSLL744v/d7v5eTTjopX/3q\nV3PjjTfmj/7oj37i5ENnn312Lr/88mzdujVXX311XvOa16zYuAUpAADAjDvllFNy73vfO69+9atz\n22235cc//nGuuuqqXH755bnlllty+OGH59BDD80Xv/jFvPGNb1x83uWXX57PfOYzuf3223PIIYfk\nnve8Zw46aOUyUZACAADsp40bNyepqd0Wln/nDjrooPzlX/5lrrjiipxwwgk59thjc9ZZZ+Xmm2/O\nBRdckHe96105/PDD85znPCdnnHHG4vNuvvnmnHXWWTn66KNzwgkn5D73uU9e/OIXH/DvZV+5DinA\nOuc6pACwb3xn7p3rkAIAADAzBCkAAABdCFIAAAC6EKQAAAB0IUgBAADoQpACAADQhSAFAACgC0EK\nAABAF4IUAABgDTjhhBNy6aWX9h7GXSJIAQAA9tPcprlU1dRuc5vmer/EqdrQewAAAACzase1O5L5\nKS5/fsf0Fr4K2EIKAACwRnzmM5/Jgx/84BxzzDF59rOfnR/+8Ie58cYbc9ppp+XYY4/NMccck9NO\nOy3XXnvt4nPe9ra35cQTT8zhhx+eE088Me9+97sXH3vLW96Sn/7pn84xxxyTJzzhCdm+ffug4xWk\nAAAAa8SFF16YD3/4w/nqV7+aq6++Oq985SvTWsuznvWsXHPNNdm+fXsOPfTQnH322UmSW2+9Neec\nc04+9KEP5eabb86nP/3pnHzyyUmSD37wg3nVq16VD3zgA/n2t7+dRz7ykXnqU5866HgFKQAAwBrx\nvOc9L/e73/1y5JFH5uUvf3ne/e5356ijjsqv/uqv5h73uEfuda975dxzz80nPvGJxeccfPDBufLK\nK3Pbbbdl48aNOemkk5Ikb3rTm3LuuefmgQ98YA466KC89KUvzRVXXJFrrrlmsPEKUgAAgDVi06ZN\ni9ObN2/ON7/5zdx22215znOeky1btuTII4/Mox/96Nx4441preXQQw/Nn//5n+eNb3xj7nvf++a0\n007Ll770pSTJtm3bcs455+Too4/O0UcfnWOOOSZV9RO7+x4oQQoAALBGLN16uW3bttzvfvfLBRdc\nkC9/+cu57LLLcuONNy5uHW2tJUlOPfXUXHLJJbn++uvzoAc9KGeddVaS5P73v3/e9KY3ZefOndm5\nc2duuOGG3HLLLXn4wx8+2HgFKQAAwBrxp3/6p7n22muzc+fOnH/++fnN3/zN3HLLLTnkkENy+OGH\nZ+fOnZmfn1+c/1vf+lYuuuii3Hrrrbnb3e6Www47LAcdtJCJv/u7v5vzzz8/W7duTZLcdNNNef/7\n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\nXiwWSZLFYnG4DcDFtPpbo458bfQfIQIpwFgCKQBwlm4WSJ2yCwAAwBACKQAAAEMIpAAAAAwhkAIA\nADCEQAoAAMAQAikAAABDCKQAAAAMIZACAAAwhEAKAADAEAIpAAAAQwikAAAADCGQAgAAMIRACgAA\nwBACKQAAAEMIpAAAAAwhkAIAADCEQAoAAMAQAikAAABDCKQAAAAMIZACAAAwhEAKAADAEAIpAAAA\nQwikAAAADCGQAgAAMIRACgAAwBACKQAAAEOcKpBW1U9X1Uer6pGqes51r726qu6vqvuq6kWnK5Mk\nWS6Xo0tgy+hTTEl/Ymr6FFPTp5iaPnV6p50h/UiSn0ry3vWdVfXMJC9N8swkP5rkD6uqTvleF54O\nz9T0KaakPzE1fYqp6VNMTZ86vVMF0u7+ZHffn+T6sHl3knu6+6vd/Zkk9ye58zTvBQAAwHY5q2tI\nLyV5cO35w6t9AAAAkCSp7r75F1T9fZKd9V1JOslruvvtq695T5Jf7+4Prp7/fpJ/7u43r56/Psk7\nuvvPj2j/5gUAAACw0br7yEs4H3eMb3zhLbzfw0meuvb88mrfsQsDAABgu015yu56sLw3ycuq6vFV\n9fQkz0jy/gnfCwAAgA132mVfXlJVDyZ5XpK/qqq/SZLu/niSP0vy8STvSPJL/VjnBgMAAHChPOY1\npAAAAHAWzuouuwAAAHBTAikAAABDPOZddhmjqr4zyd352vqtDye5t7vvG1cVwNesxqlLSf61u7+4\ntv+u7v7bcZWxqarq+Uk+390fr6oXJHlukg9197sGl8YWqKo/7u6fHV0H26OqfiDJnUk+2t3vHF3P\npnIN6QxV1SuTvDzJPUkeWu2+nORlSe7p7teOqo3tVFW/0N1vHF0Hm6OqfjXJLye5L8mzk7yiu9+2\neu2D3f2ckfWxearqt5P8cA7O3lom+cEkf53khTn4QPZ3x1XHpqmqe6/fleSHkrw7Sbr7J8+9KDZe\nVb2/u+9cbf9iDo6Df5HkRUne7m/0WyOQzlBVfSrJd3X3/123//FJPtbd3z6mMrZVVf1ndz9tdB1s\njqr6SJLv7+4vVtWVJG9N8ifd/bqq+vfu/t6hBbJxqupjSZ6V5BuSXE1yubu/UFXfmORfuvt7hhbI\nRqmqD+ZgtYfXJ+kcBNI/zcGH++nu946rjk21fnyrqg8k+bHu/lxVfVMOxqnvHlvhZnLK7jw9muTb\nkjxw3f6nrF6DE6uqD9/opSQ751kLW+G2a6fpdvdnqmqR5K1VdUe+fl1qOK6vdPcjSb5UVf/R3V9I\nku7+clU59nFSz03yiiSvSfIb3f2hqvqyIMop3VZVT8rBmRy3d/fnkqS7/6eqvjq2tM0lkM7TryV5\nV1Xdn+TB1b6nJXlGkl8ZVhWbbifJi5N8/rr9leSfzr8cNtx+VT27uz+UJKuZ0p9I8kdJfELMrfhK\nVT2hu7+U5Puu7ayqJ+ZghguOrbsfTfJ7VfWW1b/78Xcvp/fEJP+Wg7+duqqe0t2frapvjg9jb5lT\ndmeqqm7LwUXS6zc1+sDq02M4sap6Q5I3dvf7jnjtzd39MwPKYkNV1eUkX+3uq0e89vzu/scBZbHB\nquobuvt/j9j/rUme0t0fGVAWW6KqfjzJ87v7N0fXwvapqick2enuT4+uZRMJpAAAAAxhHVIAAACG\nEEgBAAAYQiAFAABgCIEUAACAIf4f23eMRvyrGDIAAAAASUVORK5CYII=\n", + "image/png": "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\n5I477siaNWvyyU9+Mknyta99LbfffnseeeSRjIyM5JZbbslhhx027fUKmwAAAD3gzjvvzJNPPplL\nL7008+bNy+LFi/POd74zn/nMZ3LKKafktNNOy5w5c3LcccdlxYoVWbt2bZLkgAMOyOjoaL7zne9k\n+/btOeGEE3LUUUdNe73zpv0KAAAAtG3Dhg3ZtGlTBgYGxvY9//zzOf300/PII4/koosuyt13351n\nnnkmP/vZz3LqqacmSc4888ysXLky73nPe7Jhw4a8/vWvz1VXXZW+vr5prVfPJgAAQA849thjs3jx\n4gwPD489tmzZkttuuy3nn39+li5dmu9973sZGRnJ5Zdfnu3bt4+de8EFF+Suu+7KQw89lPXr1+fK\nK6+c9nqFTQAAgB5w2mmnpa+vLx/96Eezbdu2PP/883nggQdy55135umnn05fX1/mz5+fhx9+ONdd\nd92OWWJz11135dvf/naee+65zJ8/PwceeGDmzp077fUKmwAAALvR1zeQamWP6XlU7e/ZnDlzcttt\nt+Xee+/NkiVL8tKXvjQrVqzI6OhorrrqqqxatSr9/f1ZsWJFli9fPnbeli1bsmLFigwODmbRokU5\n/PDDc/HFF7f9fdkT62wCALvVaDTSaDTGtuv1epKkXq+PbQPMFpOtJcner7MpbAIAU+aPMGC283tu\ncnsbNg2jBQAAoDhhEwAAgOKETQAAAIoTNgEAAChO2AQAAKA4YRMAAIDihE0AAACKEzYBAAB6wKJF\ni7JmzZpOlzFlwiYAAMBu9B/an1qtNm2P/kP7p1THjuN7xbxOFwAAANDNRkdGk6FpbH9odPoa7yA9\nmwAAAD1i3bp1ecUrXpHBwcG8/e1vz7PPPpvh4eGcffbZOeKIIzI4OJhzzjknjz/++Ng5N910U44/\n/vj09/dnyZIlWbVq1dhzN954Y5YuXZrBwcGcddZZ2bhxY7FahU0AAIAe0Gw2s2rVqqxevTrf//73\ns379+nz4wx9Os9nMO97xjmzcuDEbN27MQQcdlJUrVyZJtm7dmgsvvDBf/epXs2XLltxxxx151ate\nlSS59dZb85GPfCRf/OIX8+STT+a1r31tzjvvvGL1CpsAAAA9oFarZeXKlTn66KMzMDCQD33oQ7n5\n5pszODiY173udTnwwANzyCGH5IMf/GDWrl07dt6cOXNy//33Z9u2bTnyyCOzdOnSJMn111+fSy65\n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\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAABCtpXKAAAgAElEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMB1uSvJf9/Kc\ng5J8JclTST47heMfSHL6Xl4DAHZpXqcLAIBZrJ7kfyY5pkBbzdZjb/xmkiOSDCbZPoXjf35viwKA\nyczpdAEAwJTV9vL445Ksz9SC5p7MLdAGAADAtFuY5PNJfpTk75Jc0No/lOTPk/yPJFtSDe38F+PO\nOznJ37Se+0zrsWN46VuT3D7hOtuTLGlt/5MkVyXZkOSJJNclObDAubtycJJtSZ5PMtqq96gkpyW5\nI8lwkk1Jrk1ywLjzrk7ywyQjSf42ydLW/k+Ne519Sb6V5JrdXP+yJM8m+Wnr+m9rvZZvJnkyyY+T\n/GmSBePOeTTJma3toSSfS9UzO5Lk7bu5FgDsRM8mAJ0wJ9W9hPekCp2/kuR9SZa1nj8nyc2pgtCX\nk/xRa/9LknwpVRAdSHJLktdn6sNL/+8k/yzJSa1/j07yB9N07tYkZ6UKlH1J+lOF1J8luTDJYUle\nk+q1/4fWOf8myWuT/PNUr/2NSTaPa7PZOm9NqmD8vt1c/z8nuSJVGO9LFVZrSS5P8nNJXp5qeO/Q\nhPbH+41U3+MFSVbt5loAAABd4ZdS9RCOd0mSG1OFpNXj9i9N8kxr+/Qkj08476+S/JfW9lszee9k\nLcnTeaGnMqnC3t8VOHcy9SSP7eGY9yX5Qmv7zCTfTfX9mfgfwp9K8idJ7k/yH/fQ5g5DqXomJ3Nu\nql7iHX6QF/dsNqZ4HQDYiQmCAOiE41L1aA6P2zc3yf+XKoT+cNz+Z1INV53TOmdi2JwYWifz0iTz\nk9w9bl8tUxvl0865E70syR+mGho8P9Vn8V2t576Zqhf3E6m+R19I8vuphsHWkvx6a/u/7cN1k+TI\nJB9P8supejvn5MU9pxP9/T5eBwAMowWgIzam6kUbGPfoT3L2Hs77h1TDV8c7btz21lQBboejxm0/\nmeoeyqXjrnlo67rtnjuZXQ3vvS7JQ6mG4i5I8qG8+PP42iSntq71siQXj2vrj5N8LclfTqh1qte/\nItU9pD/fuvbvZvd/C+zt7LcAMEbYBKAT1qXqofs/U60FOTdVADp1D+fdkeqex/emmlTn9Ul+cdzz\n9yV5Rar7Kg/Mi+9H3J4qrF2TqqcyqYLrsgLnTuaHqe6xHB9KD0n12p9JcmKS38sLoe7UVENoD2g9\n/4+pwmHywky0K1MNtf1Kdj9B0fhzxl97a6rJio7OC0EWAIoTNgHohO2pejFfleq+xx8nuSEvzIw6\nsUdtx9c/TRUw35rkJ0l+K9VQ0x2han2q+ze/kSqQ3T6hrQ8k+V6S/5VqhtWvp+o9bPfcyTycaqKj\nv0s1XPWoVMNi35Qq8N2QagKfHfpb+zanmhn2ySRXjvse7KhnRaohrl9KNUvuZCauzXlZklNa9X8l\n1WzAk/Ve7su6ngBQ1IWpJit4oLUNADNp/JIgAECXaLdn8+eTvDPVEKaTUv0v9fHtFgUAe2HiUFEA\noAu0GzZPTPLtvHBPydpUw5sAYKZ0erjnB1Pdgznx8RczdP0HJ7n+eTN0fQCYFiemuq9lMNWseHek\nmlIdAACA/Vi762w+nOT/SbX49tYk96Sa9GHMSSed1LzvvvvavAwAAABd6r5Uk/69SOn7XK5ItXba\n9eP2NZtNk9ntydDQUIaGhjpdBrOI9xSleU9RmvcUpXlPUZL309TVarVkF9my3Z7NJDkiyY+SHJvk\ndanWBwMAAGA/ViJsfi7VgtXPJfkPqdYNAwAAYD9WImyeXqCN/V69Xu90Ccwy3lOU5j1Fad5TlOY9\nRUneT+2bibXJ3LMJAAAwS03nPZsAAACzwuDgYIaHhztdRlcaGBjI5s2bp3y8nk0AAICWWq0W+WXX\nJvveTNazOWcGagIAAGA/I2wCAABQnLAJAABAccImAAAAxQmbAAAAu9HfP5harTZtj/7+wU6/xGlh\nNloAAICWXc24Ws22Op2ZpjdmwDUbLQAAAB0nbAIAAPSITZs25Q1veEOOOOKILFmyJNdee22SZN26\ndXnNa16TgYGBLFy4MBdccEGee+65sfMuuuiiHHnkkVmwYEFe+cpX5sEHH5z2WoVNAACAHrB9+/ac\nc845Ofnkk7Np06asWbMm11xzTVavXp158+bl4x//eH7yk5/kjjvuyJo1a/LJT34ySfK1r30tt99+\nex555JGMjIzklltuyWGHHTbt9QqbAAAAPeDOO+/Mk08+mUsvvTTz5s3L4sWL8853vjOf+cxncsop\np+S0007LnDlzctxxx2XFihVZu3ZtkuSAAw7I6OhovvOd72T79u054YQTctRRR017vfOm/QoAAAC0\nbcOGDdm0aVMGBgbG9j3//PM5/fTT88gjj+Siiy7K3XffnWeeeSY/+9nPcuqppyZJzjzzzKxcuTLv\nec97smHDhrz+9a/PVVddlb6+vmmtV88mAABADzj22GOzePHiDA8Pjz22bNmS2267Leeff36WLl2a\n733vexkZGcnll1+e7du3j517wQUX5K677spDDz2U9evX58orr5z2eoVNAACAHnDaaaelr68vH/3o\nR7Nt27Y8//zzeeCBB3LnnXfm6aefTl9fX+bPn5+HH34411133Y4lSXLXXXfl29/+dp577rnMnz8/\nBx54YObOnTvt9QqbAAAAu9HXN5BqGcnpeVTt79mcOXNy22235d57782SJUvy0pe+NCtWrMjo6Giu\nuuqqrFq1Kv39/VmxYkWWL18+dt6WLVuyYsWKDA4OZtGiRTn88MNz8cUXt/192ZOdFt6cBs1eWKB0\nbzQajTQajbHter2eJKnX62PbAABA76nVaplt+aWUyb43rR7UnbKlsNkmb0YAAJg9/H0/ub0Nm2aj\nnSX0tgIAAN1Ez2abuvF/PrqxJgAA6AX+lp7c3vZsmiAIAACA4oRNAAAAihM2AQAAKE7YBAAAoDhh\nEwAAgOKETQAAgN3oP7Q/tVpt2h79h/ZPqY5FixZlzZo10/xqy7HOJgAAwG6MjowmQ9PY/tDolI7b\nEU57hZ5NAAAAihM2AQAAesS6devyile8IoODg3n729+eZ599NsPDwzn77LNzxBFHZHBwMOecc04e\nf/zxsXNuuummHH/88env78+SJUuyatWqseduvPHGLF26NIODgznrrLOycePGYrUKmwAAAD2g2Wxm\n1apVWb16db7//e9n/fr1+fCHP5xms5l3vOMd2bhxYzZu3JiDDjooK1euTJJs3bo1F154Yb761a9m\ny5YtueOOO/KqV70qSXLrrbfmIx/5SL74xS/mySefzGtf+9qcd955xeoVNgEAAHpArVbLypUrc/TR\nR2dgYCAf+tCHcvPNN2dwcDCve93rcuCBB+aQQw7JBz/4waxdu3bsvDlz5uT+++/Ptm3bcuSRR2bp\n0qVJkuuvvz6XXHJJTjjhhMyZMyeXXHJJ7r333jz22GNF6hU2AQAAesQxxxwztn3sscdm06ZN2bZt\n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\nHJz7bAIAADB1wiYAAADlhE0AAADKCZsAAACUEzYBAAAoJ2wCAABQTtgEAACgnLAJAABAOWETAABg\nBmzfvj3XXHPNtNsYm7AJAABwCPMnzKfX663aY/6E+bH62Lf+rNg87QYAAAC6bLhnmAxWsf5guHrF\np8iZTQAAgBlxww035OlPf3q2bduWn//5n893v/vd7N69OxdccEGe8IQnZNu2bXn+85+fr33ta0vv\n+b3f+708+clPzvz8fM4444xcddVVS//33ve+N2eeeWa2bduW888/P3fffXdZr8ImAADADFhcXMxV\nV12Vq6++Ol/5yldy22235Zd/+ZezuLiYV7ziFbn77rtz991357GPfWwuvfTSJMn999+fyy+/PB//\n+MezsLCQT33qUznrrLOSJB/+8Ifz5je/OR/84AfzrW99K895znPyohe9qKxfYRMAAGAG9Hq9XHrp\npTnllFOydevW/NIv/VLe9773Zdu2bXnBC16QY445Jscff3ze8IY35Lrrrlt636ZNm3LzzTfngQce\nyEknnZQzzzwzSfKud70rV1xxRZ7ylKdk06ZNueKKK3LTTTflnnvuKelX2AQAAJgRp5566tLyaaed\nlnvvvTcPPPBAfvEXfzHbt2/Pli1bcu6552bPnj1ZXFzMcccdlz/+4z/Ou971rpx88sm54IIL8qUv\nfSlJctddd+Xyyy/P1q1bs3Xr1jzucY9LkkcMwZ2EsAkAADAjll9Teffdd+fkk0/OW9/61tx22225\n4YYbsmfPnlx33XVZXFzM4uJikuS8887L1VdfnW984xt56lOfmosvvjhJG1bf/e53Z/fu3UuP+++/\nP8961rNKehU2AQAAZsDi4mJ+67d+K1/72teya9euvOlNb8pFF12U4XCYxz72sdmyZUt27dqVnTt3\nLr3nr//6r/PhD384999/f44++ugcd9xxOeqoo5Ikr3zlK/Mrv/IrueWWW5Ike/bsyQc+8IGyft36\nBAAA4BDmtsyt6u1J5rbMjbVer9fLS17ykpx33nm59957c+GFF+aNb3xjdu/enRe/+MU58cQTc8op\np+Q1r3lNPvKRjyRJ9u7dm7e97W152ctell6vl7PPPjvvfOc7kyQXXnhhvv3tb+eiiy7KXXfdlS1b\ntuS8887Lz/zMz5R8XWtxR9DFfadvAYDZ1uv10rXP9S72BMwuP1MO7mDfm16vl6yQLQ2jBQAAoJyw\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -625,7 +780,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.9" + "version": "2.7.6" } }, "nbformat": 4, diff --git a/ipynb/tutorial/04_ExecutorUsage.ipynb b/ipynb/tutorial/04_ExecutorUsage.ipynb index 03418abd3b94920e52cb381d5e49f322a41f8fc4..dd6c53ba9afd7dcd184ce784c59b9a255312793b 100644 --- a/ipynb/tutorial/04_ExecutorUsage.ipynb +++ b/ipynb/tutorial/04_ExecutorUsage.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "collapsed": true }, @@ -38,7 +38,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -59,16 +59,152 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": false + "collapsed": false, + "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2016-11-17 17:00:31,811 INFO : Target - Using base path: /home/bjackman/sources/lisa\n", + "2016-11-17 17:00:31,812 INFO : Target - Loading custom (inline) target configuration\n", + "2016-11-17 17:00:31,812 DEBUG : Target - Target configuration {'username': 'brendan', 'platform': 'linux', 'host': '192.168.0.1', 'ftrace': {'buffsize': 81920, 'events': ['sched_switch', 'sched_wakeup', 'sched_wakeup_new', 'cpu_frequency']}, 'board': 'juno2', 'modules': ['bl', 'cpufreq'], 'password': 'test0000', 'tools': ['trace-cmd', 'perf'], 'results_dir': 'ExecutorExample'}\n", + "2016-11-17 17:00:31,813 INFO : Target - Devlib modules to load: ['bl', 'cpufreq', 'hwmon']\n", + "2016-11-17 17:00:31,814 INFO : Target - Connecting linux target:\n", + "2016-11-17 17:00:31,815 INFO : Target - username : brendan\n", + "2016-11-17 17:00:31,816 INFO : Target - host : 192.168.0.1\n", + "2016-11-17 17:00:31,817 INFO : Target - password : \n", + "2016-11-17 17:00:31,819 INFO : Target - Connection settings:\n", + "2016-11-17 17:00:31,820 INFO : Target - {'username': 'brendan', 'host': '192.168.0.1', 'password': ''}\n", + "2016-11-17 17:00:31,821 DEBUG : Target - Setup LINUX target...\n", + "2016-11-17 17:00:31,828 DEBUG : Installing module vexpress-u-boot\n", + "2016-11-17 17:00:31,829 DEBUG : Installing module vexpress-dtr\n", + "2016-11-17 17:00:31,830 DEBUG : Installing module vexpress-vemsd\n", + "2016-11-17 17:00:31,831 DEBUG : Logging in brendan@192.168.0.1\n", + "2016-11-17 17:00:33,311 DEBUG : id\n", + "2016-11-17 17:00:33,722 DEBUG : echo $USER\n", + "2016-11-17 17:00:34,128 DEBUG : if [ -e '/home/brendan/devlib-target/bin' ]; then echo 1; else echo 0; fi\n", + "2016-11-17 17:00:34,534 DEBUG : ls -1 /home/brendan/devlib-target/bin\n", + "2016-11-17 17:00:34,944 DEBUG : cat /proc/cpuinfo\n", + "2016-11-17 17:00:35,353 DEBUG : sudo -- sh -c 'ls /'\n", + "2016-11-17 17:00:35,901 DEBUG : sudo -- sh -c 'dmidecode -s system-version'\n", + "2016-11-17 17:00:36,706 DEBUG : Installing module bl\n", + "2016-11-17 17:00:36,808 DEBUG : uname -m\n", + "2016-11-17 17:00:37,216 DEBUG : if [ -e '/sys/devices/system/cpu/cpufreq' ]; then echo 1; else echo 0; fi\n", + "2016-11-17 17:00:37,523 DEBUG : Installing module cpufreq\n", + "2016-11-17 17:00:37,624 DEBUG : if [ -e '/sys/class/hwmon' ]; then echo 1; else echo 0; fi\n", + "2016-11-17 17:00:37,931 DEBUG : Installing module hwmon\n", + "2016-11-17 17:00:38,033 DEBUG : ls -1 /sys/class/hwmon\n", + "2016-11-17 17:00:38,442 DEBUG : if [ -e '/sys/class/hwmon/hwmon0/name' ]; then echo 1; else echo 0; fi\n", + "2016-11-17 17:00:38,848 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/name'\\'''\n", + "2016-11-17 17:00:39,754 DEBUG : ls -1 /sys/class/hwmon/hwmon0/\n", + "2016-11-17 17:00:40,166 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/curr1_label'\\'''\n", + "2016-11-17 17:00:41,072 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/curr2_label'\\'''\n", + "2016-11-17 17:00:41,977 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/curr3_label'\\'''\n", + "2016-11-17 17:00:42,882 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/curr4_label'\\'''\n", + "2016-11-17 17:00:43,788 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy1_label'\\'''\n", + "2016-11-17 17:00:44,694 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_label'\\'''\n", + "2016-11-17 17:00:45,599 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_label'\\'''\n", + "2016-11-17 17:00:46,505 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy4_label'\\'''\n", + "2016-11-17 17:00:47,410 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/in0_label'\\'''\n", + "2016-11-17 17:00:48,316 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/in1_label'\\'''\n", + "2016-11-17 17:00:49,221 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/in2_label'\\'''\n", + "2016-11-17 17:00:50,126 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/in3_label'\\'''\n", + "2016-11-17 17:00:51,032 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/in4_label'\\'''\n", + "2016-11-17 17:00:51,938 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/in5_label'\\'''\n", + "2016-11-17 17:00:52,843 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/in6_label'\\'''\n", + "2016-11-17 17:00:53,749 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/power1_label'\\'''\n", + "2016-11-17 17:00:54,654 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/power2_label'\\'''\n", + "2016-11-17 17:00:55,560 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/power3_label'\\'''\n", + "2016-11-17 17:00:56,466 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/power4_label'\\'''\n", + "2016-11-17 17:00:57,371 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/temp1_label'\\'''\n", + "2016-11-17 17:00:58,277 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/temp2_label'\\'''\n", + "2016-11-17 17:00:59,082 DEBUG : Target - Checking target connection...\n", + "2016-11-17 17:00:59,083 DEBUG : Target - Target info:\n", + "2016-11-17 17:00:59,084 DEBUG : Target - ABI: arm64\n", + "2016-11-17 17:00:59,085 DEBUG : Target - CPUs: CpuInfo(['A53', 'A57', 'A57', 'A53', 'A53', 'A53'])\n", + "2016-11-17 17:00:59,087 DEBUG : Target - Clusters: [0, 1, 1, 0, 0, 0]\n", + "2016-11-17 17:00:59,088 INFO : Target - Initializing target workdir:\n", + "2016-11-17 17:00:59,089 INFO : Target - /home/brendan/devlib-target\n", + "2016-11-17 17:00:59,190 DEBUG : mkdir -p /home/brendan/devlib-target\n", + "2016-11-17 17:00:59,599 DEBUG : mkdir -p /home/brendan/devlib-target/bin\n", + "2016-11-17 17:00:59,909 DEBUG : /usr/bin/scp -r /home/bjackman/sources/lisa/libs/devlib/devlib/bin/arm64/busybox brendan@192.168.0.1:/home/brendan/devlib-target/bin/busybox\n", + "2016-11-17 17:01:00,410 DEBUG : chmod a+x /home/brendan/devlib-target/bin/busybox\n", + "2016-11-17 17:01:00,718 DEBUG : /usr/bin/scp -r /home/bjackman/sources/lisa/libs/devlib/devlib/bin/scripts/shutils brendan@192.168.0.1:/home/brendan/devlib-target/bin/shutils\n", + "2016-11-17 17:01:01,202 DEBUG : chmod a+x /home/brendan/devlib-target/bin/shutils\n", + "2016-11-17 17:01:01,511 DEBUG : /usr/bin/scp -r /home/bjackman/sources/lisa/tools/arm64/trace-cmd brendan@192.168.0.1:/home/brendan/devlib-target/bin/trace-cmd\n", + "2016-11-17 17:01:01,856 DEBUG : chmod a+x /home/brendan/devlib-target/bin/trace-cmd\n", + "2016-11-17 17:01:02,164 DEBUG : /usr/bin/scp -r /home/bjackman/sources/lisa/tools/arm64/perf brendan@192.168.0.1:/home/brendan/devlib-target/bin/perf\n", + "2016-11-17 17:01:02,549 DEBUG : chmod a+x /home/brendan/devlib-target/bin/perf\n", + "2016-11-17 17:01:02,856 DEBUG : Target - Check for module [bl]...\n", + "2016-11-17 17:01:02,857 DEBUG : Target - Check for module [cpufreq]...\n", + "2016-11-17 17:01:02,858 DEBUG : Target - Check for module [hwmon]...\n", + "2016-11-17 17:01:02,860 INFO : Target - Topology:\n", + "2016-11-17 17:01:02,861 INFO : Target - [[0, 3, 4, 5], [1, 2]]\n", + "2016-11-17 17:01:02,962 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/online'\\'''\n", + "2016-11-17 17:01:03,868 DEBUG : cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies\n", + "2016-11-17 17:01:04,276 DEBUG : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/online'\\'''\n", + "2016-11-17 17:01:05,181 DEBUG : cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_available_frequencies\n", + "2016-11-17 17:01:05,490 DEBUG : Platform - Trying to load default EM from /home/bjackman/sources/lisa/libs/utils/platforms/juno2.json\n", + "2016-11-17 17:01:05,491 DEBUG : Platform - Platform descriptor initialized\n", + "{'nrg_model': None, 'clusters': {'big': [1, 2], 'little': [0, 3, 4, 5]}, 'cpus_count': 6, 'freqs': {'big': [450000, 625000, 800000, 950000, 1100000], 'little': [450000, 575000, 700000, 775000, 850000]}, 'topology': [[0, 3, 4, 5], [1, 2]]}\n", + "2016-11-17 17:01:05,509 DEBUG : /usr/bin/scp -r /home/bjackman/sources/lisa/libs/devlib/devlib/bin/arm64/trace-cmd brendan@192.168.0.1:/home/brendan/devlib-target/bin/trace-cmd\n", + "2016-11-17 17:01:05,949 DEBUG : chmod a+x /home/brendan/devlib-target/bin/trace-cmd\n", + "2016-11-17 17:01:06,357 DEBUG : sudo -- sh -c 'cat /sys/kernel/debug/tracing/available_events'\n", + "2016-11-17 17:01:07,172 INFO : FTrace - Enabled tracepoints:\n", + "2016-11-17 17:01:07,173 INFO : FTrace - sched_switch\n", + "2016-11-17 17:01:07,174 INFO : FTrace - sched_wakeup\n", + "2016-11-17 17:01:07,175 INFO : FTrace - sched_wakeup_new\n", + "2016-11-17 17:01:07,176 INFO : FTrace - cpu_frequency\n", + "2016-11-17 17:01:07,177 DEBUG : No RT-App workloads, skipping calibration\n", + "2016-11-17 17:01:07,178 WARNING : TestEnv - Wipe previous contents of the results folder:\n", + "2016-11-17 17:01:07,179 WARNING : TestEnv - /home/bjackman/sources/lisa/results/ExecutorExample\n", + "2016-11-17 17:01:07,181 DEBUG : EnergyMeter - using default energy meter for [juno2]\n", + "2016-11-17 17:01:07,182 INFO : HWMon - Scanning for HWMON channels, may take some time...\n", + "2016-11-17 17:01:07,184 DEBUG : Discovering available HWMON sensors...\n", + "2016-11-17 17:01:07,185 DEBUG : \tAdding sensor scpi_sensors/energy1\n", + "2016-11-17 17:01:07,186 DEBUG : \tAdding sensor scpi_sensors/energy2\n", + "2016-11-17 17:01:07,187 DEBUG : \tAdding sensor scpi_sensors/energy3\n", + "2016-11-17 17:01:07,188 DEBUG : \tAdding sensor scpi_sensors/energy4\n", + "2016-11-17 17:01:07,189 DEBUG : \tAdding sensor scpi_sensors/curr1\n", + "2016-11-17 17:01:07,191 DEBUG : \tAdding sensor scpi_sensors/curr2\n", + "2016-11-17 17:01:07,192 DEBUG : \tAdding sensor scpi_sensors/curr3\n", + "2016-11-17 17:01:07,193 DEBUG : \tAdding sensor scpi_sensors/curr4\n", + "2016-11-17 17:01:07,194 DEBUG : \tAdding sensor scpi_sensors/temp1\n", + "2016-11-17 17:01:07,195 DEBUG : \tAdding sensor scpi_sensors/temp2\n", + "2016-11-17 17:01:07,196 DEBUG : \tAdding sensor scpi_sensors/power1\n", + "2016-11-17 17:01:07,198 DEBUG : \tAdding sensor scpi_sensors/power2\n", + "2016-11-17 17:01:07,199 DEBUG : \tAdding sensor scpi_sensors/power3\n", + "2016-11-17 17:01:07,200 DEBUG : \tAdding sensor scpi_sensors/power4\n", + "2016-11-17 17:01:07,201 DEBUG : \tAdding sensor scpi_sensors/in0\n", + "2016-11-17 17:01:07,202 DEBUG : \tAdding sensor scpi_sensors/in1\n", + "2016-11-17 17:01:07,203 DEBUG : \tAdding sensor scpi_sensors/in2\n", + "2016-11-17 17:01:07,204 DEBUG : \tAdding sensor scpi_sensors/in3\n", + "2016-11-17 17:01:07,205 DEBUG : \tAdding sensor scpi_sensors/in4\n", + "2016-11-17 17:01:07,206 DEBUG : \tAdding sensor scpi_sensors/in5\n", + "2016-11-17 17:01:07,206 DEBUG : \tAdding sensor scpi_sensors/in6\n", + "2016-11-17 17:01:07,207 DEBUG : HWMon - Enabling channels {'kinds': ['energy'], 'sites': ['BOARDLITTLE', 'BOARDBIG']}\n", + "2016-11-17 17:01:07,208 INFO : HWMon - Channels selected for energy sampling:\n", + "2016-11-17 17:01:07,209 INFO : HWMon - BOARDBIG_energy\n", + "2016-11-17 17:01:07,210 INFO : HWMon - BOARDLITTLE_energy\n", + "2016-11-17 17:01:07,211 DEBUG : EnergyMeter - Results dir: /home/bjackman/sources/lisa/results/ExecutorExample\n", + "2016-11-17 17:01:07,212 INFO : TestEnv - Set results folder to:\n", + "2016-11-17 17:01:07,213 INFO : TestEnv - /home/bjackman/sources/lisa/results/ExecutorExample\n", + "2016-11-17 17:01:07,214 INFO : TestEnv - Experiment results available also in:\n", + "2016-11-17 17:01:07,215 INFO : TestEnv - /home/bjackman/sources/lisa/results_latest\n" + ] + } + ], "source": [ - "# Setup a target configuration\n", - "my_target_conf = {\n", + "from env import TestEnv\n", + "\n", + "# Setup a test environment with target configuration\n", + "env = TestEnv({\n", " \n", " # Target platform and board\n", " \"platform\" : 'linux',\n", - " \"board\" : 'aboard',\n", + " \"board\" : 'juno2',\n", " \n", " # Target board IP/MAC address\n", " \"host\" : '192.168.0.1',\n", @@ -77,7 +213,27 @@ " \"username\" : 'root',\n", " \"password\" : 'test0000',\n", "\n", - "}" + " # Folder where all the results will be collected\n", + " \"results_dir\" : \"ExecutorExample\",\n", + " \n", + " # FTrace events to collect for all the tests configuration which have\n", + " # the \"ftrace\" flag enabled\n", + " \"ftrace\" : {\n", + " \"events\" : [\n", + " \"sched_switch\",\n", + " \"sched_wakeup\",\n", + " \"sched_wakeup_new\",\n", + " \"cpu_frequency\",\n", + " ],\n", + " \"buffsize\" : 80 * 1024,\n", + " },\n", + " \n", + " # Tools required by the experiments\n", + " \"tools\" : [ 'trace-cmd', 'perf' ],\n", + " \n", + " # Modules required by these experiments\n", + " \"modules\" : [ 'bl', 'cpufreq' ],\n", + "})" ] }, { @@ -98,9 +254,6 @@ "source": [ "my_tests_conf = {\n", "\n", - " # Folder where all the results will be collected\n", - " \"results_dir\" : \"ExecutorExample\",\n", - "\n", " # Platform configurations to test\n", " \"confs\" : [\n", " {\n", @@ -144,7 +297,7 @@ " \"class\" : \"profile\",\n", " \"params\" : {\n", " \"p20\" : {\n", - " \"kind\" : \"periodic\",\n", + " \"kind\" : \"Periodic\",\n", " \"params\" : {\n", " \"duty_cycle_pct\" : 20,\n", " },\n", @@ -156,25 +309,6 @@ " \n", " # Number of iterations for each workload\n", " \"iterations\" : 1,\n", - " \n", - " # FTrace events to collect for all the tests configuration which have\n", - " # the \"ftrace\" flag enabled\n", - " \"ftrace\" : {\n", - " \"events\" : [\n", - " \"sched_switch\",\n", - " \"sched_wakeup\",\n", - " \"sched_wakeup_new\",\n", - " \"cpu_frequency\",\n", - " ],\n", - " \"buffsize\" : 80 * 1024,\n", - " },\n", - " \n", - " # Tools required by the experiments\n", - " \"tools\" : [ 'trace-cmd', 'perf' ],\n", - " \n", - " # Modules required by these experiments\n", - " \"modules\" : [ 'bl', 'cpufreq' ],\n", - "\n", "}" ] }, @@ -196,140 +330,274 @@ "name": "stderr", "output_type": "stream", "text": [ - "10:22:10 INFO : Target - Loading custom (inline) test configuration\n", - "10:22:10 INFO : Target - Using base path: /home/derkling/Code/lisa\n", - "10:22:10 INFO : Target - Loading custom (inline) target configuration\n", - "10:22:10 INFO : Target - Loading custom (inline) test configuration\n", - "10:22:10 INFO : Target - Devlib modules to load: ['bl', 'cpufreq']\n", - "10:22:10 INFO : Target - Connecting linux target:\n", - "10:22:10 INFO : Target - username : root\n", - "10:22:10 INFO : Target - host : 192.168.0.1\n", - "10:22:10 INFO : Target - password : test0000\n", - "10:22:15 INFO : Target - Initializing target workdir:\n", - "10:22:15 INFO : Target - /root/devlib-target\n", - "10:22:21 INFO : Target - Topology:\n", - "10:22:21 INFO : Target - [[0, 3, 4, 5], [1, 2]]\n", - "10:22:25 INFO : FTrace - Enabled tracepoints:\n", - "10:22:25 INFO : FTrace - sched_switch\n", - "10:22:25 INFO : FTrace - sched_wakeup\n", - "10:22:25 INFO : FTrace - sched_wakeup_new\n", - "10:22:25 INFO : FTrace - cpu_frequency\n", - "10:22:25 INFO : TestEnv - Set results folder to:\n", - "10:22:25 INFO : TestEnv - /home/derkling/Code/lisa/results/ExecutorExample\n", - "10:22:25 INFO : TestEnv - Experiment results available also in:\n", - "10:22:25 INFO : TestEnv - /home/derkling/Code/lisa/results_latest\n", - "10:22:25 INFO : \n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : Executor - Experiments configuration\n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : Executor - Configured to run:\n", - "10:22:25 INFO : Executor - 2 targt configurations:\n", - "10:22:25 INFO : Executor - base, eas\n", - "10:22:25 INFO : Executor - 2 workloads (1 iterations each)\n", - "10:22:25 INFO : Executor - rta, perf\n", - "10:22:25 INFO : Executor - Total: 4 experiments\n", - "10:22:25 INFO : Executor - Results will be collected under:\n", - "10:22:25 INFO : Executor - /home/derkling/Code/lisa/results/ExecutorExample\n" + "05:01:07 INFO : Target - Loading custom (inline) test configuration\n", + "05:01:07 INFO : \n", + "05:01:07 INFO : ################################################################################\n", + "05:01:07 INFO : Executor - Experiments configuration\n", + "05:01:07 INFO : ################################################################################\n", + "05:01:07 INFO : Executor - Configured to run:\n", + "05:01:07 INFO : Executor - 2 target configurations:\n", + "05:01:07 INFO : Executor - base, eas\n", + "05:01:07 INFO : Executor - 2 workloads (1 iterations each)\n", + "05:01:07 INFO : Executor - rta, perf\n", + "05:01:07 INFO : Executor - Total: 4 experiments\n", + "05:01:07 INFO : Executor - Results will be collected under:\n", + "05:01:07 INFO : Executor - /home/bjackman/sources/lisa/results/ExecutorExample\n" ] } ], "source": [ "from executor import Executor\n", "\n", - "executor = Executor(my_target_conf, my_tests_conf)" + "executor = Executor(env, my_tests_conf)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": false, + "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "10:22:25 INFO : \n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : Executor - Experiments execution\n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : \n", - "10:22:25 INFO : ================================================================================\n", - "10:22:25 INFO : TargetConfig - configuring target for [base] experiments\n", - "10:22:27 INFO : SchedFeatures - Set scheduler feature: NO_ENERGY_AWARE\n", - "10:22:27 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", - "10:22:27 INFO : WlGen - Setup new workload rta\n", - "10:22:27 INFO : RTApp - Workload duration defined by longest task\n", - "10:22:27 INFO : RTApp - Default policy: SCHED_OTHER\n", - "10:22:27 INFO : RTApp - ------------------------\n", - "10:22:27 INFO : RTApp - task [task_p20], sched: using default policy\n", - "10:22:27 INFO : RTApp - | calibration CPU: 1\n", - "10:22:27 INFO : RTApp - | loops count: 1\n", - "10:22:27 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", - "10:22:27 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", - "10:22:27 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", - "10:22:28 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:22:28 INFO : Executor - Experiment 1/4, [base:rta] 1/1\n", - "10:22:28 WARNING : Executor - FTrace events collection enabled\n", - "10:22:34 INFO : WlGen - Workload execution START:\n", - "10:22:34 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "10:22:43 INFO : Executor - Collected FTrace binary trace:\n", - "10:22:43 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", - "10:22:43 INFO : Executor - Collected FTrace function profiling:\n", - "10:22:43 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", - "10:22:43 INFO : WlGen - Setup new workload perf\n", - "10:22:43 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:22:43 INFO : Executor - Experiment 2/4, [base:perf] 1/1\n", - "10:22:43 WARNING : Executor - FTrace events collection enabled\n", - "10:22:49 INFO : WlGen - Workload execution START:\n", - "10:22:49 INFO : WlGen - /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", - "10:22:50 INFO : PerfBench - Completion time: 0.088000, Performance 11.363636\n", - "10:22:57 INFO : Executor - Collected FTrace binary trace:\n", - "10:22:57 INFO : Executor - /perf_bench_messaging:base:perf/1/trace.dat\n", - "10:22:57 INFO : Executor - Collected FTrace function profiling:\n", - "10:22:57 INFO : Executor - /perf_bench_messaging:base:perf/1/trace_stat.json\n", - "10:22:57 INFO : \n", - "10:22:57 INFO : ================================================================================\n", - "10:22:57 INFO : TargetConfig - configuring target for [eas] experiments\n", - "10:22:59 INFO : SchedFeatures - Set scheduler feature: ENERGY_AWARE\n", - "10:22:59 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", - "10:22:59 INFO : WlGen - Setup new workload rta\n", - "10:22:59 INFO : RTApp - Workload duration defined by longest task\n", - "10:22:59 INFO : RTApp - Default policy: SCHED_OTHER\n", - "10:22:59 INFO : RTApp - ------------------------\n", - "10:22:59 INFO : RTApp - task [task_p20], sched: using default policy\n", - "10:22:59 INFO : RTApp - | calibration CPU: 1\n", - "10:22:59 INFO : RTApp - | loops count: 1\n", - "10:22:59 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", - "10:22:59 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", - "10:22:59 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", - "10:23:00 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:23:00 INFO : Executor - Experiment 3/4, [eas:rta] 1/1\n", - "10:23:00 WARNING : Executor - FTrace events collection enabled\n", - "10:23:06 INFO : WlGen - Workload execution START:\n", - "10:23:06 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "10:23:16 INFO : Executor - Collected FTrace binary trace:\n", - "10:23:16 INFO : Executor - /rtapp:eas:rta/1/trace.dat\n", - "10:23:16 INFO : Executor - Collected FTrace function profiling:\n", - "10:23:16 INFO : Executor - /rtapp:eas:rta/1/trace_stat.json\n", - "10:23:16 INFO : WlGen - Setup new workload perf\n", - "10:23:17 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:23:17 INFO : Executor - Experiment 4/4, [eas:perf] 1/1\n", - "10:23:17 WARNING : Executor - FTrace events collection enabled\n", - "10:23:22 INFO : WlGen - Workload execution START:\n", - "10:23:22 INFO : WlGen - /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", - "10:23:23 INFO : PerfBench - Completion time: 0.119000, Performance 8.403361\n", - "10:23:31 INFO : Executor - Collected FTrace binary trace:\n", - "10:23:31 INFO : Executor - /perf_bench_messaging:eas:perf/1/trace.dat\n", - "10:23:31 INFO : Executor - Collected FTrace function profiling:\n", - "10:23:31 INFO : Executor - /perf_bench_messaging:eas:perf/1/trace_stat.json\n", - "10:23:31 INFO : \n", - "10:23:31 INFO : ################################################################################\n", - "10:23:31 INFO : Executor - Experiments execution completed\n", - "10:23:31 INFO : ################################################################################\n", - "10:23:31 INFO : Executor - Results available in:\n", - "10:23:31 INFO : Executor - /home/derkling/Code/lisa/results/ExecutorExample\n" + "05:01:07 INFO : \n", + "05:01:07 INFO : ################################################################################\n", + "05:01:07 INFO : Executor - Experiments execution\n", + "05:01:07 INFO : ################################################################################\n", + "05:01:07 INFO : \n", + "05:01:07 INFO : ================================================================================\n", + "05:01:07 INFO : TargetConfig - configuring target for [base] experiments\n", + "2016-11-17 17:01:07,401 DEBUG : sudo -- sh -c '[ -d /home/brendan/devlib-target/run_dir ] || mkdir /home/brendan/devlib-target/run_dir'\n", + "2016-11-17 17:01:08,306 DEBUG : sudo -- sh -c 'grep schedtest /proc/mounts || mount -t tmpfs -o size=1024m schedtest /home/brendan/devlib-target/run_dir'\n", + "05:01:09 INFO : SchedFeatures - Set scheduler feature: NO_ENERGY_AWARE\n", + "2016-11-17 17:01:09,212 DEBUG : sudo -- sh -c 'echo NO_ENERGY_AWARE > /sys/kernel/debug/sched_features'\n", + "05:01:10 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", + "2016-11-17 17:01:10,118 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_set_all_governors performance'\n", + "05:01:10 INFO : WlGen - Setup new workload rta\n", + "05:01:10 INFO : RTApp - Workload duration defined by longest task\n", + "05:01:10 INFO : RTApp - Default policy: SCHED_OTHER\n", + "05:01:10 INFO : RTApp - ------------------------\n", + "05:01:10 INFO : RTApp - task [task_p200], sched: using default policy\n", + "05:01:10 INFO : RTApp - | calibration CPU: 1\n", + "05:01:10 INFO : RTApp - | loops count: 1\n", + "05:01:10 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "05:01:10 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "05:01:10 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "2016-11-17 17:01:10,934 DEBUG : /usr/bin/scp -r rta_00.json brendan@192.168.0.1:/home/brendan/devlib-target/run_dir\n", + "2016-11-17 17:01:11,184 DEBUG : zcat /proc/config.gz\n", + "2016-11-17 17:01:11,706 DEBUG : /home/brendan/devlib-target/bin/busybox uname -a\n", + "05:01:12 INFO : WlGen - Setup new workload perf\n", + "2016-11-17 17:01:12,149 DEBUG : /home/brendan/devlib-target/bin/busybox uname -a\n", + "05:01:12 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "05:01:12 INFO : Executor - Experiment 0/4, [base:rta] 1/1\n", + "05:01:12 WARNING : Executor - FTrace events collection enabled\n", + "2016-11-17 17:01:12,569 DEBUG : sudo -- sh -c 'echo 81920 > '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:01:13,272 DEBUG : sudo -- sh -c 'cat '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:01:14,178 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd reset'\n", + "2016-11-17 17:01:15,707 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd start -e sched_switch -e sched_wakeup -e sched_wakeup_new -e cpu_frequency'\n", + "2016-11-17 17:01:17,247 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_START > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:01:17,850 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:01:17,951 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:01:18,857 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:01:19,762 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "05:01:20 INFO : WlGen - Workload execution START:\n", + "05:01:20 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "2016-11-17 17:01:20,671 DEBUG : /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "2016-11-17 17:01:22,087 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:'/home/brendan/devlib-target/run_dir/*task_p200*.log' /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:base:rta/1\n", + "2016-11-17 17:01:22,240 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/run_dir/rta_00.json /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:base:rta/1\n", + "2016-11-17 17:01:22,493 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:01:23,400 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "2016-11-17 17:01:24,205 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:01:24,307 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:01:25,213 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_STOP > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:01:25,915 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd stop'\n", + "2016-11-17 17:01:26,821 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd extract -o /home/brendan/devlib-target/trace.dat'\n", + "2016-11-17 17:01:28,593 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/trace.dat /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:base:rta/1/trace.dat\n", + "05:01:35 INFO : Executor - Collected FTrace binary trace:\n", + "05:01:35 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", + "05:01:35 INFO : Executor - Collected FTrace function profiling:\n", + "05:01:35 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", + "05:01:35 INFO : --------------------------------------------------------------------------------\n", + "05:01:35 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "05:01:35 INFO : Executor - Experiment 1/4, [base:perf] 1/1\n", + "05:01:35 WARNING : Executor - FTrace events collection enabled\n", + "2016-11-17 17:01:35,737 DEBUG : sudo -- sh -c 'echo 81920 > '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:01:36,440 DEBUG : sudo -- sh -c 'cat '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:01:37,346 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd reset'\n", + "2016-11-17 17:01:38,888 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd start -e sched_switch -e sched_wakeup -e sched_wakeup_new -e cpu_frequency'\n", + "2016-11-17 17:01:40,434 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_START > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:01:41,037 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:01:41,139 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:01:42,045 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:01:42,951 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "05:01:43 INFO : WlGen - Workload execution START:\n", + "05:01:43 INFO : WlGen - /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "2016-11-17 17:01:43,859 DEBUG : /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "05:01:44 INFO : PerfBench - Completion time: 0.012000, Performance 83.333333\n", + "2016-11-17 17:01:44,284 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:01:45,190 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "2016-11-17 17:01:45,995 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:01:46,097 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:01:47,003 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_STOP > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:01:49,258 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd stop'\n", + "2016-11-17 17:01:50,164 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd extract -o /home/brendan/devlib-target/trace.dat'\n", + "2016-11-17 17:01:51,947 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/trace.dat /home/bjackman/sources/lisa/results/ExecutorExample/perf_bench_messaging:base:perf/1/trace.dat\n", + "05:01:52 INFO : Executor - Collected FTrace binary trace:\n", + "05:01:52 INFO : Executor - /perf_bench_messaging:base:perf/1/trace.dat\n", + "05:01:52 INFO : Executor - Collected FTrace function profiling:\n", + "05:01:52 INFO : Executor - /perf_bench_messaging:base:perf/1/trace_stat.json\n", + "05:01:52 INFO : --------------------------------------------------------------------------------\n", + "05:01:52 INFO : \n", + "05:01:52 INFO : ================================================================================\n", + "05:01:52 INFO : TargetConfig - configuring target for [eas] experiments\n", + "2016-11-17 17:01:52,740 DEBUG : sudo -- sh -c '[ -d /home/brendan/devlib-target/run_dir ] || mkdir /home/brendan/devlib-target/run_dir'\n", + "2016-11-17 17:01:53,646 DEBUG : sudo -- sh -c 'grep schedtest /proc/mounts || mount -t tmpfs -o size=1024m schedtest /home/brendan/devlib-target/run_dir'\n", + "05:01:54 INFO : SchedFeatures - Set scheduler feature: ENERGY_AWARE\n", + "2016-11-17 17:01:54,552 DEBUG : sudo -- sh -c 'echo ENERGY_AWARE > /sys/kernel/debug/sched_features'\n", + "05:01:55 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", + "2016-11-17 17:01:55,460 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_set_all_governors performance'\n", + "05:01:56 INFO : WlGen - Setup new workload rta\n", + "05:01:56 INFO : RTApp - Workload duration defined by longest task\n", + "05:01:56 INFO : RTApp - Default policy: SCHED_OTHER\n", + "05:01:56 INFO : RTApp - ------------------------\n", + "05:01:56 INFO : RTApp - task [task_p200], sched: using default policy\n", + "05:01:56 INFO : RTApp - | calibration CPU: 1\n", + "05:01:56 INFO : RTApp - | loops count: 1\n", + "05:01:56 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "05:01:56 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "05:01:56 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "2016-11-17 17:01:56,276 DEBUG : /usr/bin/scp -r rta_00.json brendan@192.168.0.1:/home/brendan/devlib-target/run_dir\n", + "2016-11-17 17:01:56,579 DEBUG : /home/brendan/devlib-target/bin/busybox uname -a\n", + "05:01:56 INFO : WlGen - Setup new workload perf\n", + "2016-11-17 17:01:57,022 DEBUG : /home/brendan/devlib-target/bin/busybox uname -a\n", + "05:01:57 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "05:01:57 INFO : Executor - Experiment 0/4, [base:rta] 1/1\n", + "05:01:57 WARNING : Executor - FTrace events collection enabled\n", + "2016-11-17 17:01:57,442 DEBUG : sudo -- sh -c 'echo 81920 > '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:01:58,146 DEBUG : sudo -- sh -c 'cat '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:01:59,052 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd reset'\n", + "2016-11-17 17:02:00,818 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd start -e sched_switch -e sched_wakeup -e sched_wakeup_new -e cpu_frequency'\n", + "2016-11-17 17:02:02,450 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_START > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:02:03,052 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:03,154 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:04,061 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:04,967 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "05:02:05 INFO : WlGen - Workload execution START:\n", + "05:02:05 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "2016-11-17 17:02:05,875 DEBUG : /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "2016-11-17 17:02:07,294 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:'/home/brendan/devlib-target/run_dir/*task_p200*.log' /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:base:rta/1\n", + "2016-11-17 17:02:07,464 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/run_dir/rta_00.json /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:base:rta/1\n", + "2016-11-17 17:02:07,734 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:08,640 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "2016-11-17 17:02:09,446 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:09,548 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:10,453 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_STOP > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:02:11,156 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd stop'\n", + "2016-11-17 17:02:12,062 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd extract -o /home/brendan/devlib-target/trace.dat'\n", + "2016-11-17 17:02:14,012 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/trace.dat /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:base:rta/1/trace.dat\n", + "05:02:14 INFO : Executor - Collected FTrace binary trace:\n", + "05:02:14 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", + "05:02:14 INFO : Executor - Collected FTrace function profiling:\n", + "05:02:14 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", + "05:02:14 INFO : --------------------------------------------------------------------------------\n", + "05:02:14 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "05:02:14 INFO : Executor - Experiment 1/4, [base:perf] 1/1\n", + "05:02:14 WARNING : Executor - FTrace events collection enabled\n", + "2016-11-17 17:02:14,771 DEBUG : sudo -- sh -c 'echo 81920 > '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:02:15,473 DEBUG : sudo -- sh -c 'cat '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:02:16,379 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd reset'\n", + "2016-11-17 17:02:18,021 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd start -e sched_switch -e sched_wakeup -e sched_wakeup_new -e cpu_frequency'\n", + "2016-11-17 17:02:19,703 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_START > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:02:20,305 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:20,407 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:21,313 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:22,219 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "05:02:23 INFO : WlGen - Workload execution START:\n", + "05:02:23 INFO : WlGen - /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "2016-11-17 17:02:23,127 DEBUG : /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "05:02:23 INFO : PerfBench - Completion time: 0.080000, Performance 12.500000\n", + "2016-11-17 17:02:23,628 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:24,534 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "2016-11-17 17:02:25,340 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:25,442 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:26,347 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_STOP > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:02:27,050 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd stop'\n", + "2016-11-17 17:02:27,956 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd extract -o /home/brendan/devlib-target/trace.dat'\n", + "2016-11-17 17:02:30,090 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/trace.dat /home/bjackman/sources/lisa/results/ExecutorExample/perf_bench_messaging:base:perf/1/trace.dat\n", + "05:02:30 INFO : Executor - Collected FTrace binary trace:\n", + "05:02:30 INFO : Executor - /perf_bench_messaging:base:perf/1/trace.dat\n", + "05:02:30 INFO : Executor - Collected FTrace function profiling:\n", + "05:02:30 INFO : Executor - /perf_bench_messaging:base:perf/1/trace_stat.json\n", + "05:02:30 INFO : --------------------------------------------------------------------------------\n", + "05:02:30 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "05:02:30 INFO : Executor - Experiment 2/4, [eas:rta] 1/1\n", + "05:02:30 WARNING : Executor - FTrace events collection enabled\n", + "2016-11-17 17:02:30,869 DEBUG : sudo -- sh -c 'echo 81920 > '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:02:31,572 DEBUG : sudo -- sh -c 'cat '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:02:32,478 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd reset'\n", + "2016-11-17 17:02:34,271 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd start -e sched_switch -e sched_wakeup -e sched_wakeup_new -e cpu_frequency'\n", + "2016-11-17 17:02:35,963 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_START > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:02:36,565 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:36,667 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:37,573 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:38,479 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "05:02:39 INFO : WlGen - Workload execution START:\n", + "05:02:39 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "2016-11-17 17:02:39,387 DEBUG : /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "2016-11-17 17:02:40,807 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:'/home/brendan/devlib-target/run_dir/*task_p200*.log' /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:eas:rta/1\n", + "2016-11-17 17:02:40,980 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/run_dir/rta_00.json /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:eas:rta/1\n", + "2016-11-17 17:02:41,231 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:42,137 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "2016-11-17 17:02:42,943 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:43,045 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:43,950 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_STOP > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:02:44,653 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd stop'\n", + "2016-11-17 17:02:45,559 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd extract -o /home/brendan/devlib-target/trace.dat'\n", + "2016-11-17 17:02:47,519 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/trace.dat /home/bjackman/sources/lisa/results/ExecutorExample/rtapp:eas:rta/1/trace.dat\n", + "05:02:48 INFO : Executor - Collected FTrace binary trace:\n", + "05:02:48 INFO : Executor - /rtapp:eas:rta/1/trace.dat\n", + "05:02:48 INFO : Executor - Collected FTrace function profiling:\n", + "05:02:48 INFO : Executor - /rtapp:eas:rta/1/trace_stat.json\n", + "05:02:48 INFO : --------------------------------------------------------------------------------\n", + "05:02:48 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "05:02:48 INFO : Executor - Experiment 3/4, [eas:perf] 1/1\n", + "05:02:48 WARNING : Executor - FTrace events collection enabled\n", + "2016-11-17 17:02:48,276 DEBUG : sudo -- sh -c 'echo 81920 > '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:02:48,979 DEBUG : sudo -- sh -c 'cat '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n", + "2016-11-17 17:02:49,885 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd reset'\n", + "2016-11-17 17:02:51,485 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd start -e sched_switch -e sched_wakeup -e sched_wakeup_new -e cpu_frequency'\n", + "2016-11-17 17:02:53,160 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_START > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:02:53,763 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:53,865 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:54,771 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:55,676 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "05:02:56 INFO : WlGen - Workload execution START:\n", + "05:02:56 INFO : WlGen - /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "2016-11-17 17:02:56,585 DEBUG : /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "05:02:56 INFO : PerfBench - Completion time: 0.083000, Performance 12.048193\n", + "2016-11-17 17:02:57,088 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy2_input'\\'''\n", + "2016-11-17 17:02:57,994 DEBUG : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/energy3_input'\\'''\n", + "2016-11-17 17:02:58,799 DEBUG : Trace CPUFreq frequencies\n", + "2016-11-17 17:02:58,901 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n", + "2016-11-17 17:02:59,807 DEBUG : sudo -- sh -c 'echo TRACE_MARKER_STOP > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n", + "2016-11-17 17:03:00,510 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd stop'\n", + "2016-11-17 17:03:01,415 DEBUG : sudo -- sh -c '/home/brendan/devlib-target/bin/trace-cmd extract -o /home/brendan/devlib-target/trace.dat'\n", + "2016-11-17 17:03:03,385 DEBUG : /usr/bin/scp -r brendan@192.168.0.1:/home/brendan/devlib-target/trace.dat /home/bjackman/sources/lisa/results/ExecutorExample/perf_bench_messaging:eas:perf/1/trace.dat\n", + "05:03:04 INFO : Executor - Collected FTrace binary trace:\n", + "05:03:04 INFO : Executor - /perf_bench_messaging:eas:perf/1/trace.dat\n", + "05:03:04 INFO : Executor - Collected FTrace function profiling:\n", + "05:03:04 INFO : Executor - /perf_bench_messaging:eas:perf/1/trace_stat.json\n", + "05:03:04 INFO : --------------------------------------------------------------------------------\n", + "05:03:04 INFO : \n", + "05:03:04 INFO : ################################################################################\n", + "05:03:04 INFO : Executor - Experiments execution completed\n", + "05:03:04 INFO : ################################################################################\n", + "05:03:04 INFO : Executor - Results available in:\n", + "05:03:04 INFO : Executor - /home/bjackman/sources/lisa/results/ExecutorExample\n" ] } ], @@ -348,9 +616,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[01;34m/home/derkling/Code/lisa/results/ExecutorExample\u001b[00m\r\n", + "\u001b[01;34m/home/bjackman/sources/lisa/results/ExecutorExample\u001b[00m\r\n", "├── \u001b[01;34mperf_bench_messaging:base:perf\u001b[00m\r\n", "│   ├── \u001b[01;34m1\u001b[00m\r\n", + "│   │   ├── energy.json\r\n", "│   │   ├── output.log\r\n", "│   │   ├── performance.json\r\n", "│   │   └── trace.dat\r\n", @@ -359,6 +628,7 @@ "│   └── platform.json\r\n", "├── \u001b[01;34mperf_bench_messaging:eas:perf\u001b[00m\r\n", "│   ├── \u001b[01;34m1\u001b[00m\r\n", + "│   │   ├── energy.json\r\n", "│   │   ├── output.log\r\n", "│   │   ├── performance.json\r\n", "│   │   └── trace.dat\r\n", @@ -367,24 +637,26 @@ "│   └── platform.json\r\n", "├── \u001b[01;34mrtapp:base:rta\u001b[00m\r\n", "│   ├── \u001b[01;34m1\u001b[00m\r\n", + "│   │   ├── energy.json\r\n", "│   │   ├── output.log\r\n", "│   │   ├── rta_00.json\r\n", - "│   │   ├── rt-app-task_p20-0.log\r\n", + "│   │   ├── rt-app-task_p200-0.log\r\n", "│   │   └── trace.dat\r\n", "│   ├── kernel.config\r\n", "│   ├── kernel.version\r\n", "│   └── platform.json\r\n", "└── \u001b[01;34mrtapp:eas:rta\u001b[00m\r\n", " ├── \u001b[01;34m1\u001b[00m\r\n", + " │   ├── energy.json\r\n", " │   ├── output.log\r\n", " │   ├── rta_00.json\r\n", - " │   ├── rt-app-task_p20-0.log\r\n", + " │   ├── rt-app-task_p200-0.log\r\n", " │   └── trace.dat\r\n", " ├── kernel.config\r\n", " ├── kernel.version\r\n", " └── platform.json\r\n", "\r\n", - "8 directories, 26 files\r\n" + "8 directories, 30 files\r\n" ] } ], @@ -409,7 +681,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.9" + "version": "2.7.6" } }, "nbformat": 4, diff --git a/ipynb/utils/executor_example.ipynb b/ipynb/utils/executor_example.ipynb index c11e4a0d348fc3aadb6ab2c5f1f65eb698c02950..ff891f64b624683e29955ad57eb6bbad55f5621b 100644 --- a/ipynb/utils/executor_example.ipynb +++ b/ipynb/utils/executor_example.ipynb @@ -52,6 +52,7 @@ "#import devlib\n", "#from env import TestEnv\n", "\n", + "from env import TestEnv\n", "from executor import Executor" ] }, @@ -68,10 +69,41 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "06:16:08 INFO : Target - Using base path: /home/bjackman/sources/lisa\n", + "06:16:08 INFO : Target - Loading custom (inline) target configuration\n", + "06:16:08 INFO : Target - Devlib modules to load: ['bl', 'cpufreq']\n", + "06:16:08 INFO : Target - Connecting linux target:\n", + "06:16:08 INFO : Target - username : brendan\n", + "06:16:08 INFO : Target - host : 192.168.0.1\n", + "06:16:08 INFO : Target - password : \n", + "06:16:08 INFO : Target - Connection settings:\n", + "06:16:08 INFO : Target - {'username': 'brendan', 'host': '192.168.0.1', 'password': ''}\n", + "06:16:14 INFO : Target - Initializing target workdir:\n", + "06:16:14 INFO : Target - /home/brendan/devlib-target\n", + "06:16:18 INFO : Target - Topology:\n", + "06:16:18 INFO : Target - [[0, 3, 4, 5], [1, 2]]\n", + "06:16:23 INFO : FTrace - Enabled tracepoints:\n", + "06:16:23 INFO : FTrace - sched_switch\n", + "06:16:23 INFO : FTrace - sched_wakeup\n", + "06:16:23 INFO : FTrace - sched_wakeup_new\n", + "06:16:23 INFO : FTrace - cpu_frequency\n", + "06:16:23 WARNING : TestEnv - Wipe previous contents of the results folder:\n", + "06:16:23 WARNING : TestEnv - /home/bjackman/sources/lisa/results/ExecutorExample\n", + "06:16:23 INFO : TestEnv - Set results folder to:\n", + "06:16:23 INFO : TestEnv - /home/bjackman/sources/lisa/results/ExecutorExample\n", + "06:16:23 INFO : TestEnv - Experiment results available also in:\n", + "06:16:23 INFO : TestEnv - /home/bjackman/sources/lisa/results_latest\n" + ] + } + ], "source": [ "# Setup a target configuration\n", - "my_target_conf = {\n", + "env = TestEnv({\n", " \n", " # Target platform and board\n", " \"platform\" : 'linux',\n", @@ -81,10 +113,31 @@ " \"host\" : '192.168.0.1',\n", " \n", " # Login credentials\n", - " \"username\" : 'root',\n", - " \"password\" : 'test0000',\n", + " \"username\" : 'brendan',\n", + " \"password\" : '',\n", + " \n", + " # Folder where all the results will be collected\n", + " \"results_dir\" : \"ExecutorExample\",\n", + " \n", + " # FTrace events to collect for all the tests configuration which have\n", + " # the \"ftrace\" flag enabled\n", + " \"ftrace\" : {\n", + " \"events\" : [\n", + " \"sched_switch\",\n", + " \"sched_wakeup\",\n", + " \"sched_wakeup_new\",\n", + " \"cpu_frequency\",\n", + " ],\n", + " \"buffsize\" : 80 * 1024,\n", + " },\n", + " \n", + " # Tools required by the experiments\n", + " \"tools\" : [ 'trace-cmd', 'perf' ],\n", + " \n", + " # Modules required by these experiments\n", + " \"modules\" : [ 'bl', 'cpufreq' ],\n", "\n", - "}" + "})" ] }, { @@ -96,18 +149,34 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "06:16:23 INFO : Target - Loading custom (inline) test configuration\n", + "06:16:23 INFO : \n", + "06:16:23 INFO : ################################################################################\n", + "06:16:23 INFO : Executor - Experiments configuration\n", + "06:16:23 INFO : ################################################################################\n", + "06:16:23 INFO : Executor - Configured to run:\n", + "06:16:23 INFO : Executor - 2 target configurations:\n", + "06:16:23 INFO : Executor - base, eas\n", + "06:16:23 INFO : Executor - 2 workloads (1 iterations each)\n", + "06:16:23 INFO : Executor - rta, perf\n", + "06:16:23 INFO : Executor - Total: 4 experiments\n", + "06:16:23 INFO : Executor - Results will be collected under:\n", + "06:16:23 INFO : Executor - /home/bjackman/sources/lisa/results/ExecutorExample\n" + ] + } + ], "source": [ - "my_tests_conf = {\n", - "\n", - " # Folder where all the results will be collected\n", - " \"results_dir\" : \"ExecutorExample\",\n", - "\n", + "executor = Executor(env, {\n", " # Platform configurations to test\n", " \"confs\" : [\n", " {\n", @@ -151,7 +220,7 @@ " \"class\" : \"profile\",\n", " \"params\" : {\n", " \"p20\" : {\n", - " \"kind\" : \"periodic\",\n", + " \"kind\" : \"Periodic\",\n", " \"params\" : {\n", " \"duty_cycle_pct\" : 20,\n", " },\n", @@ -163,26 +232,7 @@ " \n", " # Number of iterations for each workload\n", " \"iterations\" : 1,\n", - " \n", - " # FTrace events to collect for all the tests configuration which have\n", - " # the \"ftrace\" flag enabled\n", - " \"ftrace\" : {\n", - " \"events\" : [\n", - " \"sched_switch\",\n", - " \"sched_wakeup\",\n", - " \"sched_wakeup_new\",\n", - " \"cpu_frequency\",\n", - " ],\n", - " \"buffsize\" : 80 * 1024,\n", - " },\n", - " \n", - " # Tools required by the experiments\n", - " \"tools\" : [ 'trace-cmd', 'perf' ],\n", - " \n", - " # Modules required by these experiments\n", - " \"modules\" : [ 'bl', 'cpufreq' ],\n", - "\n", - "}" + "})" ] }, { @@ -194,59 +244,7 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "10:22:10 INFO : Target - Loading custom (inline) test configuration\n", - "10:22:10 INFO : Target - Using base path: /home/derkling/Code/lisa\n", - "10:22:10 INFO : Target - Loading custom (inline) target configuration\n", - "10:22:10 INFO : Target - Loading custom (inline) test configuration\n", - "10:22:10 INFO : Target - Devlib modules to load: ['bl', 'cpufreq']\n", - "10:22:10 INFO : Target - Connecting linux target:\n", - "10:22:10 INFO : Target - username : root\n", - "10:22:10 INFO : Target - host : 192.168.0.1\n", - "10:22:10 INFO : Target - password : test0000\n", - "10:22:15 INFO : Target - Initializing target workdir:\n", - "10:22:15 INFO : Target - /root/devlib-target\n", - "10:22:21 INFO : Target - Topology:\n", - "10:22:21 INFO : Target - [[0, 3, 4, 5], [1, 2]]\n", - "10:22:25 INFO : FTrace - Enabled tracepoints:\n", - "10:22:25 INFO : FTrace - sched_switch\n", - "10:22:25 INFO : FTrace - sched_wakeup\n", - "10:22:25 INFO : FTrace - sched_wakeup_new\n", - "10:22:25 INFO : FTrace - cpu_frequency\n", - "10:22:25 INFO : TestEnv - Set results folder to:\n", - "10:22:25 INFO : TestEnv - /home/derkling/Code/lisa/results/ExecutorExample\n", - "10:22:25 INFO : TestEnv - Experiment results available also in:\n", - "10:22:25 INFO : TestEnv - /home/derkling/Code/lisa/results_latest\n", - "10:22:25 INFO : \n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : Executor - Experiments configuration\n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : Executor - Configured to run:\n", - "10:22:25 INFO : Executor - 2 targt configurations:\n", - "10:22:25 INFO : Executor - base, eas\n", - "10:22:25 INFO : Executor - 2 workloads (1 iterations each)\n", - "10:22:25 INFO : Executor - rta, perf\n", - "10:22:25 INFO : Executor - Total: 4 experiments\n", - "10:22:25 INFO : Executor - Results will be collected under:\n", - "10:22:25 INFO : Executor - /home/derkling/Code/lisa/results/ExecutorExample\n" - ] - } - ], - "source": [ - "executor = Executor(my_target_conf, my_tests_conf)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { "collapsed": false }, @@ -255,86 +253,79 @@ "name": "stderr", "output_type": "stream", "text": [ - "10:22:25 INFO : \n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : Executor - Experiments execution\n", - "10:22:25 INFO : ################################################################################\n", - "10:22:25 INFO : \n", - "10:22:25 INFO : ================================================================================\n", - "10:22:25 INFO : TargetConfig - configuring target for [base] experiments\n", - "10:22:27 INFO : SchedFeatures - Set scheduler feature: NO_ENERGY_AWARE\n", - "10:22:27 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", - "10:22:27 INFO : WlGen - Setup new workload rta\n", - "10:22:27 INFO : RTApp - Workload duration defined by longest task\n", - "10:22:27 INFO : RTApp - Default policy: SCHED_OTHER\n", - "10:22:27 INFO : RTApp - ------------------------\n", - "10:22:27 INFO : RTApp - task [task_p20], sched: using default policy\n", - "10:22:27 INFO : RTApp - | calibration CPU: 1\n", - "10:22:27 INFO : RTApp - | loops count: 1\n", - "10:22:27 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", - "10:22:27 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", - "10:22:27 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", - "10:22:28 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:22:28 INFO : Executor - Experiment 1/4, [base:rta] 1/1\n", - "10:22:28 WARNING : Executor - FTrace events collection enabled\n", - "10:22:34 INFO : WlGen - Workload execution START:\n", - "10:22:34 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "10:22:43 INFO : Executor - Collected FTrace binary trace:\n", - "10:22:43 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", - "10:22:43 INFO : Executor - Collected FTrace function profiling:\n", - "10:22:43 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", - "10:22:43 INFO : WlGen - Setup new workload perf\n", - "10:22:43 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:22:43 INFO : Executor - Experiment 2/4, [base:perf] 1/1\n", - "10:22:43 WARNING : Executor - FTrace events collection enabled\n", - "10:22:49 INFO : WlGen - Workload execution START:\n", - "10:22:49 INFO : WlGen - /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", - "10:22:50 INFO : PerfBench - Completion time: 0.088000, Performance 11.363636\n", - "10:22:57 INFO : Executor - Collected FTrace binary trace:\n", - "10:22:57 INFO : Executor - /perf_bench_messaging:base:perf/1/trace.dat\n", - "10:22:57 INFO : Executor - Collected FTrace function profiling:\n", - "10:22:57 INFO : Executor - /perf_bench_messaging:base:perf/1/trace_stat.json\n", - "10:22:57 INFO : \n", - "10:22:57 INFO : ================================================================================\n", - "10:22:57 INFO : TargetConfig - configuring target for [eas] experiments\n", - "10:22:59 INFO : SchedFeatures - Set scheduler feature: ENERGY_AWARE\n", - "10:22:59 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", - "10:22:59 INFO : WlGen - Setup new workload rta\n", - "10:22:59 INFO : RTApp - Workload duration defined by longest task\n", - "10:22:59 INFO : RTApp - Default policy: SCHED_OTHER\n", - "10:22:59 INFO : RTApp - ------------------------\n", - "10:22:59 INFO : RTApp - task [task_p20], sched: using default policy\n", - "10:22:59 INFO : RTApp - | calibration CPU: 1\n", - "10:22:59 INFO : RTApp - | loops count: 1\n", - "10:22:59 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", - "10:22:59 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", - "10:22:59 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", - "10:23:00 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:23:00 INFO : Executor - Experiment 3/4, [eas:rta] 1/1\n", - "10:23:00 WARNING : Executor - FTrace events collection enabled\n", - "10:23:06 INFO : WlGen - Workload execution START:\n", - "10:23:06 INFO : WlGen - /root/devlib-target/bin/rt-app /root/devlib-target/run_dir/rta_00.json\n", - "10:23:16 INFO : Executor - Collected FTrace binary trace:\n", - "10:23:16 INFO : Executor - /rtapp:eas:rta/1/trace.dat\n", - "10:23:16 INFO : Executor - Collected FTrace function profiling:\n", - "10:23:16 INFO : Executor - /rtapp:eas:rta/1/trace_stat.json\n", - "10:23:16 INFO : WlGen - Setup new workload perf\n", - "10:23:17 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", - "10:23:17 INFO : Executor - Experiment 4/4, [eas:perf] 1/1\n", - "10:23:17 WARNING : Executor - FTrace events collection enabled\n", - "10:23:22 INFO : WlGen - Workload execution START:\n", - "10:23:22 INFO : WlGen - /root/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", - "10:23:23 INFO : PerfBench - Completion time: 0.119000, Performance 8.403361\n", - "10:23:31 INFO : Executor - Collected FTrace binary trace:\n", - "10:23:31 INFO : Executor - /perf_bench_messaging:eas:perf/1/trace.dat\n", - "10:23:31 INFO : Executor - Collected FTrace function profiling:\n", - "10:23:31 INFO : Executor - /perf_bench_messaging:eas:perf/1/trace_stat.json\n", - "10:23:31 INFO : \n", - "10:23:31 INFO : ################################################################################\n", - "10:23:31 INFO : Executor - Experiments execution completed\n", - "10:23:31 INFO : ################################################################################\n", - "10:23:31 INFO : Executor - Results available in:\n", - "10:23:31 INFO : Executor - /home/derkling/Code/lisa/results/ExecutorExample\n" + "06:16:23 INFO : \n", + "06:16:23 INFO : ################################################################################\n", + "06:16:23 INFO : Executor - Experiments execution\n", + "06:16:23 INFO : ################################################################################\n", + "06:16:23 INFO : \n", + "06:16:23 INFO : ================================================================================\n", + "06:16:23 INFO : TargetConfig - configuring target for [base] experiments\n", + "06:16:25 INFO : SchedFeatures - Set scheduler feature: NO_ENERGY_AWARE\n", + "06:16:26 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", + "06:16:27 INFO : WlGen - Setup new workload rta\n", + "06:16:27 INFO : RTApp - Workload duration defined by longest task\n", + "06:16:27 INFO : RTApp - Default policy: SCHED_OTHER\n", + "06:16:27 INFO : RTApp - ------------------------\n", + "06:16:27 INFO : RTApp - task [task_p200], sched: using default policy\n", + "06:16:27 INFO : RTApp - | calibration CPU: 1\n", + "06:16:27 INFO : RTApp - | loops count: 1\n", + "06:16:27 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "06:16:27 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "06:16:27 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "06:16:28 INFO : WlGen - Setup new workload perf\n", + "06:16:28 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "06:16:28 INFO : Executor - Experiment 0/4, [base:rta] 1/1\n", + "06:16:28 WARNING : Executor - FTrace events collection enabled\n", + "06:16:36 INFO : WlGen - Workload execution START:\n", + "06:16:36 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "06:16:44 INFO : Executor - Collected FTrace binary trace:\n", + "06:16:44 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", + "06:16:44 INFO : Executor - Collected FTrace function profiling:\n", + "06:16:44 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", + "06:16:44 INFO : --------------------------------------------------------------------------------\n", + "06:16:44 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "06:16:44 INFO : Executor - Experiment 1/4, [base:perf] 1/1\n", + "06:16:44 WARNING : Executor - FTrace events collection enabled\n", + "06:16:52 INFO : WlGen - Workload execution START:\n", + "06:16:52 INFO : WlGen - /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "06:16:53 INFO : PerfBench - Completion time: 0.007000, Performance 142.857143\n", + "06:16:58 INFO : Executor - Collected FTrace binary trace:\n", + "06:16:58 INFO : Executor - /perf_bench_messaging:base:perf/1/trace.dat\n", + "06:16:58 INFO : Executor - Collected FTrace function profiling:\n", + "06:16:58 INFO : Executor - /perf_bench_messaging:base:perf/1/trace_stat.json\n", + "06:16:58 INFO : --------------------------------------------------------------------------------\n", + "06:16:58 INFO : \n", + "06:16:58 INFO : ================================================================================\n", + "06:16:58 INFO : TargetConfig - configuring target for [eas] experiments\n", + "06:17:00 INFO : SchedFeatures - Set scheduler feature: ENERGY_AWARE\n", + "06:17:01 INFO : CPUFreq - Configuring all CPUs to use [performance] governor\n", + "06:17:02 INFO : WlGen - Setup new workload rta\n", + "06:17:02 INFO : RTApp - Workload duration defined by longest task\n", + "06:17:02 INFO : RTApp - Default policy: SCHED_OTHER\n", + "06:17:02 INFO : RTApp - ------------------------\n", + "06:17:02 INFO : RTApp - task [task_p200], sched: using default policy\n", + "06:17:02 INFO : RTApp - | calibration CPU: 1\n", + "06:17:02 INFO : RTApp - | loops count: 1\n", + "06:17:02 INFO : RTApp - + phase_000001: duration 1.000000 [s] (10 loops)\n", + "06:17:02 INFO : RTApp - | period 100000 [us], duty_cycle 20 %\n", + "06:17:02 INFO : RTApp - | run_time 20000 [us], sleep_time 80000 [us]\n", + "06:17:03 INFO : WlGen - Setup new workload perf\n", + "06:17:03 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "06:17:03 INFO : Executor - Experiment 0/4, [base:rta] 1/1\n", + "06:17:03 WARNING : Executor - FTrace events collection enabled\n", + "06:17:11 INFO : WlGen - Workload execution START:\n", + "06:17:11 INFO : WlGen - /home/brendan/devlib-target/bin/rt-app /home/brendan/devlib-target/run_dir/rta_00.json 2>&1\n", + "06:17:19 INFO : Executor - Collected FTrace binary trace:\n", + "06:17:19 INFO : Executor - /rtapp:base:rta/1/trace.dat\n", + "06:17:19 INFO : Executor - Collected FTrace function profiling:\n", + "06:17:19 INFO : Executor - /rtapp:base:rta/1/trace_stat.json\n", + "06:17:19 INFO : --------------------------------------------------------------------------------\n", + "06:17:19 INFO : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n", + "06:17:19 INFO : Executor - Experiment 1/4, [base:perf] 1/1\n", + "06:17:19 WARNING : Executor - FTrace events collection enabled\n", + "06:17:27 INFO : WlGen - Workload execution START:\n", + "06:17:27 INFO : WlGen - /home/brendan/devlib-target/bin/perf bench sched messaging --pipe --thread --group 1 --loop 10\n", + "06:17:28 INFO : PerfBench - Completion time: 0.034000, Performance 29.411765\n" ] } ], @@ -353,7 +344,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[01;34m/home/derkling/Code/lisa/results/ExecutorExample\u001b[00m\r\n", + "\u001b[01;34m/home/brejac01/sources/lisa/results/ExecutorExample\u001b[00m\r\n", "├── \u001b[01;34mperf_bench_messaging:base:perf\u001b[00m\r\n", "│   ├── \u001b[01;34m1\u001b[00m\r\n", "│   │   ├── output.log\r\n", @@ -374,7 +365,7 @@ "│   ├── \u001b[01;34m1\u001b[00m\r\n", "│   │   ├── output.log\r\n", "│   │   ├── rta_00.json\r\n", - "│   │   ├── rt-app-task_p20-0.log\r\n", + "│   │   ├── rt-app-task_p200-0.log\r\n", "│   │   └── trace.dat\r\n", "│   ├── kernel.config\r\n", "│   ├── kernel.version\r\n", @@ -383,7 +374,7 @@ " ├── \u001b[01;34m1\u001b[00m\r\n", " │   ├── output.log\r\n", " │   ├── rta_00.json\r\n", - " │   ├── rt-app-task_p20-0.log\r\n", + " │   ├── rt-app-task_p200-0.log\r\n", " │   └── trace.dat\r\n", " ├── kernel.config\r\n", " ├── kernel.version\r\n", @@ -414,7 +405,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.9" + "version": "2.7.6" } }, "nbformat": 4, diff --git a/libs/utils/executor.py b/libs/utils/executor.py index 367cbfd19d76319af778311b0a1db83c6b376ecd..a93eaf6bc1e35a637f7bbedce9016bba05051e63 100644 --- a/libs/utils/executor.py +++ b/libs/utils/executor.py @@ -34,9 +34,6 @@ logging.basicConfig( level=logging.INFO, datefmt='%I:%M:%S') -# Add support for Test Environment configuration -from env import TestEnv - # Add JSON parsing support from conf import JsonConf @@ -49,7 +46,7 @@ Experiment = namedtuple('Experiment', ['wload_name', 'wload', class Executor(): - def __init__(self, target_conf=None, tests_conf=None): + def __init__(self, test_env, experiments_conf): """ Tests Executor @@ -58,22 +55,27 @@ class Executor(): - a target configuration - a worload to execute - The executor module can be configured to run a set of workloads - (wloads) in each different target configuration of a specified set - (confs). These wloads and confs can be specified by the "tests_config" - input dictionary. + The executor module can be configured to run a set of workloads (wloads) + in each different target configuration of a specified set (confs). These + wloads and confs can be specified by the "experiments_conf" input + dictionary. Each (workload, conf, iteration) tuple is called an + "experiment". All the results generated by each experiment will be collected a result folder which is named according to this template: results//::/ where: - - : the "tid" defined by the tests_config, or a timestamp + - : the "tid" defined by the experiments_conf, or a timestamp based folder in case "tid" is not specified - : the class of workload executed, e.g. rtapp or sched_perf - : the identifier of one of the specified configurations - : the identified of one of the specified workload - : the progressive execution number from 1 up to the specified iterations + + After the workloads have been run, the Executor object's `experiments` + attribute is a list of Experiment objects. The `out_dir` attribute of + these objects can be used to find the results of the experiment. """ # Initialize globals @@ -81,50 +83,50 @@ class Executor(): self._cgroup = None # Setup test configuration - if isinstance(tests_conf, dict): + if isinstance(experiments_conf, dict): logging.info('%14s - Loading custom (inline) test configuration', 'Target') - self._tests_conf = tests_conf - elif isinstance(tests_conf, str): + self._experiments_conf = experiments_conf + elif isinstance(experiments_conf, str): logging.info('%14s - Loading custom (file) test configuration', 'Target') - json_conf = JsonConf(tests_conf) - self._tests_conf = json_conf.load() + json_conf = JsonConf(experiments_conf) + self._experiments_conf = json_conf.load() else: - raise ValueError('test_conf must be either a dictionary or a filepath') + raise ValueError( + 'experiments_conf must be either a dictionary or a filepath') # Check for mandatory configurations - if 'confs' not in self._tests_conf or not self._tests_conf['confs']: + if not self._experiments_conf.get('confs', None): raise ValueError( 'Configuration error: missing \'conf\' definitions') - if 'wloads' not in self._tests_conf or not self._tests_conf['wloads']: + if not self._experiments_conf.get('wloads', None): raise ValueError( 'Configuration error: missing \'wloads\' definitions') - # Setup devlib to access the configured target - self.te = TestEnv(target_conf, tests_conf) + self.te = test_env self.target = self.te.target - self._iterations = self._tests_conf.get('iterations', 1) + self._iterations = self._experiments_conf.get('iterations', 1) # Compute total number of experiments self._exp_count = self._iterations \ - * len(self._tests_conf['wloads']) \ - * len(self._tests_conf['confs']) + * len(self._experiments_conf['wloads']) \ + * len(self._experiments_conf['confs']) self._print_section('Executor', 'Experiments configuration') logging.info('%14s - Configured to run:', 'Executor') logging.info('%14s - %3d target configurations:', - 'Executor', len(self._tests_conf['confs'])) - target_confs = [conf['tag'] for conf in self._tests_conf['confs']] + 'Executor', len(self._experiments_conf['confs'])) + target_confs = [conf['tag'] for conf in self._experiments_conf['confs']] target_confs = ', '.join(target_confs) logging.info('%14s - %s', 'Executor', target_confs) logging.info('%14s - %3d workloads (%d iterations each)', - 'Executor', len(self._tests_conf['wloads']), + 'Executor', len(self._experiments_conf['wloads']), self._iterations) - wload_confs = ', '.join(self._tests_conf['wloads']) + wload_confs = ', '.join(self._experiments_conf['wloads']) logging.info('%14s - %s', 'Executor', wload_confs) logging.info('%14s - Total: %d experiments', @@ -140,11 +142,11 @@ class Executor(): # Run all the configured experiments exp_idx = 0 - for tc in self._tests_conf['confs']: + for tc in self._experiments_conf['confs']: # TARGET: configuration if not self._target_configure(tc): continue - for wl_idx in self._tests_conf['wloads']: + for wl_idx in self._experiments_conf['wloads']: # TEST: configuration wload, test_dir = self._wload_init(tc, wl_idx) for itr_idx in range(1, self._iterations + 1): @@ -502,7 +504,7 @@ class Executor(): tc_idx = tc['tag'] # Configure the test workload - wlspec = self._tests_conf['wloads'][wl_idx] + wlspec = self._experiments_conf['wloads'][wl_idx] wload = self._wload_conf(wl_idx, wlspec) # Keep track of platform configuration diff --git a/libs/utils/test.py b/libs/utils/test.py index 3edbed6db5a89f0ccd8a0878a0e221d39205201b..6e037a3e390b33007f13abbc8e8a09103788b02d 100644 --- a/libs/utils/test.py +++ b/libs/utils/test.py @@ -24,15 +24,37 @@ from bart.sched.SchedMultiAssert import SchedMultiAssert from devlib.utils.misc import memoized import wrapt +from env import TestEnv from executor import Executor class LisaTest(unittest.TestCase): - """A base class for LISA defined tests""" + """ + A base class for LISA tests + + This class is intended to be subclassed in order to create automated tests + for LISA. It sets up the TestEnv and Executor and provides convenience + methods for making assertions on results. + + Subclasses should provide a test_conf to configure the TestEnv and an + experiments_conf to configure the executor. + + Tests whose behaviour is dependent on target parameters, for example + presence of cpufreq governors or number of CPUs, can override + _getExperimentsConf to generate target-dependent experiments. + + Example users of this class can be found under LISA's tests/ directory. + """ + + test_conf = None + """Override this with a dictionary or JSON path to configure the TestEnv""" + + experiments_conf = None + """Override this with a dictionary to configure the Executor""" @classmethod - def _init(cls, conf, *args, **kwargs): + def _init(cls, *args, **kwargs): """ - Base class to run LISA test experiments + Set up logging and trigger running experiments """ cls.logger = logging.getLogger('test') @@ -41,10 +63,28 @@ class LisaTest(unittest.TestCase): cls.logger.setLevel(kwargs['loglevel']) kwargs.pop('loglevel') - cls.conf = conf - cls._runExperiments() + @classmethod + def _getTestConf(cls): + if cls.test_conf is None: + raise NotImplementedError("Override `test_conf` attribute") + return cls.test_conf + + @classmethod + def _getExperimentsConf(cls, test_env): + """ + Get the experiments_conf used to configure the Executor + + This method receives the initialized TestEnv as a parameter, so + subclasses can override it to configure workloads or target confs in a + manner dependent on the target. If not overridden, just returns the + experiments_conf attribute. + """ + if cls.experiments_conf is None: + raise NotImplementedError("Override `experiments_conf` attribute") + return cls.experiments_conf + @classmethod def _runExperiments(cls): """ @@ -52,7 +92,10 @@ class LisaTest(unittest.TestCase): """ cls.logger.info("%14s - Setup tests execution engine...", "LisaTest") - cls.executor = Executor(tests_conf = cls.conf); + test_env = TestEnv(test_conf=cls._getTestConf()) + + experiments_conf = cls._getExperimentsConf(test_env) + cls.executor = Executor(test_env, experiments_conf) # Alias executor objects to make less verbose tests code cls.te = cls.executor.te diff --git a/tests/eas/acceptance.config b/tests/eas/acceptance.config deleted file mode 100644 index bdc127ac5bbffd295b85eea8afaaa5d6946524a9..0000000000000000000000000000000000000000 --- a/tests/eas/acceptance.config +++ /dev/null @@ -1,29 +0,0 @@ -{ - "WORKLOAD_DURATION_S" : 5, - "WORKLOAD_PERIOD_MS" : 10, - "SWITCH_WINDOW_HALF" : 0.5, - "ENABLE_EAS" : true, - "SMALL_DCYCLE" : 10, - "BIG_DCYCLE": 100, - "STEP_LOW_DCYCLE" : 10, - "STEP_HIGH_DCYCLE" : 50, - "EXPECTED_RESIDENCY_PCT" : 85, - "OFFLOAD_MIGRATION_MIGRATOR_DELAY": 1, - "OFFLOAD_EXPECTED_BUSY_TIME_PCT": 97, - "SET_IS_BIG_LITTLE": true, - "SET_INITIAL_TASK_UTIL": true, - "TEST_CONF" : { - "modules" : [ "bl", "cpufreq" ], - "tools" : [ "rt-app" ], - "ftrace" : { - "events" : [ - "sched_energy_diff", - "sched_load_avg_task", - "sched_load_avg_cpu", - "sched_migrate_task", - "sched_switch" - ], - "buffsize" : 10240 - } - } -} diff --git a/tests/eas/acceptance.py b/tests/eas/acceptance.py index c0fb5e7e28d1af90f7ab6b8e8db4619780873eea..218bbf2190c100f260857dafc0af71a3f2165b51 100644 --- a/tests/eas/acceptance.py +++ b/tests/eas/acceptance.py @@ -28,27 +28,47 @@ from devlib.target import TargetError from env import TestEnv from test import LisaTest, experiment_test -# Read the config file and update the globals -CONF_FILE = os.path.join( - os.path.dirname( - os.path.abspath(__file__)), - "acceptance.config") - -with open(CONF_FILE, "r") as fh: - conf_vars = json.load(fh) - globals().update(conf_vars) +# Global test configuration parameters +WORKLOAD_DURATION_S = 5 +WORKLOAD_PERIOD_MS = 10 +SWITCH_WINDOW_HALF = 0.5 +SMALL_DCYCLE = 10 +BIG_DCYCLE = 100 +STEP_HIGH_DCYCLE = 50 +STEP_LOW_DCYCLE = 10 +EXPECTED_RESIDENCY_PCT = 85 +OFFLOAD_EXPECTED_BUSY_TIME_PCT = 97 +SET_IS_BIG_LITTLE = True +SET_INITIAL_TASK_UTIL = True +OFFLOAD_MIGRATION_MIGRATOR_DELAY = 1 + +energy_aware_conf = { + "tag" : "energy_aware", + "flags" : "ftrace", + "sched_features" : "ENERGY_AWARE", +} class EasTest(LisaTest): """ Base class for EAS tests """ + test_conf = { + "ftrace" : { + "events" : [ + "sched_overutilized", + "sched_energy_diff", + "sched_load_avg_task", + "sched_load_avg_cpu", + "sched_migrate_task", + "sched_switch" + ], + }, + } + @classmethod def setUpClass(cls, *args, **kwargs): - conf_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), - cls.conf_basename) - - super(EasTest, cls)._init(conf_file, *args, **kwargs) + super(EasTest, cls)._init(*args, **kwargs) @classmethod def _experimentsInit(cls, *args, **kwargs): @@ -96,7 +116,31 @@ class ForkMigration(EasTest): The threads start on a big core. """ - conf_basename = "acceptance_fork_migration.config" + experiments_conf = { + "wloads" : { + # Create N 100% tasks and M 10% tasks which run in parallel, where N + # is the number of big CPUs and M is the number of LITTLE CPUs. + "fmig" : { + "type" : "rt-app", + "conf" : { + "class" : "profile", + "params" : { + "small" : { + "kind" : "Periodic", + "params" : { + "duty_cycle_pct": 10, + "duration_s": WORKLOAD_DURATION_S, + "period_ms": WORKLOAD_PERIOD_MS, + }, + "prefix" : "small", + "tasks" : "big", + }, + }, + }, + }, + }, + "confs" : [energy_aware_conf] + } @experiment_test def test_first_cpu(self, experiment, tasks): @@ -123,7 +167,24 @@ class SmallTaskPacking(EasTest): All tasks run on little cpus. """ - conf_basename = "acceptance_small_task_packing.config" + experiments_conf = { + "wloads" : { + "small_tasks" : { + "type" : "rt-app", + "conf" : { + "class" : "periodic", + "params" : { + "duty_cycle_pct": 10, + "duration_s": WORKLOAD_DURATION_S, + "period_ms": WORKLOAD_PERIOD_MS, + }, + # Create one task for each CPU + "tasks" : "cpus", + }, + }, + }, + "confs" : [energy_aware_conf] + } @experiment_test def test_first_cpu(self, experiment, tasks): @@ -196,7 +257,40 @@ class OffloadMigrationAndIdlePull(EasTest): """ - conf_basename = "acceptance_offload_idle_pull.config" + experiments_conf = { + "wloads" : { + "early_and_migrators" : { + "type" : "rt-app", + "conf" : { + "class" : "profile", + "params" : { + "early" : { + "kind" : "Periodic", + "params" : { + "duty_cycle_pct": 100, + "duration_s": WORKLOAD_DURATION_S, + "period_ms": WORKLOAD_PERIOD_MS, + }, + # Create one task for each big CPU + "tasks" : "big", + }, + "migrator" : { + "kind" : "Periodic", + "params" : { + "duty_cycle_pct": 100, + "duration_s": WORKLOAD_DURATION_S, + "period_ms": WORKLOAD_PERIOD_MS, + "delay_s": OFFLOAD_MIGRATION_MIGRATOR_DELAY, + }, + # Create one task for each big CPU + "tasks" : "big", + }, + }, + }, + }, + }, + "confs" : [energy_aware_conf] + } @experiment_test def test_first_cpu(self, experiment, tasks): @@ -325,7 +419,30 @@ class WakeMigration(EasTest): the big cpus when they are big. """ - conf_basename = "acceptance_wake_migration.config" + experiments_conf = { + "wloads" : { + "wake_migration" : { + "type" : "rt-app", + "conf" : { + "class" : "profile", + "params" : { + "wmig" : { + "kind" : "Step", + "params" : { + "start_pct": STEP_LOW_DCYCLE, + "end_pct": STEP_HIGH_DCYCLE, + "time_s": WORKLOAD_DURATION_S, + "loops": 2 + }, + # Create one task for each big cpu + "tasks" : "big", + }, + }, + }, + }, + }, + "confs" : [energy_aware_conf] + } @experiment_test def test_first_cpu(self, experiment, tasks): diff --git a/tests/eas/acceptance_fork_migration.config b/tests/eas/acceptance_fork_migration.config deleted file mode 100644 index 02d75ec708108d328738395b6724b96f751d1b54..0000000000000000000000000000000000000000 --- a/tests/eas/acceptance_fork_migration.config +++ /dev/null @@ -1,55 +0,0 @@ -{ - "modules" : [ "bl" ], - "exclude_modules" : [ "hwmon" ], - "tools" : [ "rt-app" ], - "ftrace" : { - "events" : [ - "sched_overutilized", - "sched_energy_diff", - "sched_load_avg_task", - "sched_load_avg_cpu", - "sched_migrate_task", - "sched_switch" - ], - }, - "wloads" : { - // Create N 100% tasks and M 10% tasks which run in parallel, where N is - // the number of big CPUs and M is the number of LITTLE CPUs. - "fmig" : { - "type" : "rt-app", - "conf" : { - "class" : "profile", - "params" : { - "small" : { - "kind" : "Periodic", - "params" : { - "duty_cycle_pct": 10, - "duration_s": 5, - "period_ms": 10, - }, - "prefix" : "small" - }, - "big" : { - "kind" : "Periodic", - "params" : { - "duty_cycle_pct": 100, - "duration_s" : 5, - "period_ms": 10 - }, - "prefix" : "large", - }, - }, - }, - }, - }, - "confs" : [ - { - "tag" : "", - "flags" : "ftrace", - "sched_features" : "ENERGY_AWARE", - "cpufreq" : { - "governor" : "performance" - } - } - ] -} diff --git a/tests/eas/acceptance_offload_idle_pull.config b/tests/eas/acceptance_offload_idle_pull.config deleted file mode 100644 index f53d76c2b0ce3f3451762b6c972c3d0eb4c63a0e..0000000000000000000000000000000000000000 --- a/tests/eas/acceptance_offload_idle_pull.config +++ /dev/null @@ -1,56 +0,0 @@ -{ - "modules" : [ "bl" ], - "exclude_modules" : [ "hwmon" ], - "tools" : [ "rt-app" ], - "ftrace" : { - "events" : [ - "sched_overutilized", - "sched_energy_diff", - "sched_load_avg_task", - "sched_load_avg_cpu", - "sched_migrate_task", - "sched_switch" - ], - }, - "wloads" : { - "early_and_migrators" : { - "type" : "rt-app", - "conf" : { - "class" : "profile", - "params" : { - "early" : { - "kind" : "Periodic", - "params" : { - "duty_cycle_pct": 100, - "duration_s": 5, - "period_ms": 10, - }, - // Create one task for each big CPU - "tasks" : "big", - }, - "migrator" : { - "kind" : "Periodic", - "params" : { - "duty_cycle_pct": 100, - "duration_s": 5, - "period_ms": 10, - "delay_s": 1 - }, - // Create one task for each big CPU - "tasks" : "big", - }, - }, - }, - }, - }, - "confs" : [ - { - "tag" : "", - "flags" : "ftrace", - "sched_features" : "ENERGY_AWARE", - "cpufreq" : { - "governor" : "performance" - } - } - ] -} diff --git a/tests/eas/acceptance_small_task_packing.config b/tests/eas/acceptance_small_task_packing.config deleted file mode 100644 index 251799433ad6a457d7780e75a303b0e3630a2159..0000000000000000000000000000000000000000 --- a/tests/eas/acceptance_small_task_packing.config +++ /dev/null @@ -1,42 +0,0 @@ -{ - "modules" : [ "bl" ], - "exclude_modules" : [ "hwmon" ], - "tools" : [ "rt-app" ], - "ftrace" : { - "events" : [ - "sched_overutilized", - "sched_energy_diff", - "sched_load_avg_task", - "sched_load_avg_cpu", - "sched_migrate_task", - "sched_switch" - ], - }, - "wloads" : { - // Create one small task for each CPU - "small_tasks" : { - "type" : "rt-app", - "conf" : { - "class" : "periodic", - "params" : { - "duty_cycle_pct": 10, - "duration_s": 5, - "period_ms": 10, - }, - // Create one task for each CPU - "tasks" : "cpus", - "prefix" : "stp" - }, - }, - }, - "confs" : [ - { - "tag" : "", - "flags" : "ftrace", - "sched_features" : "ENERGY_AWARE", - "cpufreq" : { - "governor" : "performance" - } - } - ] -} diff --git a/tests/eas/acceptance_wake_migration.config b/tests/eas/acceptance_wake_migration.config deleted file mode 100644 index 963f101fb88fff985109ede272100c4ea1106f00..0000000000000000000000000000000000000000 --- a/tests/eas/acceptance_wake_migration.config +++ /dev/null @@ -1,48 +0,0 @@ -{ - "modules" : [ "bl" ], - "exclude_modules" : [ "hwmon" ], - "tools" : [ "rt-app" ], - "ftrace" : { - "events" : [ - "sched_overutilized", - "sched_energy_diff", - "sched_load_avg_task", - "sched_load_avg_cpu", - "sched_migrate_task", - "sched_switch", - "cpu_frequency", - ], - }, - "wloads" : { - // Create one small task for each CPU - "wake_migration" : { - "type" : "rt-app", - "conf" : { - "class" : "profile", - "params" : { - "wmig" : { - "kind" : "Step", - "params" : { - "start_pct": 10, // STEP_LOW_DCYCLE - "end_pct": 50, // STEP_HIGH_DCYCLE - "time_s": 5, // WORKLOAD_DURATION_S - "loops": 2 - }, - // Create one task for each CPU - "tasks" : "big", - }, - }, - }, - }, - }, - "confs" : [ - { - "tag" : "", - "flags" : "ftrace", - "sched_features" : "ENERGY_AWARE", - "cpufreq" : { - "governor" : "performance" - } - } - ] -}