Generate the aggregate report at workspace/aggregate_report.md.
(state: dict)
| 575 | |
| 576 | |
| 577 | def cmd_report(state: dict) -> None: |
| 578 | """Generate the aggregate report at workspace/aggregate_report.md.""" |
| 579 | _ensure_workspace() |
| 580 | kernels = state["kernels"] |
| 581 | plan = load_plan() |
| 582 | timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") |
| 583 | |
| 584 | lines: list[str] = [] |
| 585 | lines.append("# AutoKernel -- Aggregate Optimization Report") |
| 586 | lines.append("") |
| 587 | lines.append(f"Generated: {timestamp}") |
| 588 | lines.append("") |
| 589 | |
| 590 | # ---- Per-kernel summary table ---- |
| 591 | lines.append("## Per-Kernel Summary") |
| 592 | lines.append("") |
| 593 | lines.append("| Rank | Kernel | Op Type | Status | Baseline (TFLOPS) | Best (TFLOPS) | Speedup | Experiments | Kept | Keep Rate | Time (min) |") |
| 594 | lines.append("|------|--------|---------|--------|-------------------|---------------|---------|-------------|------|-----------|------------|") |
| 595 | |
| 596 | for k in kernels: |
| 597 | kname = Path(k["file"]).name |
| 598 | baseline_str = f"{k['baseline_tflops']:.2f}" if k["baseline_tflops"] is not None else "--" |
| 599 | best_str = f"{k['best_tflops']:.2f}" if k["best_tflops"] is not None else "--" |
| 600 | speedup_str = f"{k['speedup']:.2f}x" if k["speedup"] is not None else "--" |
| 601 | exp_run = k["experiments_run"] |
| 602 | exp_kept = k["experiments_kept"] |
| 603 | keep_rate = f"{exp_kept / exp_run * 100:.0f}%" if exp_run > 0 else "--" |
| 604 | minutes = k["time_spent_minutes"] |
| 605 | status = _STATUS_DISPLAY.get(k["status"], k["status"]) |
| 606 | lines.append( |
| 607 | f"| {k['rank']} | {kname} | {k['op_type']} | {status} | {baseline_str} | " |
| 608 | f"{best_str} | {speedup_str} | {exp_run} | {exp_kept} | {keep_rate} | {minutes} |" |
| 609 | ) |
| 610 | lines.append("") |
| 611 | |
| 612 | # ---- Aggregate speedup ---- |
| 613 | agg = estimate_aggregate_speedup(kernels) |
| 614 | lines.append("## Aggregate Model Speedup (Amdahl's Law)") |
| 615 | lines.append("") |
| 616 | if agg > 1.0: |
| 617 | lines.append(f"**Estimated end-to-end model speedup: {agg:.2f}x**") |
| 618 | else: |
| 619 | lines.append("No measurable aggregate speedup yet.") |
| 620 | lines.append("") |
| 621 | |
| 622 | # Breakdown |
| 623 | lines.append("Breakdown by kernel (fraction of total GPU time):") |
| 624 | lines.append("") |
| 625 | for k in kernels: |
| 626 | pct = k.get("pct_total", 0) |
| 627 | speedup = k.get("speedup") |
| 628 | kname = Path(k["file"]).name |
| 629 | if pct > 0: |
| 630 | speedup_str = f"{speedup:.2f}x" if speedup and speedup > 1.0 else "1.00x" |
| 631 | saved = pct * (1 - 1 / speedup) if speedup and speedup > 1.0 else 0.0 |
| 632 | lines.append(f"- **{kname}**: {pct:.1f}% of GPU time, {speedup_str} speedup ({saved:.1f}% time saved)") |
| 633 | lines.append("") |
| 634 |
no test coverage detected