1*effccb7dSTang Haojinimport os.path as osp 2*effccb7dSTang Haojinimport numpy as np 3*effccb7dSTang Haojinimport matplotlib.pyplot as plt 4*effccb7dSTang Haojinimport pandas as pd 5*effccb7dSTang Haojinimport configs as cf 6*effccb7dSTang Haojin 7*effccb7dSTang Haojin 8*effccb7dSTang Haojindef draw(): 9*effccb7dSTang Haojin results = { 10*effccb7dSTang Haojin 'XS': (cf.OUT_CSV, 'XS'), 11*effccb7dSTang Haojin } 12*effccb7dSTang Haojin 13*effccb7dSTang Haojin configs = list(results.keys()) 14*effccb7dSTang Haojin 15*effccb7dSTang Haojin color_types = 10 16*effccb7dSTang Haojin cmap = plt.get_cmap('tab10') 17*effccb7dSTang Haojin color_index = np.arange(0, 1, 1.0 / color_types) 18*effccb7dSTang Haojin colors = [cmap(c) for c in color_index] * 3 19*effccb7dSTang Haojin hatches = [None] * color_types + ['//'] * color_types + ['|'] * color_types 20*effccb7dSTang Haojin 21*effccb7dSTang Haojin n_conf = len(configs) 22*effccb7dSTang Haojin # Draw stacked bar chart for each simulator 23*effccb7dSTang Haojin width = 0.8 / n_conf 24*effccb7dSTang Haojin # set figure size: 25*effccb7dSTang Haojin 26*effccb7dSTang Haojin fig, ax = plt.subplots() 27*effccb7dSTang Haojin fig.set_size_inches(8.0, 5.0) 28*effccb7dSTang Haojin 29*effccb7dSTang Haojin x = None 30*effccb7dSTang Haojin have_set_label = False 31*effccb7dSTang Haojin 32*effccb7dSTang Haojin dfs = [pd.read_csv(result[0], index_col=0) 33*effccb7dSTang Haojin for _, result in results.items()] 34*effccb7dSTang Haojin common_bmk = list(set.intersection(*[set(df.index) for df in dfs])) 35*effccb7dSTang Haojin dfs = [df.loc[common_bmk] for df in dfs] 36*effccb7dSTang Haojin 37*effccb7dSTang Haojin rename = True 38*effccb7dSTang Haojin fine_grain_rename = False 39*effccb7dSTang Haojin renamed_dfs = [] 40*effccb7dSTang Haojin for df in dfs: 41*effccb7dSTang Haojin to_drops = [] 42*effccb7dSTang Haojin sorted_cols = [] 43*effccb7dSTang Haojin 44*effccb7dSTang Haojin def rename_with_map(df, rename_map): 45*effccb7dSTang Haojin for k in rename_map: 46*effccb7dSTang Haojin if rename_map[k] is not None: 47*effccb7dSTang Haojin if rename_map[k].startswith('Merge'): 48*effccb7dSTang Haojin merged = rename_map[k][5:] 49*effccb7dSTang Haojin if merged not in df.columns: 50*effccb7dSTang Haojin df[merged] = df[k] 51*effccb7dSTang Haojin sorted_cols.append(merged) 52*effccb7dSTang Haojin else: 53*effccb7dSTang Haojin df[merged] += df[k] 54*effccb7dSTang Haojin else: 55*effccb7dSTang Haojin df[rename_map[k]] = df[k] 56*effccb7dSTang Haojin sorted_cols.append(rename_map[k]) 57*effccb7dSTang Haojin 58*effccb7dSTang Haojin to_drops.append(k) 59*effccb7dSTang Haojin else: 60*effccb7dSTang Haojin sorted_cols.append(k) 61*effccb7dSTang Haojin df.drop(columns=to_drops, inplace=True) 62*effccb7dSTang Haojin 63*effccb7dSTang Haojin # Merge df columns according to the rename map if value starting with 'Merge' 64*effccb7dSTang Haojin if rename: 65*effccb7dSTang Haojin if fine_grain_rename: 66*effccb7dSTang Haojin rename_with_map(df, cf.xs_fine_grain_rename_map) 67*effccb7dSTang Haojin else: 68*effccb7dSTang Haojin rename_with_map(df, cf.xs_coarse_rename_map) 69*effccb7dSTang Haojin 70*effccb7dSTang Haojin icount = 20 * 10 ** 6 71*effccb7dSTang Haojin if 'BadSpecInst' in df.columns: 72*effccb7dSTang Haojin df['BadSpecInst'] += df['Base'] - icount 73*effccb7dSTang Haojin else: 74*effccb7dSTang Haojin df['BadSpecInst'] = df['Base'] - icount 75*effccb7dSTang Haojin df['Base'] = icount 76*effccb7dSTang Haojin 77*effccb7dSTang Haojin df = df.astype(float) 78*effccb7dSTang Haojin renamed_dfs.append(df) 79*effccb7dSTang Haojin 80*effccb7dSTang Haojin common_col = list(set.intersection( 81*effccb7dSTang Haojin *[set(df.columns) for df in renamed_dfs])) 82*effccb7dSTang Haojin unique_cols = set() 83*effccb7dSTang Haojin for df in renamed_dfs: 84*effccb7dSTang Haojin unique_col = set(df.columns) - set(common_col) 85*effccb7dSTang Haojin for col in unique_col: 86*effccb7dSTang Haojin unique_cols.add(col) 87*effccb7dSTang Haojin for df in renamed_dfs: 88*effccb7dSTang Haojin for col in unique_cols: 89*effccb7dSTang Haojin if col not in df.columns: 90*effccb7dSTang Haojin df[col] = 0.0 91*effccb7dSTang Haojin df.sort_index(axis=1, inplace=True) 92*effccb7dSTang Haojin 93*effccb7dSTang Haojin put_to_front = ['Base', 'BadSpec'] 94*effccb7dSTang Haojin 95*effccb7dSTang Haojin tmp_df = renamed_dfs[0].sort_values(by='cpi', ascending=False) 96*effccb7dSTang Haojin bmk_sort = tmp_df.index.tolist() 97*effccb7dSTang Haojin 98*effccb7dSTang Haojin for df in renamed_dfs: 99*effccb7dSTang Haojin df = df.loc[bmk_sort] 100*effccb7dSTang Haojin df = df[put_to_front + 101*effccb7dSTang Haojin [col for col in df.columns if col not in put_to_front]] 102*effccb7dSTang Haojin df = df.drop(columns=['cpi']) 103*effccb7dSTang Haojin for to_drop in ['ipc', 'cpi', 'Cycles', 'Insts', 'coverage']: 104*effccb7dSTang Haojin if to_drop in df.columns: 105*effccb7dSTang Haojin df = df.drop(columns=[to_drop]) 106*effccb7dSTang Haojin 107*effccb7dSTang Haojin # draw stacked bar chart 108*effccb7dSTang Haojin bottom = np.zeros(len(df)) 109*effccb7dSTang Haojin highest = 0.0 110*effccb7dSTang Haojin if x is None: 111*effccb7dSTang Haojin x = np.arange(len(df), dtype=float) 112*effccb7dSTang Haojin for component, color, hatch in zip(df.columns, colors[:len(df.columns)], hatches[:len(df.columns)]): 113*effccb7dSTang Haojin if have_set_label: 114*effccb7dSTang Haojin label = None 115*effccb7dSTang Haojin else: 116*effccb7dSTang Haojin label = component 117*effccb7dSTang Haojin ax.bar(x, df[component], bottom=bottom, 118*effccb7dSTang Haojin width=width, color=color, label=label, edgecolor='black', hatch=hatch) 119*effccb7dSTang Haojin highest = max((bottom + df[component]).max(), highest) 120*effccb7dSTang Haojin bottom += df[component] 121*effccb7dSTang Haojin x += width 122*effccb7dSTang Haojin have_set_label = True 123*effccb7dSTang Haojin # replace x tick labels with df.index with rotation 124*effccb7dSTang Haojin ax.set_xticks(x - width * len(results) / n_conf - 0.25) 125*effccb7dSTang Haojin ax.set_xticklabels(bmk_sort, rotation=90) 126*effccb7dSTang Haojin ax.tick_params(left=False, bottom=False) 127*effccb7dSTang Haojin ax.set_ylabel('Slots') 128*effccb7dSTang Haojin ax.set_xlabel('SPECCPU 2006 Benchmarks') 129*effccb7dSTang Haojin 130*effccb7dSTang Haojin handles, labels = plt.gca().get_legend_handles_labels() 131*effccb7dSTang Haojin ax.legend(reversed(handles), reversed(labels), fancybox=True, 132*effccb7dSTang Haojin framealpha=0.3, 133*effccb7dSTang Haojin loc='best', 134*effccb7dSTang Haojin ncol=3, 135*effccb7dSTang Haojin ) 136*effccb7dSTang Haojin if n_conf == 2: 137*effccb7dSTang Haojin ax.set_title(f'{configs[0]} <-- VS. --> {configs[1]}') 138*effccb7dSTang Haojin 139*effccb7dSTang Haojin fig.savefig(osp.join('results', 'result.png'), 140*effccb7dSTang Haojin bbox_inches='tight', pad_inches=0.05, dpi=200) 141