| #!/usr/bin/env python |
| import sys, argparse |
| import csv |
| import os |
| |
| import matplotlib.pyplot as plt |
| import numpy as np |
| |
| def parse_args(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument("csv_file", default=None, help="CSV file with level runtimes") |
| parser.add_argument("--scale_size", default=False, action="store_true", help="Scale point size by serial level runtime") |
| parser.add_argument("--average", default=False, action="store_true", help="Draw average lines") |
| parser.add_argument("-f", default=None, help="Output filename") |
| |
| args = parser.parse_args() |
| |
| return args |
| |
| def main(): |
| args = parse_args() |
| |
| data = {} |
| with open(args.csv_file) as f: |
| csv_reader = csv.DictReader(f) |
| for field in csv_reader.fieldnames: |
| data[field] = [] |
| |
| for row in csv_reader: |
| for field in csv_reader.fieldnames: |
| data[field].append(float(row[field])) |
| |
| for series_name, data_values in data.iteritems(): |
| print "\tSeries: ", series_name |
| print "\t# Values: ", len(data_values) |
| |
| |
| #Calculate derived series |
| derived_series = {} |
| |
| speedup_fwd = {} |
| speedup_bck = {} |
| size_factor = 0 |
| if args.scale_size: |
| size_factor = 2000 |
| size_min = 10 |
| serial_total = sum(data['serial_fwd'][:] + data['serial_bck'][:]) |
| |
| for i in xrange(len(data['serial_fwd'])): |
| width = data['Width'][i] |
| serial_fwd = data['serial_fwd'][i] |
| serial_bck = data['serial_bck'][i] |
| parrallel_fwd = data['parallel_fwd'][i] |
| parrallel_bck = data['parallel_bck'][i] |
| if parrallel_fwd != 0.0: |
| speedup = serial_fwd / parrallel_fwd |
| serial_frac = serial_fwd / serial_total |
| val = (speedup, serial_frac) |
| try: |
| speedup_fwd[width].append(val) |
| except KeyError: |
| speedup_fwd[width] = [val] |
| |
| if parrallel_bck != 0.0: |
| speedup = serial_bck / parrallel_bck |
| serial_frac = serial_bck / serial_total |
| val = (speedup, serial_frac) |
| try: |
| speedup_bck[width].append(val) |
| except KeyError: |
| speedup_bck[width] = [val] |
| |
| fwd_x = [] |
| fwd_y = [] |
| fwd_s = [] |
| for width, values in speedup_fwd.iteritems(): |
| for speedup, serial_frac in values: |
| fwd_x.append(width) |
| fwd_y.append(speedup) |
| fwd_s.append(size_factor*serial_frac + size_min) |
| bck_x = [] |
| bck_y = [] |
| bck_s = [] |
| for width, values in speedup_bck.iteritems(): |
| for speedup, serial_frac in values: |
| bck_x.append(width) |
| bck_y.append(speedup) |
| bck_s.append(size_factor*serial_frac + size_min) |
| |
| #Averages |
| fwd_x_avg = [] |
| fwd_y_avg = [] |
| for width, values in sorted(speedup_fwd.iteritems()): |
| speedups = [x[0] for x in values] |
| avg = sum(speedups) / len(speedups) |
| #print "Width, avg", width, values, speedups |
| fwd_x_avg.append(width) |
| fwd_y_avg.append(avg) |
| |
| bck_x_avg = [] |
| bck_y_avg = [] |
| for width, values in sorted(speedup_bck.iteritems()): |
| speedups = [x[0] for x in values] |
| avg = sum(speedups) / len(speedups) |
| #print "Width, avg", width, values, speedups |
| bck_x_avg.append(width) |
| bck_y_avg.append(avg) |
| |
| plt.scatter(fwd_x, fwd_y, fwd_s, c='b', label="speedup_fwd") |
| plt.scatter(bck_x, bck_y, bck_s, c='g', label="speedup_bck") |
| |
| if args.average: |
| plt.plot(fwd_x_avg, fwd_y_avg, c='b', label="Average FWD Speed-Up") |
| plt.plot(bck_x_avg, bck_y_avg, c='g', label="Average BCK Speed-Up") |
| |
| plt.xscale("log") |
| |
| xmin, xmax = plt.xlim() |
| ymin, ymax = plt.ylim() |
| ymin = 0 |
| xmin = 1 |
| plt.ylim(ymin,ymax) |
| plt.xlim(xmin,xmax) |
| |
| plt.title(os.path.splitext(os.path.basename(args.csv_file))[0]) |
| plt.xlabel("Level Width") |
| plt.ylabel("Parallel Speed-Up") |
| plt.legend(loc='upper left') |
| |
| if args.f: |
| plt.savefig(args.f, dpi=300) |
| else: |
| plt.show() |
| |
| def runningMean(x, N): |
| return np.convolve(x, np.ones((N,))/N, mode='same') |
| |
| if __name__ == "__main__": |
| main() |