common.py 4.5 KB
import os, sys, argparse
import numpy
import matplotlib.pyplot as plt
import json
from pylab import *
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.patches import Rectangle
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from sets import Set

rc('font',**{'family':'serif','serif':['Times'], 'size': 9}) 
rc('text', usetex=True)

legend_size = 8 
text_size = 9

def setup_parser():
	parser = argparse.ArgumentParser()

	parser.add_argument('-i', '--input-dir', action="store", default="data/496", help='Input data path')
	parser.add_argument('-o', '--output-dir', action="store", default="plots/496", help='Output plots path')
	parser.add_argument('-f', '--full_settings', action="store_true", default=True, help = 'all 496 steps')
	parser.add_argument('--cpufreqs', action="store", type=str, help='comma separated cpu frequencies')
	parser.add_argument('--memfreqs', action="store", type=str, help='comma separated mem frequencies')
	parser.add_argument('--inefficiency', action='store', type=str, default=[x/10.0 for x in range(10, 21)], help='Inefficiencies')

	return parser

def get_benchmarks(args):
	if args.full_settings:
		benchmarks=['bzip2', 'gcc','gobmk','lbm','libquantum','milc']
	else:
		benchmarks=['astar','bzip2','dealII','gcc','gobmk','h264ref','hmmer','lbm','libquantum','mcf','milc','namd','omnetpp','perlbench','povray','sjeng','soplex','specrand998','specrand999','xalancbmk'] # removed sphinx as it has only one sample
#		benchmarks=['astar','bzip2','dealII','gcc','gobmk','h264ref','hmmer','lbm','libquantum','mcf','milc','namd','omnetpp','perlbench','povray','sjeng','soplex','specrand998','specrand999','sphinx','xalancbmk']
	labels = list(benchmarks)
	labels = list([x.replace('libquantum', 'libq.') for x in labels])
	return benchmarks, labels

def get_cpu_freq_plot_list(args):
	if args.full_settings:
		return [int(v)/1000 for v in range(100000, 1000001, 90000)]
	else:
		return [int(v)/1000 for v in range(100000, 1000001, 100000)]

def get_mem_freq_plot_list(args):
	if args.full_settings:
		return [int(v)/1000 for v in range(200000, 800001, 40000)]
	else:
		return [int(v)/1000 for v in range(200000, 800001, 100000)]

def get_plot():
	return plt.figure(figsize=(6, 2.5)).add_subplot('111')

def get_mul_ineffs():
	return [1, 1.3, 1.6, 3.0]

#def save_plot(ax, outputf):
#	plt.tight_layout(pad=-1, w_pad=-1, h_pad=-1)
#	plt.savefig("%s.pdf" % (outputf), bbox_inches='tight')
def save_plot(ax, outputf, **kwargs):
	plt.savefig("%s.pdf" % (outputf), bbox_inches='tight', **kwargs)
	plt.close()

def get_cpi(bmark, dir_path):
	stats_file = os.path.join(os.path.join(dir_path, "cpi_mpki_data"), "%s_1000000_800000.dat" % (bmark))
	cpi = []
	with open(stats_file, "r") as f:
		for line in f:
			stat = json.loads(line)
			instructions = stat["cpu_instruction_count"]
			cycles = stat["cpu_busy_cycles"] + \
					stat["cpu_quiesce_time_ns"] / 1000 + \
					stat["cpu_dram_stall_time_ns"] / 1000 + \
					stat["cpu_l1l2_stall_cycles"]

			cpi.append( float(cycles) / instructions)
	return cpi

def get_mpki(bmark, dir_path):
	stats_file = os.path.join(os.path.join(dir_path, "cpi_mpki_data"), "%s_1000000_800000.dat" % (bmark))
	mpki = []
	with open(stats_file, "r") as f:
		for line in f:
			stat = json.loads(line)
			instructions = stat["cpu_instruction_count"]
			misses = stat["mem_read_count"]

			mpki.append( float(misses * 1000) / instructions)
	return mpki

def parse(argv, full_settings=False):
	parser = setup_parser()
	args = parser.parse_args(argv[1:])

	if args.cpufreqs:
		args.cpufreqs = [int(v) for v in args.cpufreqs.split(',')]
	else:
		#cpu_freq_list = [int(v) for v in range(100000, 1000001, 100000)]
		if args.full_settings or full_settings:
			args.cpufreqs = [100000, 130005, 160000, 190006, 220022, 250000, 280034, 324992, 340020, 385060, 400000, 445038, 475059, 505051, 520021, 550055, 580046, 610128, 654879, 684932, 714706, 745156, 775194, 805153, 834725, 850340,     880282, 925069, 955110, 985222, 1000000]
		else:
 			args.cpufreqs = [100000, 205002, 309981, 400000, 505051, 610128, 714796, 805153, 909918, 1000000]

	if args.memfreqs:
		args.memfreqs = [int(v) for v in args.memfreqs.split(',')]
	else:
		if args.full_settings or full_settings:
			args.memfreqs = [200000, 240000, 280000, 320000, 360000, 400000, 440000, 480000, 520000, 560000, 600000, 640000, 680000, 720000, 760000, 800000]
		else:
			args.memfreqs = [200000, 300030, 400000, 500000, 610128, 710227, 800000]

	if isinstance(args.inefficiency, str):
		args.inefficiency = [float(x) for x in args.inefficiency.split(',')]

	return args