Files
LithosAnanake/docs/working/archive/legacy/OPTIMIZATION_OPPORTUNITIES.md

421 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- Moved from docs/archive/OPTIMIZATION_OPPORTUNITIES.md to docs/working/archive/legacy/OPTIMIZATION_OPPORTUNITIES.md on 2026-06-16 (docs reorg Phase 2) -->
# StarForth Optimization Opportunities
## Bang for Buck + Implementation Difficulty Analysis
**Date:** 2025-11-19
**Context:** A_B_C_FULL + HEARTBEAT_ON is now the locked-in baseline configuration. Following opportunities are ordered by **value-to-difficulty ratio** (highest impact, lowest cost first).
---
## Quick Assessment Matrix
| Rank | Opportunity | Bang for Buck | Difficulty | Ratio | Est. Impact |
|------|-------------|---------------|-----------|-------|------------|
| 1 | Adaptive decay slope inference | ⭐⭐⭐⭐⭐ (High) | ⭐⭐ (Low) | **5:2 = 2.5** | 8-15% perf |
| 2 | Variance-based window width tuning | ⭐⭐⭐⭐ (High) | ⭐⭐ (Low) | **4:2 = 2.0** | 6-12% perf |
| 3 | Binary search slope fitting validation | ⭐⭐⭐ (Medium-High) | ⭐⭐⭐ (Medium) | **3:3 = 1.0** | 2-5% accuracy |
| 4 | Rolling window sizing experiment | ⭐⭐⭐⭐ (High) | ⭐⭐⭐ (Medium) | **4:3 = 1.33** | 5-8% perf |
| 5 | Decay rate parameter tuning | ⭐⭐⭐ (Medium-High) | ⭐⭐ (Low) | **3:2 = 1.5** | 3-6% perf |
| 6 | Hotwords cache threshold optimization | ⭐⭐⭐ (Medium-High) | ⭐⭐⭐ (Medium) | **3:3 = 1.0** | 2-4% perf |
| 7 | Speculative prefetch ML model | ⭐⭐⭐⭐⭐ (Very High) | ⭐⭐⭐⭐⭐ (Very High) | **5:5 = 1.0** | 15-30% perf |
| 8 | Kernel-aware memory placement | ⭐⭐⭐⭐ (High) | ⭐⭐⭐⭐ (Hard) | **4:4 = 1.0** | 10-20% perf |
| 9 | Dictionary reorganization (heat-aware) | ⭐⭐⭐ (Medium-High) | ⭐⭐⭐⭐ (Hard) | **3:4 = 0.75** | 3-5% perf |
| 10 | SIMD vectorization | ⭐⭐ (Medium) | ⭐⭐⭐⭐⭐ (Very Hard) | **2:5 = 0.4** | 5-10% perf |
---
## Tier 1: High ROI, Low Effort (Recommended Next)
### 1. Adaptive Decay Slope Inference ⭐⭐⭐⭐⭐
**What it is:**
Use closed-form linear regression on execution heat trajectory to dynamically optimize `decay_slope` (currently static at 0.33).
**Why it matters:**
- Decay slope controls how fast "cold" words fade from the hot-words cache
- Current fixed value (0.33) is a guess
- Optimal slope depends on workload's word frequency distribution
- **Potential gain:** 8-15% performance improvement
**Implementation Cost:**
- **Difficulty:** ⭐⭐ (Low-Medium)
- **Effort:** 4-6 hours
- **Files affected:** `src/inference_engine.c` (already designed in CLAUDE.md)
- **Testing:** Existing test suite validates without changes
**Why it's #1:**
- Already designed in CLAUDE.md (Adaptive Inference Engine Architecture)
- Q48.16 math library already complete
- Just needs empirical validation against different workload patterns
- DoE experiment can directly measure impact
**Next Step:** Create DoE with `DECAY_SLOPE` as a factor (e.g., 0.2, 0.33, 0.5, 0.7)
---
### 2. Variance-Based Window Width Tuning ⭐⭐⭐⭐
**What it is:**
Instead of fixed `ROLLING_WINDOW_SIZE=4096`, use variance inflection point to find optimal window automatically.
**Why it matters:**
- Window size controls how many executions we remember for adaptive decisions
- Currently static; should vary by workload
- Too small = noisy data; too large = stale data
- **Potential gain:** 6-12% performance improvement
**Implementation Cost:**
- **Difficulty:** ⭐⭐ (Low-Medium)
- **Effort:** 3-5 hours
- **Files affected:** `src/inference_engine.c` (variance inflection detection)
- **Testing:** Requires new test module for window sizing
**Why it's #2:**
- Directly tied to inference engine design (already specified)
- Pairs naturally with decay slope tuning
- Measurable via statistical tests (variance reduction)
- Can be tested in factorial design (2×2 with decay slope)
**Next Step:** Implement `find_variance_inflection()` in inference engine, test with DoE
---
### 3. Decay Rate Parameter Tuning ⭐⭐⭐
**What it is:**
Factorial DoE testing different `DECAY_MIN_INTERVAL_NS` and `ADAPTIVE_SHRINK_RATE` values.
**Why it matters:**
- Controls how aggressively hot-words decay and how window shrinks
- Currently hardcoded (1000ns, 75)
- Different workloads may benefit from different rates
- **Potential gain:** 3-6% performance improvement
**Implementation Cost:**
- **Difficulty:** ⭐⭐ (Low)
- **Effort:** 1-2 hours (pure DoE, no code changes needed)
- **Files affected:** None (Makefile parameters only)
- **Testing:** Existing metrics, just new experiments
**Why it's #3:**
- Requires ZERO code changes (just Makefile knobs)
- Can run immediately after current baselines
- Quick feedback loop (each run ~10 seconds)
- Natural 2×2 or 2×3 factorial design
**Next Step:** Update `run_doe.sh` to test decay parameters, run TST_DECAY_01 through TST_DECAY_04
---
## Tier 2: Good ROI, Medium Effort
### 4. Rolling Window Sizing Experiment ⭐⭐⭐⭐
**What it is:**
2^2 factorial DoE: Test `ROLLING_WINDOW_SIZE` values (2048, 4096, 8192) × `DECAY_SLOPE` (0.33, 0.5).
**Why it matters:**
- Window size is a key tuning knob
- Inference engine design depends on proper sizing
- Can reveal interaction effects between window and decay
- **Potential gain:** 5-8% performance improvement
**Implementation Cost:**
- **Difficulty:** ⭐⭐⭐ (Medium)
- **Effort:** 6-8 hours (includes inference engine integration)
- **Files affected:** `src/inference_engine.c`, `src/vm.c`
- **Testing:** Statistical validation of variance inflection detection
**Why it's mid-tier:**
- Builds on decay slope + window width inference
- Requires inference engine to be fully operational
- More complex experiment (larger design space)
- Needs statistical analysis beyond simple comparisons
**Prerequisites:**
- Complete items #1 and #2 first
- Ensure inference engine passes unit tests
**Next Step:** After decay slope + window width inference are working, run TST_WINDOW_DoE_01
---
### 5. Hotwords Cache Threshold Optimization ⭐⭐⭐
**What it is:**
Factorial DoE: Test `HOTWORDS_EXECUTION_HEAT_THRESHOLD` (default=10) with different values (5, 10, 20, 50).
**Why it matters:**
- Threshold determines when words are promoted to hot-words cache
- Too low = cache thrash; too high = miss optimization
- Current value (10) is arbitrary
- **Potential gain:** 2-4% performance improvement
**Implementation Cost:**
- **Difficulty:** ⭐⭐⭐ (Medium)
- **Effort:** 2-3 hours
- **Files affected:** Makefile only + `include/physics_hotwords_cache.h`
- **Testing:** Cache statistics validation
**Why it's mid-tier:**
- Simple parameter sweep (can be done as Makefile knob)
- Requires statistical analysis of cache hit rates
- May interact with decay slope (higher slope = more aggressive threshold needed)
**Next Step:** Can run in parallel with other optimization work
---
## Tier 3: High Impact, High Effort (Future)
### 6. Binary Search Slope Fitting Validation ⭐⭐⭐
**What it is:**
Compare closed-form linear regression (current plan) vs. binary search for finding optimal decay slope.
**Why it matters:**
- Validates accuracy of closed-form inference vs. iterative approach
- Determines which algorithm to use in production
- **Potential gain:** 2-5% accuracy improvement in slope estimation
**Implementation Cost:**
- **Difficulty:** ⭐⭐⭐ (Medium)
- **Effort:** 8-12 hours (implement binary search, compare algorithms)
- **Files affected:** `src/inference_engine.c`
- **Testing:** Numerical analysis, convergence validation
**Why it's later:**
- Optimization of an optimization (diminishing returns)
- Requires both algorithms implemented and benchmarked
- More of a research question than product improvement
- Nice-to-have, not critical path
**Next Step:** After closed-form inference is working, run comparative benchmarks
---
### 7. Speculative Prefetch ML Model ⭐⭐⭐⭐⭐
**What it is:**
Train a neural network on word transition sequences to predict next word with >88% accuracy (beat current 88.37%).
**Why it matters:**
- Current prefetch accuracy (752/851 = 88.37%) is deterministic, hard-coded patterns
- ML model could adapt to actual runtime patterns
- Could enable dynamic prefetch strategy
- **Potential gain:** 15-30% performance improvement
**Implementation Cost:**
- **Difficulty:** ⭐⭐⭐⭐⭐ (Very Hard)
- **Effort:** 40-80 hours (full ML pipeline: data collection, training, inference)
- **Files affected:** New ML inference module + word transition metrics collection
- **Testing:** Cross-validation, A/B testing in FORTH
**Why it's ambitious:**
- Requires data collection infrastructure (already have rolling window!)
- Inference latency must be < 1µs to be worth it
- Training overhead (offline, could do periodically)
- Integration into VM execution path is non-trivial
**Prerequisites:**
- Complete inference engine work (Tiers 1-2)
- Build robust word transition metrics collection
- Prove ML-guided prefetch is faster than current approach
**Future:** Post-MVP optimization, not critical for tuning baseline
---
### 8. Kernel-Aware Memory Placement ⭐⭐⭐⭐
**What it is:**
Use Linux kernel hints (NUMA, page migration) to place hot dictionary words near CPU cores executing them.
**Why it matters:**
- Current VM uses unified memory layout
- NUMA systems have variable latency (local ~100ns, remote ~300ns)
- Hot words could be pinned to NUMA nodes close to execution
- **Potential gain:** 10-20% performance improvement on NUMA systems
**Implementation Cost:**
- **Difficulty:** ⭐⭐⭐⭐ (Hard)
- **Effort:** 30-50 hours (NUMA topology, page pinning, migration policy)
- **Files affected:** `src/platform/linux/numa_*.c` (new module), `src/memory_management.c`
- **Testing:** NUMA benchmark harness, multi-socket validation
**Why it's ambitious:**
- Only helps on multi-socket systems (RPi4, small servers won't see benefit)
- Requires careful page pinning to avoid fragmentation
- Platform-specific (L4Re won't support same approach)
- Maintenance burden for multi-platform support
**Prerequisites:**
- Complete baseline tuning (Tiers 1-2)
- Identify NUMA systems as target (if applicable)
- Profile-guided data showing memory pressure
**Future:** Platform-specific optimization, post-MVP
---
### 9. Dictionary Reorganization (Heat-Aware) ⭐⭐⭐
**What it is:**
Reorder dictionary entries by execution heat to improve cache locality.
**Why it matters:**
- Currently dictionary is laid out by definition order (arbitrary)
- Hot words could be grouped in memory to improve L1/L2 cache hits
- **Potential gain:** 3-5% performance improvement
**Implementation Cost:**
- **Difficulty:** ⭐⭐⭐⭐ (Hard)
- **Effort:** 20-30 hours (reorganization algorithm, validation, testing)
- **Files affected:** `src/memory_management.c`, `src/dictionary_management.c`, serialization
- **Testing:** Memory layout validation, cache performance analysis
**Why it's later:**
- Complex to implement without breaking compatibility
- Requires careful serialization/deserialization of dictionary
- Benefits diminish if inference engine is already optimizing cache
- Risky to existing stability
**Prerequisites:**
- Complete hotwords cache tuning
- Prove inference engine is stable
- Measure memory pressure before reorganizing
**Future:** Advanced optimization, after baseline is solid
---
## Tier 4: Experimental/Research
### 10. SIMD Vectorization ⭐⭐
**What it is:**
Use AVX2/AVX-512 vector instructions for bulk word execution, batch processing, or memory operations.
**Why it matters:**
- Modern CPUs have unused vector capacity
- Could enable batch word processing (e.g., 4 parallel words)
- **Potential gain:** 5-10% performance improvement
**Implementation Cost:**
- **Difficulty:** ⭐⭐⭐⭐⭐ (Very Hard)
- **Effort:** 60-100+ hours
- **Files affected:** Core execution loop in `src/vm.c`, new SIMD module
- **Testing:** Correctness validation (SIMD bugs are subtle), cross-platform
**Why it's last:**
- FORTH's nature (sequential data stack) doesn't parallelize well
- Word dispatch is hard to vectorize (data dependencies)
- Gains are speculative (may not vectorize at all)
- Maintenance burden (SIMD code is fragile, platform-specific)
- Diminishing returns after other optimizations
**Prerequisites:**
- All other optimizations complete
- Proof that word dispatch is the actual bottleneck
- Acceptance that maintenance cost is worth 5-10% gain
**Future:** Research project, not MVP priority
---
## Recommended Sequencing
### Phase 1: Foundation (Weeks 1-2)
```
1. Run factorial DoE on decay rate (TST_DECAY_01-04) [2-4 runs × 30 samples]
└─ Measure impact of DECAY_MIN_INTERVAL_NS, SHRINK_RATE
└─ Expected: 3-6% improvement, identify optimal values
2. Complete adaptive decay slope inference (code) [4-6 hours]
└─ Implement closed-form regression in inference engine
└─ Unit test against synthetic trajectories
```
### Phase 2: Validation (Weeks 2-3)
```
3. Complete variance-based window tuning (code) [3-5 hours]
└─ Implement variance inflection detection
└─ Unit test with synthetic variance patterns
4. Run 2×2 factorial DoE: decay_slope × window_size [8-16 runs × 30 samples]
(TST_WINDOW_DoE_01-04)
└─ Expected: 8-15% improvement over baseline
└─ Identify optimal strategy
```
### Phase 3: Refinement (Week 4)
```
5. Hotwords threshold DoE (optional) [4-8 runs × 30 samples]
(TST_THRESHOLD_01-04)
└─ Sweep cache threshold, identify sweet spot
6. Binary search validation (research) [8-12 hours]
└─ Compare closed-form vs iterative approaches
└─ Document numerical stability findings
```
### Phase 4+: Advanced (Future)
```
7-10. ML models, NUMA optimization, vectorization [Deferred to Phase 2 product]
```
---
## Decision Framework: Which to Do First?
**If you want quick wins:** Start with #1 + #3 (decay slope inference + parameter tuning)
- Effort: ~10 hours code + 2-3 days experiments
- Expected gain: 8-15% over baseline
- Validates inference engine approach
**If you want systematic optimization:** Do Tier 1 + Tier 2 in order
- Effort: ~30 hours code + 5-7 days experiments
- Expected gain: 15-25% over baseline
- Comprehensive tuning of all major knobs
**If you want research:** Pick one deep dive (binary search, ML, NUMA)
- Effort: 40-100 hours
- Expected gain: Varies widely, high risk/high reward
- Publishable results
---
## Open Questions
1. **Should we start with parameter sweeps (no code) or inference implementation (code)?**
- Parameter sweeps are faster feedback (days vs weeks)
- Inference engine is better long-term (automatic adaptation)
- Recommendation: **Do parameter sweeps first, then inference**
2. **Is 88.37% prefetch accuracy "good enough" or should we chase higher?**
- Current value is deterministic, fixed by test workload
- ML approaches could improve to ~92-95%, but with latency risk
- Recommendation: **Validate parameter tuning first, then consider ML**
3. **Should we optimize for TST_03 (deterministic test suite) or real-world workloads?**
- Test suite gives clean, reproducible metrics
- Real workloads would show variance in pipelining
- Recommendation: **Keep test suite for validation, plan real-workload experiments for Phase 2**
---
## Summary Table
| Rank | Item | Impact | Effort | ROI | Status |
|------|------|--------|--------|-----|--------|
| 1 | Decay slope inference | High | Low | 2.5 | Design ready, code needed |
| 2 | Window width tuning | High | Low | 2.0 | Design ready, code needed |
| 3 | Decay rate DoE | Med-High | Very Low | 1.5 | Ready to run now |
| 4 | Window sizing DoE | High | Medium | 1.33 | Ready after #1-2 complete |
| 5 | Cache threshold DoE | Med-High | Medium | 1.0 | Ready to run now |
| 6 | Binary search validation | Medium | Medium | 1.0 | Research phase |
| 7 | ML prefetch model | Very High | Very High | 1.0 | Future product phase |
| 8 | NUMA memory placement | High | High | 1.0 | Platform-specific |
| 9 | Dictionary reorganization | Medium-High | High | 0.75 | Advanced optimization |
| 10 | SIMD vectorization | Medium | Very High | 0.4 | Research/experimental |