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