xref: /freebsd-src/contrib/cortex-strings/scripts/plot-align.py (revision 8c4282b370bd66908b45b6a223226a9fc2b69d57)
1*09a53ad8SAndrew Turner#!/usr/bin/env python
2*09a53ad8SAndrew Turner
3*09a53ad8SAndrew Turner"""Plot the performance of different variants of one routine versus alignment.
4*09a53ad8SAndrew Turner"""
5*09a53ad8SAndrew Turner
6*09a53ad8SAndrew Turnerimport libplot
7*09a53ad8SAndrew Turner
8*09a53ad8SAndrew Turnerimport pylab
9*09a53ad8SAndrew Turner
10*09a53ad8SAndrew Turner
11*09a53ad8SAndrew Turnerdef plot(records, bytes, function):
12*09a53ad8SAndrew Turner    records = [x for x in records if x.bytes==bytes and x.function==function]
13*09a53ad8SAndrew Turner
14*09a53ad8SAndrew Turner    variants = libplot.unique(records, 'variant', prefer='this')
15*09a53ad8SAndrew Turner    alignments = libplot.unique(records, ('src_alignment', 'dst_alignment'))
16*09a53ad8SAndrew Turner
17*09a53ad8SAndrew Turner    X = pylab.arange(len(alignments))
18*09a53ad8SAndrew Turner    width = 1.0/(len(variants)+1)
19*09a53ad8SAndrew Turner
20*09a53ad8SAndrew Turner    colours = libplot.make_colours()
21*09a53ad8SAndrew Turner
22*09a53ad8SAndrew Turner    pylab.figure(1).set_size_inches((16, 12))
23*09a53ad8SAndrew Turner    pylab.clf()
24*09a53ad8SAndrew Turner
25*09a53ad8SAndrew Turner    for i, variant in enumerate(variants):
26*09a53ad8SAndrew Turner        heights = []
27*09a53ad8SAndrew Turner
28*09a53ad8SAndrew Turner        for alignment in alignments:
29*09a53ad8SAndrew Turner            matches = [x for x in records if x.variant==variant and x.src_alignment==alignment[0] and x.dst_alignment==alignment[1]]
30*09a53ad8SAndrew Turner
31*09a53ad8SAndrew Turner            if matches:
32*09a53ad8SAndrew Turner                vals = [match.bytes*match.loops/match.elapsed/(1024*1024) for
33*09a53ad8SAndrew Turner                        match in matches]
34*09a53ad8SAndrew Turner                mean = sum(vals)/len(vals)
35*09a53ad8SAndrew Turner                heights.append(mean)
36*09a53ad8SAndrew Turner            else:
37*09a53ad8SAndrew Turner                heights.append(0)
38*09a53ad8SAndrew Turner
39*09a53ad8SAndrew Turner        pylab.bar(X+i*width, heights, width, color=colours.next(), label=variant)
40*09a53ad8SAndrew Turner
41*09a53ad8SAndrew Turner
42*09a53ad8SAndrew Turner    axes = pylab.axes()
43*09a53ad8SAndrew Turner    if libplot.alignments_equal(alignments):
44*09a53ad8SAndrew Turner        alignment_labels = ["%s" % x[0] for x in alignments]
45*09a53ad8SAndrew Turner    else:
46*09a53ad8SAndrew Turner        alignment_labels = ["%s:%s" % (x[0], x[1]) for x in alignments]
47*09a53ad8SAndrew Turner    axes.set_xticklabels(alignment_labels)
48*09a53ad8SAndrew Turner    axes.set_xticks(X + 0.5)
49*09a53ad8SAndrew Turner
50*09a53ad8SAndrew Turner    pylab.title('Performance of different variants of %(function)s for %(bytes)d byte blocks' % locals())
51*09a53ad8SAndrew Turner    pylab.xlabel('Alignment')
52*09a53ad8SAndrew Turner    pylab.ylabel('Rate (MB/s)')
53*09a53ad8SAndrew Turner    pylab.legend(loc='lower right', ncol=3)
54*09a53ad8SAndrew Turner    pylab.grid()
55*09a53ad8SAndrew Turner    pylab.savefig('alignment-%(function)s-%(bytes)d.png' % locals(), dpi=72)
56*09a53ad8SAndrew Turner
57*09a53ad8SAndrew Turnerdef main():
58*09a53ad8SAndrew Turner    records = libplot.parse()
59*09a53ad8SAndrew Turner
60*09a53ad8SAndrew Turner    for function in libplot.unique(records, 'function'):
61*09a53ad8SAndrew Turner        for bytes in libplot.unique(records, 'bytes'):
62*09a53ad8SAndrew Turner            plot(records, bytes, function)
63*09a53ad8SAndrew Turner
64*09a53ad8SAndrew Turner    pylab.show()
65*09a53ad8SAndrew Turner
66*09a53ad8SAndrew Turnerif __name__ == '__main__':
67*09a53ad8SAndrew Turner    main()
68