Files

176 lines
5.7 KiB
Markdown

<!-- Moved from docs/03-architecture/pipelining/wired-not-utilized.md to docs/working/architecture/03-architecture/pipelining/wired-not-utilized.md on 2026-06-16 (docs reorg Phase 2) -->
# Pipelining Feedback Loop: WIRED BUT NOT UTILIZED (Critical Issue)
## The Problem
The pipelining infrastructure has **asymmetric wiring**: data collection hooks exist, but the decision functions are never called. This creates a broken promise.
### Loop #4: Pipelining Transition Metrics
**Data Collection (WIRED):**
```c
// src/vm.c:545-548 (EXECUTES when ENABLE_PIPELINING=1)
if (prev_word && prev_word->transition_metrics && ENABLE_PIPELINING)
{
transition_metrics_record(prev_word->transition_metrics, word_id, DICTIONARY_SIZE);
}
```
**Decision Logic (NOT UTILIZED):**
```c
// src/physics_pipelining_metrics.c:164 (DEFINED but NEVER CALLED)
int transition_metrics_should_speculate(const WordTransitionMetrics *metrics, uint32_t target_word_id) {
if (!metrics || !metrics->transition_heat) return 0;
if (metrics->total_transitions < MIN_SAMPLES_FOR_SPECULATION) return 0;
int64_t prob_q48 = transition_metrics_get_probability_q48(metrics, target_word_id);
if (prob_q48 < SPECULATION_THRESHOLD_Q48) return 0;
return 1; /* Should speculate */
}
```
**Consequence:**
- When `ENABLE_PIPELINING=1`: Metrics are collected but **never examined**
- The decision function exists in the header (looks active to users)
- Setting the flag gives false impression of optimization (it's not)
---
## The Root Cause
Phase 2 development was **partially started but never completed**:
1. **Infrastructure wired (Phase 1 work):**
- Data collection hooks added to vm.c
- Metrics structures allocated per word
- Transition counting functions work
2. **Decision logic stubbed (Phase 2 design):**
- `transition_metrics_should_speculate()` exists
- Comments note "TODO: Phase 4 - Add ROI check here"
- Function is exportable but never invoked
3. **Integration missing (Phase 2 work not done):**
- No caller for `transition_metrics_should_speculate()`
- No prefetch/speculation action taken when it returns 1
- No word reordering or predictive loading in execution path
---
## Loop #5: Context Window Tuning (Also Broken)
**The Binary Chop Stub:**
```c
// src/physics_pipelining_metrics.c:340 (DEFINED but NEVER CALLED)
uint32_t transition_metrics_binary_chop_suggest_window(...) {
/* Phase 1: Stub - just return doubled window size per user's request */
/* Phase 2 will implement actual binary chop search ... */
if (current_window >= 8) return 1;
if (current_window == 1) return 2;
if (current_window == 2) return 4;
if (current_window == 4) return 8;
return current_window;
}
```
**Problem:**
- Comment admits it's a stub
- Never called from anywhere
- Not integrated with effective_window_size tuning
---
## What to Do RIGHT NOW
### OPTION A: Disable Until Phase 2 Ready
Remove the half-wired data collection until Phase 2 implementation is ready:
**File:** `src/vm.c:545-548`
```c
/* DISABLED: Phase 2 pipelining not yet utilized (see PIPELINING_WIRED_NOT_UTILIZED.md) */
// if (prev_word && prev_word->transition_metrics && ENABLE_PIPELINING)
// {
// transition_metrics_record(prev_word->transition_metrics, word_id, DICTIONARY_SIZE);
// }
```
**And:** `src/vm.c:578-581`
```c
/* DISABLED: Phase 2 pipelining not yet utilized */
// if (ENABLE_PIPELINING && w)
// {
// prev_word = w;
// }
```
**Effect:** When users set `ENABLE_PIPELINING=1`, nothing happens (honest)
**Rationale:**
- Stops creating false impression that pipelining works
- Prevents wasted memory allocating transition_metrics per word
- Removes confusing code in hot execution path
---
### OPTION B: Wire In Decision Logic (Phase 2 Work)
Actually implement the optimization (bigger effort):
1. After collecting metrics, **call the decision function** when should_speculate() returns true
2. **Implement prefetch action**: If speculation is favorable, load word into instruction cache/prefetch buffer
3. **Wire binary chop**: Call suggest_window() and actually update effective_window_size
4. **Measure impact**: Add DoE knob for ENABLE_PIPELINING=1 to test speedup vs baseline
**This is Phase 2 work** - significant implementation
---
### OPTION C: Delete It
If pipelining is not planned for StarForth, remove the entire infrastructure:
1. Delete `src/physics_pipelining_metrics.c`
2. Remove declarations from headers
3. Remove data collection hooks from vm.c
4. Remove `ENABLE_PIPELINING` flag
**Rationale:** Clean up unneeded infrastructure
---
## Current Status in Code
| Item | State | Note |
|------|-------|------|
| Data collection hooks | Wired (vm.c:545, 578) | Only active if ENABLE_PIPELINING=1 |
| Metrics structures | Allocated per word | Wastes memory when disabled |
| Decision function | Defined (line 164) | Never called |
| Exported in header | Yes | Users think it's available |
| Build flag | ENABLE_PIPELINING ?= 0 | Disabled by default |
| DoE configuration | No knob | Phase 1 DoE doesn't test it |
| Documentation | Admits it's stub | "Phase 2 will implement..." |
---
## Recommendation
**OPTION A (Disable)** is the right move:
1. **Honest**: Stop pretending pipelining works
2. **Low-risk**: Removes dead code from hot path
3. **Future-proof**: When Phase 2 work begins, uncomment and properly wire
4. **Unblocks**: Clears confusion about what's actually optimizing
**Then document:**
- Why it's disabled
- What Phase 2 work looks like
- How to re-enable when ready
---
**User request:** These loops must be attended to RIGHT NOW
**Diagnosis:** Both are Phase 2 stubs left partially wired
**Recommendation:** Disable until Phase 2 work is ready
**Files to change:** src/vm.c (lines 545-548, 578-581)