5 # Copyright(c) 2010-2012 Intel Corporation. All rights reserved.
8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions
12 # * Redistributions of source code must retain the above copyright
13 # notice, this list of conditions and the following disclaimer.
14 # * Redistributions in binary form must reproduce the above copyright
15 # notice, this list of conditions and the following disclaimer in
16 # the documentation and/or other materials provided with the
18 # * Neither the name of Intel Corporation nor the names of its
19 # contributors may be used to endorse or promote products derived
20 # from this software without specific prior written permission.
22 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 matplotlib.use('Agg') # we don't want to use X11
39 import matplotlib.pyplot as plt
40 from matplotlib.ticker import FuncFormatter
42 INT = "([-+]?[0-9][0-9]*)"
50 # sort a test case list
52 for t in [ "enq_core", "deq_core", "enq_bulk", "deq_bulk", "rate" ]:
60 def add(self, **args):
63 # get an ordered list matching parameters
64 # ex: r.get(enq_core=1, deq_core=1)
65 def get(self, **args):
75 retlist.sort(cmp=self.sort)
78 # return an ordered list of all values for this param or param list
79 # ex: r.get_value_list("enq_core")
80 def get_value_list(self, param):
82 if type(param) is not list:
92 if not entry in retlist:
97 # read the file and return a RingTest object containing all data
98 def read_data_from_file(filename):
100 ring_test = RingTest()
102 # parse the file: it produces a list of dict containing the data for
103 # each test case (each dict in the list corresponds to a line)
111 regexp = "ring_autotest "
112 regexp += "e/d_core=%s,%s e/d_bulk=%s,%s "%(INT, INT, INT, INT)
113 regexp += "sp=%s sc=%s "%(INT, INT)
114 regexp += "rate_persec=%s"%(INT)
115 m = re.match(regexp, l)
119 ring_test.add(enq_core = int(m.groups()[0]),
120 deq_core = int(m.groups()[1]),
121 enq_bulk = int(m.groups()[2]),
122 deq_bulk = int(m.groups()[3]),
123 sp = int(m.groups()[4]),
124 sc = int(m.groups()[5]),
125 rate = int(m.groups()[6]))
130 def millions(x, pos):
131 return '%1.1fM' % (x*1e-6)
133 # graph one, with specific parameters -> generate a .svg file
134 def graph_one(str, ring_test, enq_core, deq_core, sp, sc):
135 filename = "ring_%d_%d"%(enq_core, deq_core)
144 filename += "_%s_%s.svg"%(sp_str, sc_str)
147 enq_bulk_list = ring_test.get_value_list("enq_bulk")
148 N_enq_bulk = len(enq_bulk_list)
149 enq_names = map(lambda x:"enq=%d"%x, enq_bulk_list)
151 deq_bulk_list = ring_test.get_value_list("deq_bulk")
152 N_deq_bulk = len(deq_bulk_list)
153 deq_names = map(lambda x:"deq=%d"%x, deq_bulk_list)
155 N = N_enq_bulk * (N_deq_bulk + 1)
159 for enq_bulk in ring_test.get_value_list("enq_bulk"):
161 for deq_bulk in ring_test.get_value_list("deq_bulk"):
162 col += 0.9 / len(ring_test.get_value_list("deq_bulk"))
163 r = ring_test.get(enq_core=enq_core, deq_core=deq_core,
164 enq_bulk=enq_bulk, deq_bulk=deq_bulk,
168 colors.append((1. - col, 0.2, col, 1.)) # rgba
171 colors.append((0.,0.,0.,0.))
173 ind = np.arange(N) # the x locations for the groups
174 width = 1 # the width of the bars: can also be len(x) sequence
177 formatter = FuncFormatter(millions)
179 p = plt.bar(ind, tuple(rates), width, color=tuple(colors))
180 fig.axes[0].yaxis.set_major_formatter(formatter)
182 plt.ylabel('Obj/sec')
183 #plt.ylim(0, 400000000.)
184 plt.title("Ring autotest \"%s\"\nenq core(s)=%d, deq core(s)=%d, %s, %s"\
185 %(str, enq_core, deq_core, sp_str, sc_str))
186 ind_names = np.arange(N_enq_bulk) * (N_deq_bulk+1) + (N_deq_bulk+1) / 2
187 plt.xticks(ind_names, tuple(enq_names))
188 plt.legend(tuple([p[i] for i in range(N_deq_bulk)]), tuple(deq_names),
190 plt.savefig(filename)
192 if len(sys.argv) != 3:
193 print "usage: graph_ring.py file title"
196 ring_test = read_data_from_file(sys.argv[1])
198 for enq_core, deq_core, sp, sc in \
199 ring_test.get_value_list(["enq_core", "deq_core", "sp", "sc"]):
200 graph_one(sys.argv[2], ring_test, enq_core, deq_core, sp, sc)