From b69c9050f56c21cdc8dd91881d28d9b7320f8b3f Mon Sep 17 00:00:00 2001 From: Carlos Gutierrez Date: Sat, 4 Oct 2025 22:05:52 -0400 Subject: [PATCH] Modifying scripts --- scripts/11_run_all.sh | 23 ------------- scripts/40_energy_post.py | 63 ++++++++++++++++++----------------- scripts/50_plot_epi.py | 42 ++++++++++++----------- scripts/51_plot_edp_tinyml.py | 37 +++++++++++--------- scripts/70_diff_table.py | 47 ++++++++++++++++---------- 5 files changed, 106 insertions(+), 106 deletions(-) delete mode 100755 scripts/11_run_all.sh diff --git a/scripts/11_run_all.sh b/scripts/11_run_all.sh deleted file mode 100755 index 9e2c6d5..0000000 --- a/scripts/11_run_all.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -set -eu -. "$(dirname "$0")/env.sh" - -run_case () { - W=$1; CORE=$2; DV=$3; D=$4; L2=$5 - sh "$(dirname "$0")/run_one.sh" "$W" "$CORE" "$DV" "$D" "$L2" 16GB -} - -for W in tinyml_kws sensor_fusion aes_ccm attention_kernel; do - for DV in high low; do - for D in 0 1; do - for L2 in 512kB 1MB; do - run_case "$W" big "$DV" "$D" "$L2" - run_case "$W" little "$DV" "$D" "$L2" - run_case "$W" hybrid "$DV" "$D" "$L2" - done - done - done -done - -echo "[run_all] ALL DONE" - diff --git a/scripts/40_energy_post.py b/scripts/40_energy_post.py index 57d6e7a..9e50ec4 100755 --- a/scripts/40_energy_post.py +++ b/scripts/40_energy_post.py @@ -1,48 +1,51 @@ #!/usr/bin/env python3 -import csv, os, sys +import csv +import os ROOT = "/home/carlos/projects/gem5" OUT_DATA = os.path.join(ROOT, "gem5-data", "SmartEdgeAI", "results") -OUT_IOT = os.path.join(ROOT, "iot", "results") +OUT_IOT = os.path.join(ROOT, "iot", "results") src = os.path.join(OUT_DATA, "summary.csv") dst_data = os.path.join(OUT_DATA, "summary_energy.csv") -dst_iot = os.path.join(OUT_IOT, "summary_energy.csv") +dst_iot = os.path.join(OUT_IOT, "summary_energy.csv") -# modeling constants (document in your Methods) -EPI_PJ = {'big':200.0,'little':80.0,'hybrid':104.0} # pJ/inst -E_MEM_PJ = 600.0 # pJ per L2 miss -DROWSY_SCALE = 0.85 # 15% energy drop when drowsy=1 +# Your model constants (document in Methods) +EPI_PJ = {"big": 200.0, "little": 80.0, "hybrid": 104.0} +E_MEM_PJ = 600.0 +DROWSY_SCALE = 0.85 -rows=[] +rows = [] with open(src) as f: - r=csv.DictReader(f) + r = csv.DictReader(f) for row in r: - insts=float(row['insts']) - secs=float(row['sim_seconds']) - core=row['core']; drowsy=int(row['drowsy']) - epi=EPI_PJ.get(core, EPI_PJ['little']) - mr=float(row['l2_miss_rate']) if row['l2_miss_rate'] else 0.0 + insts = float(row["insts"]) + secs = float(row["sim_seconds"]) + core = row["core"] + drowsy = int(row["drowsy"]) + epi = EPI_PJ.get(core, EPI_PJ["little"]) + mr = float(row["l2_miss_rate"]) if row["l2_miss_rate"] else 0.0 l2_misses = mr * insts - energy_J = (epi*1e-12)*insts + (E_MEM_PJ*1e-12)*l2_misses - if drowsy==1: - energy_J *= DROWSY_SCALE + energy = (epi * 1e-12) * insts + (E_MEM_PJ * 1e-12) * l2_misses + if drowsy == 1: + energy *= DROWSY_SCALE + power = energy / secs if secs > 0 else 0.0 + edp = energy * secs - power_W = energy_J/secs if secs>0 else 0.0 - edp = energy_J * secs # J*s - - row.update({ - 'energy_J': f"{energy_J:.6f}", - 'power_W': f"{power_W:.6f}", - 'edp': f"{edp:.6e}", - 'epi_model_pJ': f"{epi:.1f}", - }) + row.update( + { + "energy_J": f"{energy:.6f}", + "power_W": f"{power:.6f}", + "edp": f"{edp:.6e}", + "epi_model_pJ": f"{epi:.1f}", + } + ) rows.append(row) for path in (dst_data, dst_iot): - with open(path, 'w', newline='') as f: - w=csv.DictWriter(f, fieldnames=list(rows[0].keys())) - w.writeheader(); w.writerows(rows) + with open(path, "w", newline="") as f: + w = csv.DictWriter(f, fieldnames=list(rows[0].keys())) + w.writeheader() + w.writerows(rows) print(f"[energy] wrote {dst_data} and mirrored to {dst_iot}") - diff --git a/scripts/50_plot_epi.py b/scripts/50_plot_epi.py index b0146b6..f6d95b9 100755 --- a/scripts/50_plot_epi.py +++ b/scripts/50_plot_epi.py @@ -1,30 +1,34 @@ #!/usr/bin/env python3 -import os, csv -import matplotlib.pyplot as plt +import csv +import os from collections import defaultdict -ROOT="/home/carlos/projects/gem5" -OUT_DATA=os.path.join(ROOT,"gem5-data","SmartEdgeAI","results") -OUT_IOT =os.path.join(ROOT,"iot","results") -src=os.path.join(OUT_DATA,"summary_energy.csv") -out_data=os.path.join(OUT_DATA,"fig_epi_across_workloads.png") -out_iot =os.path.join(OUT_IOT ,"fig_epi_across_workloads.png") +import matplotlib.pyplot as plt -epi_by_core=defaultdict(list) +ROOT = "/home/carlos/projects/gem5" +OUT_DATA = os.path.join(ROOT, "gem5-data", "SmartEdgeAI", "results") +OUT_IOT = os.path.join(ROOT, "iot", "results") +src = os.path.join(OUT_DATA, "summary_energy.csv") +out_data = os.path.join(OUT_DATA, "fig_epi_across_workloads.png") +out_iot = os.path.join(OUT_IOT, "fig_epi_across_workloads.png") + +epi_by_core = defaultdict(list) with open(src) as f: - r=csv.DictReader(f) + r = csv.DictReader(f) for row in r: - insts=float(row['insts']); energy=float(row['energy_J']) - epi = 1e12*energy/insts if insts>0 else 0.0 - epi_by_core[row['core']].append(epi) + insts = float(row["insts"]) + energy = float(row["energy_J"]) + epi = 1e12 * energy / insts if insts > 0 else 0.0 + epi_by_core[row["core"]].append(epi) -cores=['big','little','hybrid'] -vals=[sum(epi_by_core[c])/max(1,len(epi_by_core[c])) for c in cores] +cores = ["big", "little", "hybrid"] +vals = [sum(epi_by_core[c]) / max(1, len(epi_by_core[c])) for c in cores] plt.figure() plt.bar(cores, vals) -plt.ylabel('EPI (pJ/inst)') -plt.title('Energy per Instruction across workloads (avg by core mode)') -plt.tight_layout(); plt.savefig(out_data); plt.savefig(out_iot) +plt.ylabel("EPI (pJ/inst)") +plt.title("Energy per Instruction across workloads (avg by core mode)") +plt.tight_layout() +plt.savefig(out_data) +plt.savefig(out_iot) print(f"[plot] wrote {out_data} and mirrored to {out_iot}") - diff --git a/scripts/51_plot_edp_tinyml.py b/scripts/51_plot_edp_tinyml.py index 8df3670..6b33098 100755 --- a/scripts/51_plot_edp_tinyml.py +++ b/scripts/51_plot_edp_tinyml.py @@ -1,27 +1,32 @@ #!/usr/bin/env python3 -import os, csv +import csv +import os + import matplotlib.pyplot as plt -ROOT="/home/carlos/projects/gem5" -OUT_DATA=os.path.join(ROOT,"gem5-data","SmartEdgeAI","results") -OUT_IOT =os.path.join(ROOT,"iot","results") -src=os.path.join(OUT_DATA,"summary_energy.csv") -out_data=os.path.join(OUT_DATA,"fig_tinyml_edp.png") -out_iot =os.path.join(OUT_IOT ,"fig_tinyml_edp.png") +ROOT = "/home/carlos/projects/gem5" +OUT_DATA = os.path.join(ROOT, "gem5-data", "SmartEdgeAI", "results") +OUT_IOT = os.path.join(ROOT, "iot", "results") +src = os.path.join(OUT_DATA, "summary_energy.csv") +out_data = os.path.join(OUT_DATA, "fig_tinyml_edp.png") +out_iot = os.path.join(OUT_IOT, "fig_tinyml_edp.png") -labels=[]; edps=[] +labels = [] +edps = [] with open(src) as f: - r=csv.DictReader(f) + r = csv.DictReader(f) for row in r: - if row['workload']!='tinyml_kws': continue + if row["workload"] != "tinyml_kws": + continue labels.append(f"{row['core']}-{row['dvfs']}-L2{row['l2']}-d{row['drowsy']}") - edps.append(float(row['edp'])) + edps.append(float(row["edp"])) plt.figure() plt.bar(labels, edps) -plt.ylabel('EDP (J·s)') -plt.title('TinyML: EDP by configuration') -plt.xticks(rotation=60, ha='right') -plt.tight_layout(); plt.savefig(out_data); plt.savefig(out_iot) +plt.ylabel("EDP (J·s)") +plt.title("TinyML: EDP by configuration") +plt.xticks(rotation=60, ha="right") +plt.tight_layout() +plt.savefig(out_data) +plt.savefig(out_iot) print(f"[plot] wrote {out_data} and mirrored to {out_iot}") - diff --git a/scripts/70_diff_table.py b/scripts/70_diff_table.py index 14d10bc..90e6adf 100755 --- a/scripts/70_diff_table.py +++ b/scripts/70_diff_table.py @@ -1,34 +1,45 @@ #!/usr/bin/env python3 -import csv, os +import csv +import os + root = os.path.dirname(os.path.dirname(__file__)) src = os.path.join(root, "results", "phase3_summary_energy.csv") dst = os.path.join(root, "results", "phase3_drowsy_deltas.csv") # group by key without drowsy; compare d0 vs d1 from collections import defaultdict + bykey = defaultdict(dict) with open(src) as f: - r=csv.DictReader(f) + r = csv.DictReader(f) for row in r: - key = (row['workload'], row['core'], row['dvfs'], row['l2']) - bykey[key][row['drowsy']] = row + key = (row["workload"], row["core"], row["dvfs"], row["l2"]) + bykey[key][row["drowsy"]] = row -rows=[] +rows = [] for k, d in bykey.items(): - if '0' in d and '1' in d: - a=d['0']; b=d['1'] - e0=float(a['energy_J']); e1=float(b['energy_J']) - edp0=float(a['edp']); edp1=float(b['edp']) - rows.append({ - 'workload':k[0],'core':k[1],'dvfs':k[2],'l2':k[3], - 'energy_drop_%': f"{100*(e0-e1)/e0:.2f}", - 'edp_drop_%': f"{100*(edp0-edp1)/edp0:.2f}" - }) + if "0" in d and "1" in d: + a = d["0"] + b = d["1"] + e0 = float(a["energy_J"]) + e1 = float(b["energy_J"]) + edp0 = float(a["edp"]) + edp1 = float(b["edp"]) + rows.append( + { + "workload": k[0], + "core": k[1], + "dvfs": k[2], + "l2": k[3], + "energy_drop_%": f"{100*(e0-e1)/e0:.2f}", + "edp_drop_%": f"{100*(edp0-edp1)/edp0:.2f}", + } + ) -with open(dst,'w',newline='') as f: - w=csv.DictWriter(f, fieldnames=list(rows[0].keys())) - w.writeheader(); w.writerows(rows) +with open(dst, "w", newline="") as f: + w = csv.DictWriter(f, fieldnames=list(rows[0].keys())) + w.writeheader() + w.writerows(rows) print(f"[delta] wrote {dst}") -