dendrobates-t-azureus/analysis/makeplots-bonus.jl

415 lines
12 KiB
Julia
Raw Normal View History

using CSV
using Plots
pgfplotsx()
function myfill(element, dimensions)
res = fill(element, dimensions)
res = map(x -> deepcopy(x), res)
res
end
# Generals TODO : Fix the ticks, add legends
#eaps = [12,13]
eaps = [14,15]
#eaps = [0,12,13,14,15]
len_eaps = length(eaps)
#types = ["S","U"]
types = ["S"]
#functions_identifier = ["A", "B", "C", "D", "E"]
functions_identifier = ["F"]
function A_index(k, x, y, z)
if (x + k) % 64 != y
print(string("Argh, k = ", k, ", x = ", x, ", y = ", y, ", z = ", z))
@assert false
end
(x,z)
end
function B_index(k, x, y, z)
@assert (x - k + 64) % 64 == y
(x,z)
end
function C_index(k, x, y, z)
@assert (y + k) % 64 == z
(x,y)
end
function D_index(k, x, y, z)
@assert (y - k + 64) % 64 == z
(x,y)
end
function E_index(k, x, y, z)
@assert (y - x + 64) % 64 == (z - y + 64) % 64
(x, (y - x + 64) % 64)
end
function F_index(k, x1, x2, x3, x4)
@assert (x1 + k + 64) % 64 == x2
@assert (x2 + k + 64) % 64 == x4
(x1, x3)
end
#functions_index = [A_index, B_index, C_index, D_index, E_index]
functions_index = [F_index]
#types = ["S"]
ks = [[1, 2, 3, 4, 8],
[1, 2, 3, 4, 8],
[1, 2, 3, 4, 8],
[1, 2, 3, 4, 8],
[2, 3, 4]
]
ks = [[4, 3, 2, 1, -1, -2, -3, -4]]
#ks = [[1]]
methods = ["SF", "SR", "FF"]
plot_lock = ReentrantLock()
slices_offset_0 = [0, 1, 2, 8, 14, 15, 30, 31, 32, 55, 56, 61, 62, 63]
#slices_offset_0 = []
#diff_slices_offset_0 = [0, 1, 2, 61, 62, 63]
function make_name(eap, type, f, k)
string("bonusap/bonusap-with-", eap, "-prefetcher.", type, f, k, ".csv")
end
all_file_names = myfill((0,0,0,[]), (length(eaps), length(types), length(functions_index)))
for x in 1:len_eaps
for (y,type) in enumerate(types)
for (z,f) in enumerate(functions_identifier)
all_file_names[x,y,z] = (x,y,z,[])
for (i,k) in enumerate(ks[z])
# change me : insert file names into list
push!(all_file_names[x,y,z][4] , (x, y, z, k, make_name(eaps[x], type, f, k) ) )
end
end
end
end
print(all_file_names)
#files = Matrix(CSV, length(eaps), length(types), length(levels))
files = Array{
Union{
Nothing,
Tuple{Int64, Int64, Int64, Vector{
Tuple{ Int64, Int64, Int64, Int64, CSV.File }
}}
},3
}(nothing, length(eaps), length(types), length(functions_identifier))
Threads.@threads for f in all_file_names
x = f[1]
y = f[2]
z = f[3]
files[x,y,z] = (x,y,z,[])
for (x,y,z,k,name) in f[4]
push!(files[x,y,z][4], (x,y,z,k, CSV.File(name)))
end
end
# TODO :
#
# - Split this function in a load data into square / cube structure and a plot function
# - Refactor the code below to compute the various squares / cubes and then do the plots.
# - Refactor the Slicing function too
# - Create a custom diagonal slice function ?
preamble_printed = false
push!(PGFPlotsX.CUSTOM_PREAMBLE,raw"\newcommand{\gdfigurewidth}{150mm}")
push!(PGFPlotsX.CUSTOM_PREAMBLE,raw"\newcommand{\gdfigureheight}{100mm}")
function graph2d(name, matrix, xlabel, ylabel)
x = range(0, 63)
y = range(0, 63)
function hmp2d(x, y)
matrix[x + 1, y + 1]
end
lock(plot_lock) do
graph = heatmap(x, y, hmp2d, minorgrid=true, height = raw"{\gdfigureheight}}, width = {{\gdfigurewidth}", xlabel = xlabel, ylabel = ylabel, c = :blues, extra_kwargs =:subplot)
if !preamble_printed
global preamble_printed = true
print(Plots.pgfx_preamble(graph))
end
savefig(graph, string(name, ".tikz"))
savefig(graph, string(name, ".pdf"))
end
end
function graph2dclims(name, matrix, clims, xlabel, ylabel)
x = range(0, 63)
y = range(0, 63)
function hmp2d(x, y)
matrix[x + 1, y + 1]
end
lock(plot_lock) do
graph = heatmap(x, y, hmp2d, clims = clims, minorgrid=true, height = raw"{\gdfigureheight}}, width = {{\gdfigurewidth}", xlabel = xlabel, ylabel = ylabel, extra_kwargs =:subplot)
savefig(graph, string(name, ".tikz"))
savefig(graph, string(name, ".pdf"))
end
end
function cube_flatten_z(cubes)
len = length(cubes)
res = myfill(myfill(0.0,(64,64)), len)
for k in range(1,64)
Threads.@threads for i in range(1,64)
for j in range(1,64)
for l in range(1,len)
res[l][i,j] += cubes[l][i,j,k]
end
end
end
end
res
end
function slice_extract_x(cubes, slices)
slice_length = length(slices)
cube_length = length(cubes)
res = myfill(myfill(myfill(0.0, (64, 64)), slice_length), cube_length)
for i in range(1,64)
for j in range(1,64)
for (k,slice) in enumerate(slices)
for l in range(1, cube_length)
res[l][k][i, j] = cubes[l][slice+1, i, j]
end
end
end
end
res
end
function graph_2(basename, csv, k, index_function)
result = fill(-1.0, (3, 64,64,64))
# Fill in the 3D cube, then create the various slices and flattenings
# Flattened Cube with x = first addr, y = second addr, compute the sum of prefetches ?
# Grab a few random first adresses and look at them with x = second addr, y = probe addr
# 0,1, 62,63 14, 15 plus one other depending on what appears
for row in csv
probe = row.ProbeAddr
offset_0 = Int64(row.Offset_0)
offset_1 = Int64(row.Offset_1)
offset_2 = Int64(row.Offset_2)
offset_3 = Int64(row.Offset_3)
index = index_function(k, offset_0, offset_1, offset_2, offset_3)
i = index[1] + 1
j = index[2] + 1
@assert result[:, i, j, probe + 1] == [-1.0,-1.0,-1.0]
result[1, i, j, probe + 1] = row.Probe_SF_HR
result[2, i, j, probe + 1] = row.Probe_SR_HR
result[3, i, j, probe + 1] = row.Probe_FF_HR
end
allprobes = cube_flatten_z([result[1,:,:,:], result[2,:,:,:], result[3,:,:,:]])
sf_probe_heatmap_allprobes = allprobes[1]
sr_probe_heatmap_allprobes = allprobes[2]
ff_probe_heatmap_allprobes = allprobes[3]
all_slices = slice_extract_x([result[1,:,:,:], result[2,:,:,:], result[3,:,:,:]], slices_offset_0)
sf_probe_slices_heatmaps = all_slices[1]
sr_probe_slices_heatmaps = all_slices[2]
ff_probe_slices_heatmaps = all_slices[3]
graph2d(string(basename, "_SF_AllProbes"), sf_probe_heatmap_allprobes, "i", "j")
graph2d(string(basename, "_SR_AllProbes"), sr_probe_heatmap_allprobes, "i", "j")
graph2d(string(basename, "_FF_AllProbes"), ff_probe_heatmap_allprobes, "i", "j")
for (i, offset_0) in enumerate(slices_offset_0)
print(offset_0)
data = sf_probe_slices_heatmaps[i]
graph2dclims(string(basename, "_SF_Slice_", offset_0),sf_probe_slices_heatmaps[i],(0,1), "j", "probe")
graph2dclims(string(basename, "_SR_Slice_", offset_0),sr_probe_slices_heatmaps[i],(0,1), "j", "probe")
graph2dclims(string(basename, "_FF_Slice_", offset_0),ff_probe_slices_heatmaps[i],(0,1), "j", "probe")
end
result
end
cubes = myfill([], (length(eaps), length(types), length(functions_identifier)))
# need to push (k, cube)
Threads.@threads for experiment in files
for (eap, type, f, k, file) in experiment[4]
name = string(eaps[eap], "/julia_eap_", eaps[eap], "_", types[type], functions_identifier[f], k)
print(string(name,"\n"))
cube_3 = graph_2(name, file, k, functions_index[f])
push!(cubes[eap, type, f], cube_3)
end
end
if false
print("Computing 14 union 13...")
function cube_max(cubes_1, cubes_2)
@assert size(cubes_1) == size(cubes_2)
sizes = size(cubes_1)
@assert length(sizes) == 5
res = fill(0.0, sizes)
for i in range(1,sizes[1])
for j in range(1,sizes[2])
Threads.@threads for k in range(1,64)
for l in range(1, 64)
for m in range(1, 64)
res[i,j,k,l,m] = max(cubes_1[i,j,k,l,m], cubes_2[i,j,k,l,m])
end
end
end
end
end
res
end
index_0 = findfirst(isequal(0), eaps)
index_12 = findfirst(isequal(12), eaps)
index_13 = findfirst(isequal(13), eaps)
index_14 = findfirst(isequal(14), eaps)
cube_max_13_14 = cube_max(cubes[index_13,:,:,:,:,:], cubes[index_14,:,:,:,:,:])
function do_cubes(name, cubes)
cube_list = []
index_list = []
for type in range(1,length(types))
for method in range(1,3)
push!(cube_list, cubes[type,method,:,:,:])
push!(index_list, (type, method))
end
end
allgraphs = cube_flatten_z(cube_list)
for (i,(type,method)) in enumerate(index_list)
graph2d(string(name, "_", types[type], "2_", methods[method], "_AllProbes"), allgraphs[i], "i", "j")
for slice in diff_slices_offset_0
graph2d(string(name,"_", types[type], "2_", methods[method], "_Slice_", slice), cubes[type, method, slice+1,:,:], "j", "probe")
end
end
end
graph_13_14 = @task begin
do_cubes("julia_max_13_14", cube_max_13_14)
#cube_list = []
#index_list = []
#for type in range(1,length(types))
# for method in range(1,3)
# push!(cube_list, cube_max_13_14[type,method,:,:,:])
# push!(index_list, (type, method))
# end
#end
#allgraphs = cube_flatten_z(cube_list)
#for (i,(type,method)) in enumerate(index_list)
# graph2d(string("julia_max_13_14_", types[type], "2_", methods[method], "_AllProbes"), allgraphs[i], "i", "j")
#end
end
schedule(graph_13_14)
print(" OK\n")
print("Computing Any difference between 0 and 12...")
function cube_differences(cubes_1, cubes_2)
@assert size(cubes_1) == size(cubes_2)
sizes = size(cubes_1)
@assert length(sizes) == 5
res = fill(0.0, sizes)
for i in range(1,sizes[1])
for j in range(1,sizes[2])
Threads.@threads for k in range(1,64)
for l in range(1, 64)
for m in range(1, 64)
res[i,j,k,l,m] = abs(cubes_1[i,j,k,l,m] - cubes_2[i,j,k,l,m])
end
end
end
end
end
res
end
cube_diff_0_12 = cube_differences(cubes[index_0,:,:,:,:,:], cubes[index_12,:,:,:,:,:])
graph_0_12 = @task begin
do_cubes("julia_diff_0_12", cube_diff_0_12)
#cube_list = []
#index_list = []
#for type in range(1,length(types))
# for method in range(1,3)
# push!(cube_list, cube_diff_0_12[type,method,:,:,:])
# push!(index_list, (type, method))
# end
#end
#allgraphs = cube_flatten_z(cube_list)
#for (i,(type,method)) in enumerate(index_list)
# graph2d(string("julia_diff_0_12_", types[type], "2_", methods[method], "_AllProbes"), allgraphs[i], "i", "j")
#end
end
schedule(graph_0_12)
print(" OK\n")
print("Computing Differences between 12 and (13 union 14)...")
cube_diff_12_1314 = cube_differences(cubes[index_0,:,:,:,:,:], cube_max_13_14)
graph_12_1314 = @task begin
do_cubes("julia_diff_12_1314", cube_diff_12_1314)
#cube_list = []
#index_list = []
#for type in range(1,length(types))
# for method in range(1,3)
# push!(cube_list, cube_diff_12_1314[type,method,:,:,:])
# push!(index_list, (type, method))
# end
#end
#allgraphs = cube_flatten_z(cube_list)
#for (i,(type,method)) in enumerate(index_list)
# graph2d(string("julia_diff_12_1314", types[type], "2_", methods[method], "_AllProbes"), allgraphs[i], "i", "j")
# for slice in diff_slices_offset_0
#
# end
#end
end
schedule(graph_12_1314)
wait(graph_13_14)
wait(graph_0_12)
wait(graph_12_1314)
print("done\n")
end