99 lines
2.9 KiB
Bash
Executable File
99 lines
2.9 KiB
Bash
Executable File
#!/bin/bash
|
|
set -eu
|
|
|
|
# Configuration
|
|
ROOT="${1:-${PWD}/results}"
|
|
OUTPUT_FILE="${2:-}"
|
|
|
|
# Function to print header
|
|
print_header() {
|
|
printf "%-6s %8s %12s %12s %12s %12s %12s %12s %s\n" \
|
|
"Config" "IPC" "CPI" "L1D MPKI" "L1I MPKI" "L2 MPKI" "Br MPKI" "Cache Util%" "Per-thread Stats"
|
|
printf "%-6s %8s %12s %12s %12s %12s %12s %12s %s\n" \
|
|
"------" "---" "---" "---------" "---------" "---------" "---------" "---------" "---------------"
|
|
}
|
|
|
|
# Function to analyze a single configuration
|
|
analyze_config() {
|
|
local D="$1"
|
|
local S="$D/stats.txt"
|
|
local Cfg=$(basename "$D")
|
|
|
|
if [ ! -s "$S" ]; then
|
|
printf "%-6s %8s %12s %12s %12s %12s %12s %12s %s\n" \
|
|
"$Cfg" "-" "-" "-" "-" "-" "-" "-" "-" "RUNNING/EMPTY"
|
|
return
|
|
fi
|
|
|
|
awk -v CFG="$Cfg" '
|
|
BEGIN {
|
|
I=C=Dm=Im=L2m=Bm=Bl=0
|
|
L1D_hits=L1D_misses=L1I_hits=L1I_misses=L2_hits=L2_misses=0
|
|
delete T
|
|
}
|
|
/^simInsts/ {I=$2}
|
|
/system\.cpu\.numCycles/ {C=$2}
|
|
/system\.l1d\.overall_misses::total/ {Dm=$2}
|
|
/system\.l1i\.overall_misses::total/ {Im=$2}
|
|
/system\.l2\.overall_misses::total/ {L2m=$2}
|
|
/branchPred\.mispredictions/ {Bm=$2}
|
|
/branchPred\.lookups/ {Bl=$2}
|
|
/system\.l1d\.overall_hits::total/ {L1D_hits=$2}
|
|
/system\.l1i\.overall_hits::total/ {L1I_hits=$2}
|
|
/system\.l2\.overall_hits::total/ {L2_hits=$2}
|
|
/commit\.committedInsts::([0-9]+)/ {tid=$1; gsub(/.*::/,"",tid); T[tid]=$2}
|
|
END{
|
|
# Calculate metrics
|
|
ipc=(C>0)? I/C : 0;
|
|
cpi=(I>0)? C/I : 0;
|
|
dmpki=(I>0)? 1000*Dm/I : 0;
|
|
impki=(I>0)? 1000*Im/I : 0;
|
|
l2mpki=(I>0)? 1000*L2m/I : 0;
|
|
bmpki=(I>0)? 1000*Bm/I : 0;
|
|
|
|
# Calculate cache utilization
|
|
l1d_total=L1D_hits+L1D_misses;
|
|
l1d_util=(l1d_total>0)? (L1D_hits/l1d_total)*100 : 0;
|
|
|
|
# Format per-thread counts
|
|
out="";
|
|
thread_count=0;
|
|
for (t in T) {
|
|
if (thread_count>0) out = out " ";
|
|
out = out "t" t "=" T[t];
|
|
thread_count++;
|
|
}
|
|
if (thread_count==0) out="single-thread";
|
|
|
|
printf "%-6s %8.3f %12.2f %12.2f %12.2f %12.2f %12.2f %12.1f %s\n",
|
|
CFG, ipc, cpi, dmpki, impki, l2mpki, bmpki, l1d_util, out;
|
|
}' "$S"
|
|
}
|
|
|
|
# Main execution
|
|
if [ -n "$OUTPUT_FILE" ]; then
|
|
exec > "$OUTPUT_FILE"
|
|
fi
|
|
|
|
echo "SMT Performance Analysis Report"
|
|
echo "Generated: $(date)"
|
|
echo "Results directory: $ROOT"
|
|
echo ""
|
|
|
|
print_header
|
|
|
|
# Process all configuration directories
|
|
for D in "$ROOT"/*; do
|
|
[ -d "$D" ] || continue
|
|
analyze_config "$D"
|
|
done | sort
|
|
|
|
echo ""
|
|
echo "Legend:"
|
|
echo " IPC = Instructions Per Cycle"
|
|
echo " CPI = Cycles Per Instruction"
|
|
echo " MPKI = Misses Per Kilo Instructions"
|
|
echo " Cache Util% = L1D Cache Hit Rate"
|
|
echo " Per-thread Stats = Instructions committed per thread"
|
|
|