Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
00e67b0
datadeps: fix _eft_runtime_ns view() on Tuple fargs
riteshbhirud Jul 17, 2026
80df355
datadeps: cache hierarchical schedules; fix similar; fix JuMPExt import
riteshbhirud Jul 17, 2026
53b61ae
datadeps: add wall-clock time_limit_sec to IG, SA, OptimizingScheduler
riteshbhirud Jul 18, 2026
029e9c1
bench: fix TimedScheduler under hierarchical partitioning
riteshbhirud Jul 18, 2026
325dc0b
sch: remove hardcoded task_xfer_cost forcing master-only dispatch
riteshbhirud Jul 19, 2026
2fafa73
sch: batch per-signature runtime lookup in estimate_task_costs!
riteshbhirud Jul 19, 2026
02fa4e1
sch: reuse SignatureRuntimeIndex in has_capacity to avoid a second O(…
riteshbhirud Jul 19, 2026
cfa836e
datadeps: propagate AOT-computed runtime as options.time_util so has_…
riteshbhirud Jul 19, 2026
2cc2208
bench: distribute workload tiles across processors so datadeps places…
riteshbhirud Jul 19, 2026
179c866
bench: interleave _placement_procs across pids to avoid nt-dependent …
riteshbhirud Jul 19, 2026
be0eea8
bench: remove ExactScope pinning from _distribute_tile so schedulers …
riteshbhirud Jul 19, 2026
b2f4bc4
datadeps: route AOT scheduler decisions into hierarchical partitioning
riteshbhirud Jul 19, 2026
5037b44
datadeps: assert build_aliasing_parallel result length matches input …
riteshbhirud Jul 19, 2026
9378807
datadeps: local results in build_aliasing_parallel Threads.@spawn to …
riteshbhirud Jul 19, 2026
3102efd
comments: trim verbose comments across hierarchical/scheduling/sch
riteshbhirud Jul 19, 2026
6814e9b
bench: stream RunResult rows to CSV incrementally + isolate per-cell …
riteshbhirud Jul 19, 2026
fa4eadf
JuMPExt: K-guard converts HiGHS setup overflow into a clean Schedulin…
riteshbhirud Jul 19, 2026
257e8f8
JuMPExt: reframe K-guard as optimality-tractability boundary, not sol…
riteshbhirud Jul 19, 2026
d39b1b5
bench: CPU+GPU heterogeneous support and Sinnen-Sousa random DAG work…
riteshbhirud Jul 20, 2026
c6b7b74
bench: tile ownership restricted to CPU procs; task-time HtoD path only
riteshbhirud Jul 20, 2026
b8afecb
bench: GPU-forced warmup pass to prime cost model before Greedy runs
riteshbhirud Jul 20, 2026
58a8941
datadeps: GC.@preserve from_raw/to_raw in RemainderAliasing move!
riteshbhirud Jul 20, 2026
3a7bcb2
datadeps+bench: instrumentation for cross-GPU unsafe_free! + single-G…
riteshbhirud Jul 20, 2026
9229585
CUDAExt+ROCExt: synchronize device before unsafe_free! to fix cross-G…
riteshbhirud Jul 20, 2026
de008ce
datadeps: fix free-task syncdep gap in hierarchical partitioning
Jul 20, 2026
383c151
bench: bound MetricsTracker cache to prevent write-path degradation
Jul 20, 2026
845e0ef
MetricsTracker/Sch: Optimize metric insertion
jpsamaroo Jul 20, 2026
9a57097
Sch: Optimize steal allocations
jpsamaroo Jul 20, 2026
8d198c2
Sch: Optimize processor queue kick
jpsamaroo Jul 20, 2026
b957755
Sch: Optimize do_task move
jpsamaroo Jul 20, 2026
23fb03d
datadeps: K-slot capacity-aware EFT for multi-stream processors
Jul 20, 2026
e5cbcc3
Merge branch 'fix-eft-runtime-tuple-fargs' of https://github.com/rite…
Jul 20, 2026
0601649
bench: scope datadeps regions to all procs so GPUs reach the scheduler
Jul 20, 2026
7556885
bench: add tiled LU workload
Jul 20, 2026
4289c3b
datadeps: fix EFT signature mismatch that flattened the cost model
Jul 20, 2026
e453fdd
datadeps: translate sig for GPU cost lookup so post-dispatch metrics …
Jul 20, 2026
e490572
metrics: make cache bound runtime-settable via metrics_cache_max_tasks!
Jul 20, 2026
ed80723
datadeps: record FromSpace/ToSpace/MoveSize metrics at move! executio…
Jul 20, 2026
2f3461f
datadeps: median-of-per-move-rates aggregation in metrics_lookup_move…
Jul 20, 2026
6382a52
datadeps: stochastic reconstruction for IteratedGreedy (was determini…
Jul 21, 2026
4ab6d4e
datadeps: faithful Ruiz-Stützle acceptance + destruction for Iterated…
Jul 21, 2026
6940851
datadeps: Orsila SA tuning — k=2 temperature range + ECP critical-pat…
Jul 21, 2026
389f222
datadeps: producer-finish term in greedy data-ready (critical-path aw…
Jul 21, 2026
a39797b
bench: paper Table-1 grid harness + MILP-objective instrumentation
Jul 21, 2026
673bff9
bench: Tuolumne MI300a one-shot benchmark (M1/M2/M4 + optgap + cache …
Jul 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions bench/datadeps_schedulers/Project.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[deps]
CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
Dagger = "d58978e5-989f-55fb-8d15-ea34adc7bf54"
HiGHS = "87dc4568-4c63-4d18-b0c0-bb2238e4078b"
JuMP = "4076af6c-e467-56ae-b986-b466b2749572"
102 changes: 102 additions & 0 deletions bench/datadeps_schedulers/TUOLUMNE_README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# Tuolumne MI300a one-shot benchmark

One Julia session produces every number the paper needs for Tuolumne coverage:
single-node (M1), 2-node (M2), and 4-node (M4) MI300a APU regimes, for two
workloads × three tile counts × five schedulers × seven seeds, plus a post-hoc
optimality-gap pass and a schedule-cache demonstration.

You run it **once**. There are no re-runs — validate with `--smoke` first.

---

## 1. Prerequisites (do these on a login node, with network)

1. **Check out the paper branch** at the pinned commit. The script verifies at
startup that these four scheduler commits are in `HEAD` (matched by subject,
so a rehash is fine) and aborts with a clear message if any is missing:
- "stochastic reconstruction for IteratedGreedy"
- "faithful Ruiz-Stützle acceptance …"
- "Orsila SA tuning …"
- "producer-finish term in greedy …"
plus the MILP-objective instrumentation (`JuMPExt.LAST_MILP_SOLVE`).

2. **ROCm + AMDGPU.jl.** ROCm ≥ 6.0 (MI300a needs a recent ROCm; match what your
AMDGPU.jl build expects — `AMDGPU.versioninfo()` should show your APUs). The
script uses `AMDGPU` as the GPU backend and Dagger's ROCExt.

3. **Instantiate the self-contained env** (developer-mode Dagger from this repo):
```bash
julia --project=bench/datadeps_schedulers/tuolumne_env \
-e 'using Pkg; Pkg.develop(path="."); Pkg.instantiate()'
```
After this, launch with **no** `--project` — the script activates the env
itself.

---

## 2. Recommended allocation

- **4 MI300a nodes**, **8 hours** wall-time (≈6 h expected; the margin covers
cold JIT and the 60 s IG/SA/MILP caps that dominate the large-K cells).
- Launch mechanism is **your call** — Flux Framework, Slurm, whatever Tuolumne
uses. The script does **not** spawn workers; it consumes whatever
`Dagger.all_processors()` reports and groups them into nodes by hostname, then
scopes M1/M2/M4 to the first 1/2/4 nodes. Start Julia with one Dagger worker
per node (each with all local CPU threads + the node's APU GPU visible), added
through Dagger's DistributedNext so Dagger can see them.
- If fewer than 4 nodes are available, the regimes that don't fit are skipped and
logged — M1 still runs on a single node.

---

## 3. Run — two commands, in order

**a) Smoke test (~30–60 s) — validate the stack before committing the full run:**
```bash
julia bench/datadeps_schedulers/tuolumne_oneshot.jl --smoke
```
It prints the detected topology (nodes / procs / APU GPUs), runs one cholesky
nt=2 cell with RR and Greedy end-to-end, and ends with a single line:
`SMOKE: PASS` or `SMOKE: FAIL`. **Do not proceed unless it PASSes and reports at
least one APU GPU.**

**b) Full grid (~6–8 h):**
```bash
julia bench/datadeps_schedulers/tuolumne_oneshot.jl
```
Progress prints per config/cell so you can see forward motion. Partial CSVs are
flushed every 5 minutes, so a wall-time expiry won't lose completed work. Any
single cell that fails (correctness residual over threshold, MILP exception,
worker crash) is caught, logged, marked in the CSV, and the run continues.

---

## 4. Output (lands in your invocation directory)

| File | Contents |
|---|---|
| `tuolumne_regime_m1_1node.csv` | M1 per-cell: wall_ms, aot_ms, residual, n_tasks, milp_status, milp_obj, bs, n_nodes |
| `tuolumne_regime_m2_2node.csv` | M2 per-cell (same columns) |
| `tuolumne_regime_m4_4node.csv` | M4 per-cell |
| `tuolumne_medians.csv` | per-cell medians + stddev over 7 seeds (feeds Table 1) |
| `tuolumne_optgap.csv` | AOT-only Greedy/IG/SA `cost_of_schedule` vs MILP-optimal, with ratio (headline optimality-gap) |
| `tuolumne_cache.csv` | schedule-cache demo: `aot_ms_first_call` vs `aot_ms_cache_hit` per regime |
| `tuolumne_run_summary.txt` | git SHA, launch/elapsed times, failure count, flagged cells, full log |

Notes:
- **bs**: 4096 for nt ∈ {2,4}; nt=8 tries 4096 first (MI300a's 128 GB unified
HBM3 may fit it) and falls back to 2048 on OOM — the actual bs is recorded per
cell and logged.
- **optgap**: only cells where MILP proved `OPTIMAL` (small K) contribute; that's
by design — a time-limited MILP is not a valid lower bound.
- **cache**: `aot_ms_cache_hit` should be ≈0 (structural-equivalence lookup). If
the two columns are similar, the cache isn't hitting on your Julia version —
flag it to us.

---

## 5. What to send back

All seven files above. If the smoke test failed, send `tuolumne_run_summary.txt`
(or the console output) and your `AMDGPU.versioninfo()` / ROCm version so we can
diagnose the stack before you spend the allocation.
Loading
Loading