blob: bf51929c21b36a0f09a023147e133716e43d0628 [file] [log] [blame]
{
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
},
"name": "",
"signature": "sha256:59ef0b9fe2847e77f9df55deeb6df1f94f4fe2a3a0f99e13cba99854e8bf66ed"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Configuration"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import trappy\n",
"import numpy\n",
"\n",
"config = {}\n",
"\n",
"# TRAPpy Events\n",
"config[\"THERMAL\"] = trappy.thermal.Thermal\n",
"config[\"OUT\"] = trappy.cpu_power.CpuOutPower\n",
"config[\"IN\"] = trappy.cpu_power.CpuInPower\n",
"config[\"PID\"] = trappy.pid_controller.PIDController\n",
"config[\"GOVERNOR\"] = trappy.thermal.ThermalGovernor\n",
"\n",
"# Control Temperature\n",
"config[\"CONTROL_TEMP\"] = 77000\n",
"\n",
"# A temperature margin of 2.5 degrees Celsius\n",
"config[\"TEMP_MARGIN\"] = 2500\n",
"\n",
"# The Sustainable power at the control Temperature\n",
"config[\"SUSTAINABLE_POWER\"] = 2500\n",
"\n",
"# Expected percentile of CONTROL_TEMP + TEMP_MARGIN\n",
"config[\"EXPECTED_TEMP_QRT\"] = 95\n",
"\n",
"# Maximum expected Standard Deviation as a percentage\n",
"# of mean temperature\n",
"config[\"EXPECTED_STD_PCT\"] = 5\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Get the Trace"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import urllib\n",
"import os\n",
"\n",
"TRACE_DIR = \"example_trace_dat_thermal\"\n",
"TRACE_FILE = os.path.join(TRACE_DIR, 'bart_thermal_trace.dat')\n",
"TRACE_URL = 'http://cdn.rawgit.com/sinkap/4e0a69cbff732b57e36f/raw/7dd0ed74bfc17a34a3bd5ea6b9eb3a75a42ddbae/bart_thermal_trace.dat'\n",
"\n",
"if not os.path.isdir(TRACE_DIR):\n",
" os.mkdir(TRACE_DIR)\n",
"\n",
"if not os.path.isfile(TRACE_FILE):\n",
" print \"Fetching trace file..\"\n",
" urllib.urlretrieve(TRACE_URL, filename=TRACE_FILE)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"FTrace Object"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Create a Trace object\n",
"\n",
"ftrace = trappy.FTrace(TRACE_FILE, \"SomeBenchMark\")"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Assertions"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Create an Assertion Object\n",
"\n",
"from bart.common.Analyzer import Analyzer\n",
"t = Analyzer(ftrace, config)\n",
"\n",
"BIG = '000000f0'\n",
"LITTLE = '0000000f'"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Assertion: Load and Dynamic Power"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<html>\n",
"This assertion makes sure that the dynamic power for the each cluster is zero when the sum of the \"loads\" of each CPU is 0\n",
"\n",
" $$\\forall\\ t\\ |\\ Load(t) = \\sum\\limits_{i=0}^{cpus} Load_i(t) = 0 \\implies dynamic\\ power(t)=0 $$\n",
" \n",
"</html>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"result = t.getStatement(\"((IN:load0 + IN:load1 + IN:load2 + IN:load3) == 0) \\\n",
" & (IN:dynamic_power > 0)\",reference=True, select=BIG)\n",
"if len(result):\n",
" print \"FAIL: Dynamic Power is NOT Zero when load is Zero for the BIG cluster\"\n",
"else:\n",
" print \"PASS: Dynamic Power is Zero when load is Zero for the BIG cluster\"\n",
"\n",
" \n",
"result = t.getStatement(\"((IN:load0 + IN:load1 + IN:load2 + IN:load3) == 0) \\\n",
" & (IN:dynamic_power > 0)\",reference=True, select=LITTLE)\n",
"if len(result):\n",
" print \"FAIL: Dynamic Power is NOT Zero when load is Zero for the LITTLE cluster\"\n",
"else:\n",
" print \"PASS: Dynamic Power is Zero when load is Zero for the LITTLE cluster\""
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"PASS: Dynamic Power is Zero when load is Zero for the BIG cluster\n",
"PASS: Dynamic Power is Zero when load is Zero for the LITTLE cluster\n"
]
}
],
"prompt_number": 5
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Assertion: Control Temperature and Sustainable Power"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<html>\n",
"\n",
"When the temperature is greater than the control temperature, the total power granted to all cooling devices should be less than sustainable_power\n",
"\n",
"$$\\forall\\ t\\ |\\ Temperature(t) > control\\_temp \\implies Total\\ Granted\\ Power(t) < sustainable\\_power$$\n",
"\n",
"<html/>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"result = t.getStatement(\"(GOVERNOR:current_temperature > CONTROL_TEMP) &\\\n",
" (PID:output > SUSTAINABLE_POWER)\", reference=True, select=0)\n",
"\n",
"if len(result):\n",
" print \"FAIL: The Governor is allocating power > sustainable when T > CONTROL_TEMP\"\n",
"else:\n",
" print \"PASS: The Governor is allocating power <= sustainable when T > CONTROL_TEMP\" "
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"PASS: The Governor is allocating power <= sustainable when T > CONTROL_TEMP\n"
]
}
],
"prompt_number": 6
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Statistics"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Check if 95% of the temperature readings are below CONTROL_TEMP + MARGIN"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"t.assertStatement(\"numpy.percentile(THERMAL:temp, 95) < (CONTROL_TEMP + TEMP_MARGIN)\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"text": [
"True"
]
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Check if the mean temperauture is less than CONTROL_TEMP"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"t.assertStatement(\"numpy.mean(THERMAL:temp) <= CONTROL_TEMP\", select=0)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"text": [
"True"
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can also use getStatement to get the absolute values. Here we are getting the standard deviation expressed as a percentage of the mean"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"t.getStatement(\"(numpy.std(THERMAL:temp) * 100.0) / numpy.mean(THERMAL:temp)\", select=0)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 9,
"text": [
"2.2390646863105119"
]
}
],
"prompt_number": 9
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Thermal Residency"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from bart.thermal.ThermalAssert import ThermalAssert\n",
"\n",
"t_assert = ThermalAssert(ftrace)\n",
"end = ftrace.get_duration()\n",
"\n",
"LOW = 0\n",
"HIGH = 78000\n",
"\n",
"# The thermal residency gives the percentage (or absolute time) spent in the\n",
"# specified temperature range. \n",
"\n",
"result = t_assert.getThermalResidency(temp_range=(0, 78000),\n",
" window=(0, end),\n",
" percent=True)\n",
"\n",
"for tz_id in result:\n",
" print \"Thermal Zone: {} spends {:.2f}% time in the temperature range [{}, {}]\".format(tz_id, \n",
" result[tz_id],\n",
" LOW/1000,\n",
" HIGH/1000)\n",
" pct_temp = numpy.percentile(t.getStatement(\"THERMAL:temp\")[tz_id], result[tz_id])\n",
" \n",
" print \"The {:.2f}th percentile temperature is {:.2f}\".format(result[tz_id], pct_temp / 1000.0)\n",
" "
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Thermal Zone: 0 spends 86.58% time in the temperature range [0, 78]\n",
"The 86.58th percentile temperature is 78.28\n"
]
}
],
"prompt_number": 10
}
],
"metadata": {}
}
]
}