@ -1,14 +1,15 @@
import os
import os
import csv
import csv
import numpy as np
import numpy as np
import pandas as pd
import seaborn as sns
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
output_path = " ./plots "
output_path = " ./plots "
hbm_result = " ./evaluation-results/baseline/current-hbm/qdp-xeonmax-hbm-tca2-tcb0-tcj1-tmul16 -wl4294967296-cs2097152.csv "
dram_result = " ./evaluation-results/baseline/current-dram/qdp-xeonmax-dram-tca2-tcb0-tcj1-tmul16 -wl4294967296-cs2097152.csv "
prefetch_result = " ./evaluation-results/outofcacheallocation/qdp-xeonmax-prefetch-tca2-tcb1-tcj1-tmul16 -wl4294967296-cs8388608.csv "
distprefetch_result = " ./evaluation-results/distprefetch /qdp-xeonmax-distprefetch-tca1-tcb1-tcj1-tmul32-wl4294967296-cs8388608.csv "
hbm_result = " ./evaluation-results/current/qdp-xeonmax-hbm-tca4-tcb0-tcj1-tmul32 -wl4294967296-cs2097152.csv "
dram_result = " ./evaluation-results/current/qdp-xeonmax-dram-tca2-tcb0-tcj1-tmul32 -wl4294967296-cs2097152.csv "
prefetch_result = " ./evaluation-results/current/qdp-xeonmax-prefetch-tca1-tcb1-tcj1-tmul32 -wl4294967296-cs8388608.csv "
distprefetch_result = " ./evaluation-results/current /qdp-xeonmax-distprefetch-tca1-tcb1-tcj1-tmul32-wl4294967296-cs8388608.csv "
tt_name = " rt-ns "
tt_name = " rt-ns "
function_names = [ " scana-run " , " scanb-run " , " aggrj-run " ]
function_names = [ " scana-run " , " scanb-run " , " aggrj-run " ]
@ -31,24 +32,83 @@ def read_timings_from_csv(fname) -> tuple[list[float], list[str]]:
return list ( t . values ( ) ) , list ( t . keys ( ) )
return list ( t . values ( ) ) , list ( t . keys ( ) )
def get_data_prefetch_cache_access ( ) - > tuple [ list [ float ] , list [ str ] ] :
total = 0.47
data = [ 0.01 , 0.01 , 0.04 , 0.42 ]
data = [ x * 100 / total for x in data ]
keys = [ " Cache::GetCacheNode " , " Cache::Access Itself " , " dml::hardware_device::submit " , " dml::make_mem_move_task (operator new) " ]
def read_total_time_from_csv ( fname ) - > float :
time = 0
row_count = 0
with open ( fname , newline = ' ' ) as csvfile :
reader = csv . DictReader ( csvfile , delimiter = ' ; ' )
for row in reader :
row_count = row_count + 1
time + = int ( row [ " rt-ns " ] )
return time / ( 1000 * 1000 * row_count )
def read_cache_hitrate_from_csv ( fname ) - > float :
hitrate = 0
row_count = 0
with open ( fname , newline = ' ' ) as csvfile :
reader = csv . DictReader ( csvfile , delimiter = ' ; ' )
for row in reader :
row_count = row_count + 1
hitrate + = float ( row [ " cache-hr " ] )
return ( hitrate * 100 ) / row_count
def generate_speedup_table ( ) :
baseline = read_total_time_from_csv ( dram_result )
columns = [ " Configuration " , " Speedup " , " Cache Hitrate " ]
names = [
" DDR-SDRAM (Baseline) " ,
" HBM (Upper Limit) " ,
" Prefetching " ,
" Prefetching, Distributed Columns "
]
rawtime = [
read_total_time_from_csv ( dram_result ) ,
read_total_time_from_csv ( hbm_result ) ,
read_total_time_from_csv ( prefetch_result ) ,
read_total_time_from_csv ( distprefetch_result ) ,
]
return data , keys
speedup = [
baseline / rawtime [ 0 ] ,
baseline / rawtime [ 1 ] ,
baseline / rawtime [ 2 ] ,
baseline / rawtime [ 3 ]
]
def get_data_prefetch_total ( ) - > tuple [ list [ float ] , list [ str ] ] :
return read_timings_from_csv ( prefetch_result )
cachehr = [
0 ,
0 ,
read_cache_hitrate_from_csv ( prefetch_result ) ,
read_cache_hitrate_from_csv ( distprefetch_result )
]
data = [
[ names [ 0 ] , f " x{speedup[0]:1.2f} " , r " \ textemdash " ] ,
[ names [ 1 ] , f " x{speedup[1]:1.2f} " , r " \ textemdash " ] ,
[ names [ 2 ] , f " x{speedup[2]:1.2f} " , f " {cachehr[2]:2.2f} \ % " ] ,
[ names [ 3 ] , f " x{speedup[3]:1.2f} " , f " {cachehr[3]:2.2f} \ % " ]
]
return pd . DataFrame ( data , columns = columns )
def tex_table ( df , fname ) :
with open ( os . path . join ( output_path , fname ) , " w " ) as of :
of . write ( df . to_latex ( index = False ) )
def get_data_dram_total ( ) - > tuple [ list [ float ] , list [ str ] ] :
return
# loops over all possible configuration combinations and calls
# loops over all possible configuration combinations and calls
# process_file_to_dataset for them in order to build a dataframe
# process_file_to_dataset for them in order to build a dataframe
# which is then displayed and saved
# which is then displayed and saved
def main ( data : tuple [ list [ float ] , list [ str ] ] , fname , unit ) :
def donut_plot ( data : tuple [ list [ float ] , list [ str ] ] , fname ) :
palette_color = sns . color_palette ( ' mako_r ' )
palette_color = sns . color_palette ( ' mako_r ' )
fig , ax = plt . subplots ( figsize = ( 6 , 3 ) , subplot_kw = dict ( aspect = " equal " ) )
fig , ax = plt . subplots ( figsize = ( 6 , 3 ) , subplot_kw = dict ( aspect = " equal " ) )
@ -64,15 +124,19 @@ def main(data: tuple[list[float], list[str]], fname, unit):
horizontalalignment = { - 1 : " right " , 1 : " left " } [ int ( np . sign ( x ) ) ]
horizontalalignment = { - 1 : " right " , 1 : " left " } [ int ( np . sign ( x ) ) ]
connectionstyle = f " angle,angleA=0,angleB={ang} "
connectionstyle = f " angle,angleA=0,angleB={ang} "
kw [ " arrowprops " ] . update ( { " connectionstyle " : connectionstyle } )
kw [ " arrowprops " ] . update ( { " connectionstyle " : connectionstyle } )
ax . annotate ( f " {data[1][i]} - {data[0][i]:2.2f} {unit} " , xy = ( x , y ) , xytext = ( 1.35 * np . sign ( x ) , 1.4 * y ) , horizontalalignment = horizontalalignment , * * kw )
ax . annotate ( f " {data[1][i]} - {data[0][i]:2.2f} ms " , xy = ( x , y ) , xytext = ( 1.35 * np . sign ( x ) , 1.4 * y ) , horizontalalignment = horizontalalignment , * * kw )
plt . rcParams . update ( { ' font.size ' : 18 } )
plt . rcParams . update ( { ' font.size ' : 18 } )
fig . savefig ( os . path . join ( output_path , fname ) , bbox_inches = ' tight ' )
fig . savefig ( os . path . join ( output_path , fname ) , bbox_inches = ' tight ' )
def main ( ) :
donut_plot ( read_timings_from_csv ( prefetch_result ) , " plot-timing-prefetch.pdf " )
donut_plot ( read_timings_from_csv ( distprefetch_result ) , " plot-timing-distprefetch.pdf " )
donut_plot ( read_timings_from_csv ( dram_result ) , " plot-timing-dram.pdf " )
donut_plot ( read_timings_from_csv ( hbm_result ) , " plot-timing-hbm.pdf " )
tex_table ( generate_speedup_table ( ) , " table-qdpspeedup.tex " )
if __name__ == " __main__ " :
if __name__ == " __main__ " :
main ( get_data_prefetch_cache_access ( ) , " plot-timing-cacheaccess.pdf " , " % " )
main ( read_timings_from_csv ( prefetch_result ) , " plot-timing-prefetch.pdf " , " ms " )
main ( read_timings_from_csv ( distprefetch_result ) , " plot-timing-distprefetch.pdf " , " ms " )
main ( read_timings_from_csv ( dram_result ) , " plot-timing-dram.pdf " , " ms " )
main ( read_timings_from_csv ( hbm_result ) , " plot-timing-hbm.pdf " , " ms " )
main ( )