Remove analyse_reorder.py
This commit is contained in:
parent
93b1f969db
commit
af9324ae1b
@ -1,177 +0,0 @@
|
|||||||
import os
|
|
||||||
import sys
|
|
||||||
import argparse
|
|
||||||
import itertools
|
|
||||||
from multiprocessing import Pool
|
|
||||||
|
|
||||||
import numpy as np
|
|
||||||
import pandas as pd
|
|
||||||
import seaborn as sns
|
|
||||||
from scipy import optimize
|
|
||||||
import matplotlib.pyplot as plt
|
|
||||||
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
prog=sys.argv[0],
|
|
||||||
)
|
|
||||||
parser.add_argument("path", help="Path to the experiment files")
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
|
|
||||||
assert os.path.exists(args.path + ".stats.csv")
|
|
||||||
assert os.path.exists(args.path + ".cores.csv")
|
|
||||||
|
|
||||||
stats = pd.read_csv(
|
|
||||||
args.path + ".stats.csv",
|
|
||||||
dtype={
|
|
||||||
"main_core": np.int8,
|
|
||||||
"helper_core": np.int8,
|
|
||||||
# "address": int,
|
|
||||||
"hash": np.int8,
|
|
||||||
# "time": np.int16,
|
|
||||||
"clflush_remote_hit": np.float64,
|
|
||||||
"clflush_shared_hit": np.float64,
|
|
||||||
# "clflush_miss_f": np.int32,
|
|
||||||
# "clflush_local_hit_f": np.int32,
|
|
||||||
"clflush_miss_n": np.float64,
|
|
||||||
"clflush_local_hit_n": np.float64,
|
|
||||||
# "reload_miss": np.int32,
|
|
||||||
# "reload_remote_hit": np.int32,
|
|
||||||
# "reload_shared_hit": np.int32,
|
|
||||||
# "reload_local_hit": np.int32
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
core_mapping = pd.read_csv(args.path + ".cores.csv")
|
|
||||||
|
|
||||||
cores = list(stats["main_core"].unique())
|
|
||||||
slices = list(stats["hash"].unique())
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def slice_reorder(df, fst_slice, params=None):
|
|
||||||
if params is None:
|
|
||||||
params = ["clflush_miss_n", "clflush_remote_hit"]
|
|
||||||
|
|
||||||
keys = slices.copy()
|
|
||||||
sliced_df = {
|
|
||||||
i : df[(df["hash"] == i)] for i in keys
|
|
||||||
}
|
|
||||||
|
|
||||||
def distance(df1, df2):
|
|
||||||
dist = 0
|
|
||||||
for param in params:
|
|
||||||
for core, helper in itertools.product(cores, cores):
|
|
||||||
med1 = df1[(df1["main_core"] == core) & (df1["helper_core"] == helper)][param].median()
|
|
||||||
med2 = df2[(df2["main_core"] == core) & (df2["helper_core"] == helper)][param].median()
|
|
||||||
dist += (med1 - med2)**2
|
|
||||||
|
|
||||||
return dist
|
|
||||||
|
|
||||||
def find_nearest(slice):
|
|
||||||
distances = { i : distance(sliced_df[slice], sliced_df[i]) for i in keys}
|
|
||||||
nearest = sorted(keys, key=lambda x: distances[x])[0]
|
|
||||||
return nearest, distances[nearest]
|
|
||||||
|
|
||||||
new_reorder = [fst_slice]
|
|
||||||
total_dist = 0
|
|
||||||
keys.remove(fst_slice)
|
|
||||||
for i in range(len(slices)-1):
|
|
||||||
next, dist = find_nearest(new_reorder[-1])
|
|
||||||
total_dist += dist
|
|
||||||
new_reorder.append(next)
|
|
||||||
keys.remove(next)
|
|
||||||
|
|
||||||
print("slice_group")
|
|
||||||
print("\n".join([
|
|
||||||
str(new_reorder.index(i)) for i in range(len(slices))
|
|
||||||
]))
|
|
||||||
|
|
||||||
return total_dist
|
|
||||||
|
|
||||||
|
|
||||||
def core_reorder(df, fst_core, params=None, position="both", lcores=None):
|
|
||||||
"""
|
|
||||||
Find a core ordering that minimizes the distance from each to the adjacents
|
|
||||||
- df : panda dataframe
|
|
||||||
- fst_core : first core to use in the ordering
|
|
||||||
- params : columns to use (clflush_miss_n, clflush_remote_hit, ...)
|
|
||||||
- position : both, helper, or main
|
|
||||||
- lcores : subset of cores to reorder (eg 1 socket only)
|
|
||||||
"""
|
|
||||||
from_main = False
|
|
||||||
from_helper = False
|
|
||||||
if position == "both":
|
|
||||||
from_main = True
|
|
||||||
from_helper = True
|
|
||||||
elif position == "helper":
|
|
||||||
from_helper = True
|
|
||||||
elif position == "main":
|
|
||||||
from_main = True
|
|
||||||
|
|
||||||
if params is None:
|
|
||||||
params = ["clflush_miss_n", "clflush_remote_hit"]
|
|
||||||
|
|
||||||
|
|
||||||
if lcores is None:
|
|
||||||
lcores = cores.copy()
|
|
||||||
|
|
||||||
lcores.sort()
|
|
||||||
keys = lcores.copy()
|
|
||||||
print(keys)
|
|
||||||
main_sliced_df = {
|
|
||||||
i : df[(df["main_core"] == i)] for i in keys
|
|
||||||
}
|
|
||||||
helper_sliced_df = {
|
|
||||||
i : df[(df["helper_core"] == i)] for i in keys
|
|
||||||
}
|
|
||||||
|
|
||||||
def distance(df1, df2, is_main=True):
|
|
||||||
dist = 0
|
|
||||||
for param in params:
|
|
||||||
for hash, core in itertools.product(slices, lcores):
|
|
||||||
col = "main_core"
|
|
||||||
if is_main:
|
|
||||||
col ="helper_core"
|
|
||||||
|
|
||||||
med1 = df1[(df1["hash"] == hash) & (df1[col] == core)][param].median()
|
|
||||||
med2 = df2[(df2["hash"] == hash) & (df2[col] == core)][param].median()
|
|
||||||
dist += (med1 - med2)**2
|
|
||||||
|
|
||||||
return dist
|
|
||||||
|
|
||||||
def find_nearest(slice):
|
|
||||||
distances = { i : 0 for i in keys}
|
|
||||||
for i in distances:
|
|
||||||
if from_main:
|
|
||||||
distances[i] += distance(main_sliced_df[fst_core], main_sliced_df[i], is_main=True)
|
|
||||||
if from_helper:
|
|
||||||
distances[i] += distance(helper_sliced_df[fst_core], helper_sliced_df[i], is_main=False)
|
|
||||||
|
|
||||||
nearest = sorted(keys, key=lambda x: distances[x])[0]
|
|
||||||
return nearest, distances[nearest]
|
|
||||||
|
|
||||||
new_reorder = [fst_core]
|
|
||||||
total_dist = 0
|
|
||||||
keys.remove(fst_core)
|
|
||||||
for i in range(len(lcores)-1):
|
|
||||||
next, dist = find_nearest(new_reorder[-1])
|
|
||||||
total_dist += dist
|
|
||||||
new_reorder.append(next)
|
|
||||||
keys.remove(next)
|
|
||||||
|
|
||||||
print("core")
|
|
||||||
print("\n".join([
|
|
||||||
str(lcores[new_reorder.index(i)]) for i in lcores
|
|
||||||
]))
|
|
||||||
return total_dist
|
|
||||||
|
|
||||||
|
|
||||||
for hash in slices:
|
|
||||||
res = slice_reorder(stats, hash)
|
|
||||||
print(f"hash: {hash}, total dist: {res}")
|
|
||||||
|
|
||||||
half = len(cores)/2
|
|
||||||
for core in cores:
|
|
||||||
res = core_reorder(stats, core, lcores=[k for k in cores if (k//half == core//half)])
|
|
||||||
print(f"core: {core}, total dist: {res}")
|
|
Loading…
Reference in New Issue
Block a user