summaryrefslogtreecommitdiff
path: root/util/dram_sweep_plot.py
diff options
context:
space:
mode:
authorRadhika Jagtap <radhika.jagtap@arm.com>2017-06-21 11:17:43 +0100
committerAndreas Sandberg <andreas.sandberg@arm.com>2017-11-16 16:39:19 +0000
commit9b4e797cdd7e10ace8de83626ea844a6acabcafb (patch)
tree88547cd0654d49f48bf1f648608961fc964e2302 /util/dram_sweep_plot.py
parent1695c9933b53a606ba7044e1b2dfcfe8c203018e (diff)
downloadgem5-9b4e797cdd7e10ace8de83626ea844a6acabcafb.tar.xz
util: Add script to plot DRAM low power sweep
This change adds a script to generate graphs from the stats file output by the configuration script low_power_sweep.py. The graphs show stacked bars for time spent and energy consumed wherein each component of the stacked bar represents a DRAM power state (Idle, Refresh, Active, Active Power-down, Precharge Power-down and Self-refresh). The script generates one plot per delay value. It also generates a pdf (--pdf option) in which the graphs are laid out such that you can easily compare how the increasing delay and other swept params affect the resulting energy. Change-Id: Id80b0947bfde27e11e5505b23a3adb30f793a43f Reviewed-by: Wendy Elsasser <wendy.elsasser@arm.com> Reviewed-on: https://gem5-review.googlesource.com/5727 Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Diffstat (limited to 'util/dram_sweep_plot.py')
-rwxr-xr-xutil/dram_sweep_plot.py193
1 files changed, 0 insertions, 193 deletions
diff --git a/util/dram_sweep_plot.py b/util/dram_sweep_plot.py
deleted file mode 100755
index 5eb18b95a..000000000
--- a/util/dram_sweep_plot.py
+++ /dev/null
@@ -1,193 +0,0 @@
-#!/usr/bin/env python2
-
-# Copyright (c) 2014 ARM Limited
-# All rights reserved
-#
-# The license below extends only to copyright in the software and shall
-# not be construed as granting a license to any other intellectual
-# property including but not limited to intellectual property relating
-# to a hardware implementation of the functionality of the software
-# licensed hereunder. You may use the software subject to the license
-# terms below provided that you ensure that this notice is replicated
-# unmodified and in its entirety in all distributions of the software,
-# modified or unmodified, in source code or in binary form.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met: redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer;
-# redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution;
-# neither the name of the copyright holders nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# Authors: Andreas Hansson
-
-try:
- from mpl_toolkits.mplot3d import Axes3D
- from matplotlib import cm
- import matplotlib.pyplot as plt
- import numpy as np
-except ImportError:
- print "Failed to import matplotlib and numpy"
- exit(-1)
-
-import sys
-import re
-
-# Determine the parameters of the sweep from the simout output, and
-# then parse the stats and plot the 3D surface corresponding to the
-# different combinations of parallel banks, and stride size, as
-# generated by the config/dram/sweep.py script
-def main():
-
- if len(sys.argv) != 3:
- print "Usage: ", sys.argv[0], "-u|p|e <simout directory>"
- exit(-1)
-
- if len(sys.argv[1]) != 2 or sys.argv[1][0] != '-' or \
- not sys.argv[1][1] in "upe":
- print "Choose -u (utilisation), -p (total power), or -e " \
- "(power efficiency)"
- exit(-1)
-
- # Choose the appropriate mode, either utilisation, total power, or
- # efficiency
- mode = sys.argv[1][1]
-
- try:
- stats = open(sys.argv[2] + '/stats.txt', 'r')
- except IOError:
- print "Failed to open ", sys.argv[2] + '/stats.txt', " for reading"
- exit(-1)
-
- try:
- simout = open(sys.argv[2] + '/simout', 'r')
- except IOError:
- print "Failed to open ", sys.argv[2] + '/simout', " for reading"
- exit(-1)
-
- # Get the burst size, number of banks and the maximum stride from
- # the simulation output
- got_sweep = False
-
- for line in simout:
- match = re.match("DRAM sweep with "
- "burst: (\d+), banks: (\d+), max stride: (\d+)", line)
- if match:
- burst_size = int(match.groups(0)[0])
- banks = int(match.groups(0)[1])
- max_size = int(match.groups(0)[2])
- got_sweep = True
-
- simout.close()
-
- if not got_sweep:
- print "Failed to establish sweep details, ensure simout is up-to-date"
- exit(-1)
-
- # Now parse the stats
- peak_bw = []
- bus_util = []
- avg_pwr = []
-
- for line in stats:
- match = re.match(".*busUtil\s+(\d+\.\d+)\s+#.*", line)
- if match:
- bus_util.append(float(match.groups(0)[0]))
-
- match = re.match(".*peakBW\s+(\d+\.\d+)\s+#.*", line)
- if match:
- peak_bw.append(float(match.groups(0)[0]))
-
- match = re.match(".*averagePower\s+(\d+\.?\d*)\s+#.*", line)
- if match:
- avg_pwr.append(float(match.groups(0)[0]))
- stats.close()
-
-
- # Sanity check
- if not (len(peak_bw) == len(bus_util) and len(bus_util) == len(avg_pwr)):
- print "Peak bandwidth, bus utilisation, and average power do not match"
- exit(-1)
-
- # Collect the selected metric as our Z-axis, we do this in a 2D
- # grid corresponding to each iteration over the various stride
- # sizes.
- z = []
- zs = []
- i = 0
-
- for j in range(len(peak_bw)):
- if mode == 'u':
- z.append(bus_util[j])
- elif mode == 'p':
- z.append(avg_pwr[j])
- elif mode == 'e':
- # avg_pwr is in mW, peak_bw in MiByte/s, bus_util in percent
- z.append(avg_pwr[j] / (bus_util[j] / 100.0 * peak_bw[j] / 1000.0))
- else:
- print "Unexpected mode %s" % mode
- exit(-1)
-
- i += 1
- # If we have completed a sweep over the stride sizes,
- # start anew
- if i == max_size / burst_size:
- zs.append(z)
- z = []
- i = 0
-
- # We should have a 2D grid with as many columns as banks
- if len(zs) != banks:
- print "Unexpected number of data points in stats output"
- exit(-1)
-
- fig = plt.figure()
- ax = fig.gca(projection='3d')
- X = np.arange(burst_size, max_size + 1, burst_size)
- Y = np.arange(1, banks + 1, 1)
- X, Y = np.meshgrid(X, Y)
-
- # the values in the util are banks major, so we see groups for each
- # stride size in order
- Z = np.array(zs)
-
- surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm,
- linewidth=0, antialiased=False)
-
- # Change the tick frequency to 64
- start, end = ax.get_xlim()
- ax.xaxis.set_ticks(np.arange(start, end + 1, 64))
-
- ax.set_xlabel('Bytes per activate')
- ax.set_ylabel('Banks')
-
- if mode == 'u':
- ax.set_zlabel('Utilisation (%)')
- elif mode == 'p':
- ax.set_zlabel('Power (mW)')
- elif mode == 'e':
- ax.set_zlabel('Power efficiency (mW / GByte / s)')
-
- # Add a colorbar
- fig.colorbar(surf, shrink=0.5, pad=.1, aspect=10)
-
- plt.show()
-
-if __name__ == "__main__":
- main()