Empirical Curve-fitting for HPC Optimization of DVFS
Lightweight DVFS controller that measures IPC curves to find optimal CPU frequency
"ECHO: Empirical Curve-fitting for HPC Optimization of DVFS" Target: SC or HPDC
ECHO dynamically adjusts CPU frequency by directly measuring the IPC curve — the relationship between CPU frequency and achieved throughput. Rather than classifying workloads or training ML models, ECHO probes IPC at 2-3 frequency points, fits a curve, and solves for the minimum frequency that maintains a configurable throughput target.
Key insight: You don't need to model why IPC changes with frequency. Just measure how much it changes, fit a curve, and find the knee.
How it works:
- Probe phase (~600ms): Measure IPC at 3 frequencies (f_ref, 0.85×f_ref, 0.70×f_ref)
- Fit: IPC(f) = af² + bf + c (quadratic least-squares)
- Solve: Find the lowest f where IPC(f) × f preserves target throughput
- Hold: Maintain f_opt, monitor MPKI for phase changes, re-probe when needed
ECHO operates as a standalone userspace daemon — no kernel modifications, no MPI integration, no application source code changes, no per-workload training.
- Curve quality — Does the 3-point quadratic IPC fit achieve R² > 0.99 across diverse HPC workloads?
- Energy savings — How much energy does ECHO save compared to Linux governors?
- Performance impact — What is the throughput degradation at R = 0.98?
- Phase detection — How accurately does MPKI-based detection identify workload changes?
- Platform portability — Does ECHO work across AMD Zen 2/3/4 without recalibration?
echo-dvfs/
├── README.md ← This file
├── PROPOSAL.md ← Research proposal / paper draft
├── figures/ ← Paper figures
├── docs/ ← Internal documentation
├── deploy/ ← Cluster/systemd deployment assets
├── src/
│ ├── daemon/c/ ← ECHO daemon (C)
│ │ ├── echo.h ← Core header
│ │ ├── main.c ← CLI
│ │ ├── pmc.c ← PMC reader (raw perf_event_open)
│ │ ├── freq.c ← Frequency control (cpufreq sysfs)
│ │ ├── curve_fitter.c ← IPC curve fitting
│ │ ├── daemon.c ← Two-phase control loop (probe + hold)
│ │ ├── collect.c ← Frequency sweep collector
│ │ └── Makefile
│ ├── daemon/README.md
│ └── tools/
│ ├── run_echo_experiment.sh ← Full experiment runner
│ ├── curve_analyzer.py ← IPC curve analysis & plots
│ ├── collect_pmc.py ← PMC data collection
│ ├── generate_synthetic.py ← Synthetic data generator
│ └── run_sweep.sh ← Standalone frequency sweep
├── experiments/ ← Experiment results
└── references/ ← Papers, articles, specs
# Build C daemon
cd src/daemon/c && make
# Dry-run test
./echo daemon --dry-run --duration 30 --verbose
# Frequency sweep (real hardware, needs root)
sudo bash src/tools/run_echo_experiment.sh --sweep-only --freqs 1500 2000 2500 3000
# Analyze sweep data
python3 src/tools/curve_analyzer.py -i experiments/run_*/sweep/parsed.csv -o analysis/
# Run daemon on real hardware
sudo ./echo daemon --duration 600 --log echo.csv --verbose
# Run daemon and log ECHO overhead/probe-time metrics
sudo ./echo daemon --duration 600 --log echo.csv --collect-overhead
# Full experiment (sweep + analysis + daemon + baseline)
sudo bash src/tools/run_echo_experiment.sh --all
# Cluster deployment package
# See deploy/systemd/README.md for the root-owned systemd service template
# and the per-job wrapper used from scheduler hooks or restricted sudo.
# Slurm per-job opt-in with overhead collection: sbatch --comment='ECHO=1,COLLECT_OVERHEAD=1' job.sh
# That also appends the final overhead summary to the job's Slurm stdout file.- Literature review (MCBound, GEOPM, DRL-DVFS, DVFO, Frontier study)
- Methodology design (empirical IPC curve fitting)
- Paper draft (all sections)
- C daemon implementation
- Experiment scripts
- Analysis tools (curve_analyzer.py)
- Real hardware experiments on AMD EPYC
- Paper revision with experimental results