1 { 2 "cells": [ 3 { 4 "cell_type": "markdown", 5 "metadata": {}, 6 "source": [ 7 "# Thermal Sensor Measurements" 8 ] 9 }, 10 { 11 "cell_type": "markdown", 12 "metadata": {}, 13 "source": [ 14 "The goal of this experiment is to measure temperature on Juno R2 board using the available sensors. In order to do that we will run a busy-loop workload of about 5 minutes and collect traces for the `thermal_temperature` event.\n", 15 "\n", 16 "Measurements must be done **with** and **without** fan." 17 ] 18 }, 19 { 20 "cell_type": "code", 21 "execution_count": null, 22 "metadata": { 23 "collapsed": false 24 }, 25 "outputs": [], 26 "source": [ 27 "import logging\n", 28 "from conf import LisaLogging\n", 29 "LisaLogging.setup()" 30 ] 31 }, 32 { 33 "cell_type": "code", 34 "execution_count": null, 35 "metadata": { 36 "collapsed": false 37 }, 38 "outputs": [], 39 "source": [ 40 "%pylab inline\n", 41 "\n", 42 "import os\n", 43 "\n", 44 "# Support to access the remote target\n", 45 "import devlib\n", 46 "from env import TestEnv\n", 47 "\n", 48 "# Support to configure and run RTApp based workloads\n", 49 "from wlgen import RTA, Periodic\n", 50 "\n", 51 "# Support for trace events analysis\n", 52 "from trace import Trace\n", 53 "\n", 54 "# Suport for FTrace events parsing and visualization\n", 55 "import trappy" 56 ] 57 }, 58 { 59 "cell_type": "markdown", 60 "metadata": {}, 61 "source": [ 62 "# Target Configuration" 63 ] 64 }, 65 { 66 "cell_type": "markdown", 67 "metadata": {}, 68 "source": [ 69 "Our target is a Juno R2 development board running Linux." 70 ] 71 }, 72 { 73 "cell_type": "code", 74 "execution_count": null, 75 "metadata": { 76 "collapsed": false 77 }, 78 "outputs": [], 79 "source": [ 80 "# Setup a target configuration\n", 81 "my_target_conf = {\n", 82 " \n", 83 " # Target platform and board\n", 84 " \"platform\" : 'linux',\n", 85 " \"board\" : 'juno',\n", 86 " \n", 87 " # Target board IP/MAC address\n", 88 " \"host\" : '192.168.0.1',\n", 89 " \n", 90 " # Login credentials\n", 91 " \"username\" : 'root',\n", 92 " \"password\" : '',\n", 93 " \n", 94 " # RTApp calibration values (comment to let LISA do a calibration run)\n", 95 " \"rtapp-calib\" : {\n", 96 " \"0\": 318, \"1\": 125, \"2\": 124, \"3\": 318, \"4\": 318, \"5\": 319\n", 97 " },\n", 98 " \n", 99 " # Tools required by the experiments\n", 100 " \"tools\" : [ 'rt-app', 'trace-cmd' ], \n", 101 " \"exclude_modules\" : ['hwmon'],\n", 102 " \n", 103 " # FTrace events to collect for all the tests configuration which have\n", 104 " # the \"ftrace\" flag enabled\n", 105 " \"ftrace\" : {\n", 106 " \"events\" : [\n", 107 " \"thermal_temperature\",\n", 108 " # Use sched_switch event to recognize tasks on kernelshark\n", 109 " \"sched_switch\",\n", 110 " # cdev_update has been used to show that \"step_wise\" thermal governor introduces noise\n", 111 " # because it keeps changing the state of the cooling devices and therefore\n", 112 " # the available OPPs\n", 113 " #\"cdev_update\",\n", 114 " ],\n", 115 " \"buffsize\" : 80 * 1024,\n", 116 " },\n", 117 "}" 118 ] 119 }, 120 { 121 "cell_type": "markdown", 122 "metadata": {}, 123 "source": [ 124 "# Tests execution" 125 ] 126 }, 127 { 128 "cell_type": "code", 129 "execution_count": null, 130 "metadata": { 131 "collapsed": false, 132 "scrolled": true 133 }, 134 "outputs": [], 135 "source": [ 136 "# Initialize a test environment using:\n", 137 "# the provided target configuration (my_target_conf)\n", 138 "te = TestEnv(target_conf=my_target_conf)\n", 139 "target = te.target" 140 ] 141 }, 142 { 143 "cell_type": "markdown", 144 "metadata": {}, 145 "source": [ 146 "# Workloads configuration" 147 ] 148 }, 149 { 150 "cell_type": "code", 151 "execution_count": null, 152 "metadata": { 153 "collapsed": false, 154 "scrolled": true 155 }, 156 "outputs": [], 157 "source": [ 158 "# Create a new RTApp workload generator using the calibration values\n", 159 "# reported by the TestEnv module\n", 160 "rtapp_big = RTA(target, 'big', calibration=te.calibration())\n", 161 "\n", 162 "big_tasks = dict()\n", 163 "for cpu in target.bl.bigs:\n", 164 " big_tasks['busy_big'+str(cpu)] = Periodic(duty_cycle_pct=100,\n", 165 " duration_s=360, # 6 minutes\n", 166 " cpus=str(cpu) # pinned to a given cpu\n", 167 " ).get()\n", 168 "\n", 169 "# Configure this RTApp instance to:\n", 170 "rtapp_big.conf(\n", 171 " # 1. generate a \"profile based\" set of tasks\n", 172 " kind='profile',\n", 173 " \n", 174 " # 2. define the \"profile\" of each task\n", 175 " params=big_tasks,\n", 176 " \n", 177 " # 3. Set load reference for task calibration\n", 178 " loadref='big',\n", 179 " \n", 180 " # 4. use this folder for task logfiles\n", 181 " run_dir=target.working_directory\n", 182 ");" 183 ] 184 }, 185 { 186 "cell_type": "code", 187 "execution_count": null, 188 "metadata": { 189 "collapsed": false, 190 "scrolled": true 191 }, 192 "outputs": [], 193 "source": [ 194 "rtapp_little = RTA(target, 'little', calibration=te.calibration())\n", 195 "\n", 196 "little_tasks = dict()\n", 197 "for cpu in target.bl.littles:\n", 198 " little_tasks['busy_little'+str(cpu)] = Periodic(duty_cycle_pct=100,\n", 199 " duration_s=360,\n", 200 " cpus=str(cpu)).get()\n", 201 "\n", 202 "rtapp_little.conf(\n", 203 " kind='profile',\n", 204 " params=little_tasks,\n", 205 " # Allow the task duration to be calibrated for the littles (default is for big)\n", 206 " loadref='little',\n", 207 " run_dir=target.working_directory\n", 208 ");" 209 ] 210 }, 211 { 212 "cell_type": "markdown", 213 "metadata": {}, 214 "source": [ 215 "# Workload execution" 216 ] 217 }, 218 { 219 "cell_type": "code", 220 "execution_count": null, 221 "metadata": { 222 "collapsed": false, 223 "scrolled": true 224 }, 225 "outputs": [], 226 "source": [ 227 "logging.info('#### Setup FTrace')\n", 228 "te.ftrace.start()\n", 229 "\n", 230 "logging.info('#### Start RTApp execution')\n", 231 "# Run tasks on the bigs in background to allow execution of following instruction\n", 232 "rtapp_big.run(out_dir=te.res_dir, background=True)\n", 233 "# Run tasks on the littles and then wait 2 minutes for device to cool down\n", 234 "rtapp_little.run(out_dir=te.res_dir, end_pause_s=120.0)\n", 235 "\n", 236 "logging.info('#### Stop FTrace')\n", 237 "te.ftrace.stop()" 238 ] 239 }, 240 { 241 "cell_type": "markdown", 242 "metadata": { 243 "collapsed": false 244 }, 245 "source": [ 246 "# Trace Analysis" 247 ] 248 }, 249 { 250 "cell_type": "markdown", 251 "metadata": { 252 "collapsed": false 253 }, 254 "source": [ 255 "In order to analyze the trace we will plot it using `TRAPpy`." 256 ] 257 }, 258 { 259 "cell_type": "code", 260 "execution_count": null, 261 "metadata": { 262 "collapsed": false 263 }, 264 "outputs": [], 265 "source": [ 266 "# Collect the trace\n", 267 "trace_file = os.path.join(te.res_dir, 'trace.dat')\n", 268 "logging.info('#### Save FTrace: %s', trace_file)\n", 269 "te.ftrace.get_trace(trace_file)\n", 270 "# Parse trace\n", 271 "therm_trace = trappy.FTrace(trace_file)" 272 ] 273 }, 274 { 275 "cell_type": "code", 276 "execution_count": null, 277 "metadata": { 278 "collapsed": false 279 }, 280 "outputs": [], 281 "source": [ 282 "therm_trace.thermal.data_frame.tail(10)" 283 ] 284 }, 285 { 286 "cell_type": "code", 287 "execution_count": null, 288 "metadata": { 289 "collapsed": false 290 }, 291 "outputs": [], 292 "source": [ 293 "# Plot the data\n", 294 "therm_plot = trappy.ILinePlot(therm_trace,\n", 295 " signals=['thermal:temp'],\n", 296 " filters={'thermal_zone': [\"soc\"]},\n", 297 " title='Juno R2 SoC Temperature w/o fans')\n", 298 "therm_plot.view()" 299 ] 300 }, 301 { 302 "cell_type": "markdown", 303 "metadata": { 304 "collapsed": false 305 }, 306 "source": [ 307 "The `pmic` sensor if off-chip and therefore it is not useful to get its temperature." 308 ] 309 }, 310 { 311 "cell_type": "code", 312 "execution_count": null, 313 "metadata": { 314 "collapsed": true 315 }, 316 "outputs": [], 317 "source": [ 318 "# Extract a data frame for each zone\n", 319 "df = therm_trace.thermal.data_frame\n", 320 "soc_df = df[df.thermal_zone == \"soc\"]\n", 321 "big_df = df[df.thermal_zone == \"big_cluster\"]\n", 322 "little_df = df[df.thermal_zone == \"little_cluster\"]\n", 323 "gpu0_df = df[df.thermal_zone == \"gpu0\"]\n", 324 "gpu1_df = df[df.thermal_zone == \"gpu1\"]\n", 325 "# Build new trace\n", 326 "juno_trace = trappy.BareTrace(name = \"Juno_R2\")\n", 327 "juno_trace.add_parsed_event(\"SoC\", soc_df)\n", 328 "juno_trace.add_parsed_event(\"big_Cluster\", big_df)\n", 329 "juno_trace.add_parsed_event(\"LITTLE_Cluster\", little_df)\n", 330 "juno_trace.add_parsed_event(\"gpu0\", gpu0_df)\n", 331 "juno_trace.add_parsed_event(\"gpu1\", gpu1_df)" 332 ] 333 }, 334 { 335 "cell_type": "code", 336 "execution_count": null, 337 "metadata": { 338 "collapsed": false 339 }, 340 "outputs": [], 341 "source": [ 342 "# Plot the data for all sensors\n", 343 "juno_signals = ['SoC:temp', 'big_Cluster:temp', 'LITTLE_Cluster:temp', 'gpu0:temp', 'gpu1:temp']\n", 344 "therm_plot = trappy.ILinePlot([juno_trace],\n", 345 " signals=juno_signals,\n", 346 " title='Juno R2 Temperature all traces')\n", 347 "therm_plot.view()" 348 ] 349 } 350 ], 351 "metadata": { 352 "kernelspec": { 353 "display_name": "Python 2", 354 "language": "python", 355 "name": "python2" 356 }, 357 "language_info": { 358 "codemirror_mode": { 359 "name": "ipython", 360 "version": 2 361 }, 362 "file_extension": ".py", 363 "mimetype": "text/x-python", 364 "name": "python", 365 "nbconvert_exporter": "python", 366 "pygments_lexer": "ipython2", 367 "version": "2.7.6" 368 } 369 }, 370 "nbformat": 4, 371 "nbformat_minor": 0 372 } 373