Files
hakmem/docs/analysis/PHASE76_1_C4_INLINE_SLOTS_RESULTS.md

225 lines
7.5 KiB
Markdown
Raw Normal View History

# Phase 76-1: C4 Inline Slots A/B Test Results
## Executive Summary
**Decision**: **GO** (+1.73% gain, exceeds +1.0% threshold)
**Key Finding**: C4 inline slots optimization provides **+1.73% throughput gain** on Standard binary, completing the C4/C5/C6 inline slots trilogy.
**Implementation**: Modular box pattern following Phase 75-1/75-2 (C6/C5) design, integrating C4 into existing cascade.
---
## Implementation Summary
### Modular Boxes Created
1. **`core/box/tiny_c4_inline_slots_env_box.h`**
- ENV gate: `HAKMEM_TINY_C4_INLINE_SLOTS=0/1`
- Lazy-init pattern (default OFF)
2. **`core/box/tiny_c4_inline_slots_tls_box.h`**
- TLS ring buffer: 64 slots (512B per thread)
- FIFO ring (head/tail indices, modulo 64)
3. **`core/front/tiny_c4_inline_slots.h`**
- `c4_inline_push()` - always_inline
- `c4_inline_pop()` - always_inline
4. **`core/tiny_c4_inline_slots.c`**
- TLS variable definition
### Integration Points
**Alloc Path** (`tiny_front_hot_box.h`):
```c
// C4 FIRST → C5 → C6 → unified_cache
if (class_idx == 4 && tiny_c4_inline_slots_enabled()) {
void* base = c4_inline_pop(c4_inline_tls());
if (TINY_HOT_LIKELY(base != NULL)) {
return tiny_header_finalize_alloc(base, class_idx);
}
}
```
**Free Path** (`tiny_legacy_fallback_box.h`):
```c
// C4 FIRST → C5 → C6 → unified_cache
if (class_idx == 4 && tiny_c4_inline_slots_enabled()) {
if (c4_inline_push(c4_inline_tls(), base)) {
return; // Success
}
}
```
---
## 10-Run A/B Test Results
### Test Configuration
- **Workload**: Mixed SSOT (WS=400, ITERS=20000000)
- **Binary**: `./bench_random_mixed_hakmem` (Standard build)
- **Existing Defaults**: C5=1, C6=1 (Phase 75-3 promoted)
- **Runs**: 10 per configuration
- **Harness**: `scripts/run_mixed_10_cleanenv.sh`
### Raw Data
| Run | Baseline (C4=0) | Treatment (C4=1) | Delta |
|-----|-----------------|------------------|-------|
| 1 | 52.91 M ops/s | 53.87 M ops/s | +1.82% |
| 2 | 52.52 M ops/s | 53.16 M ops/s | +1.22% |
| 3 | 53.26 M ops/s | 53.64 M ops/s | +0.71% |
| 4 | 53.45 M ops/s | 53.30 M ops/s | -0.28% |
| 5 | 51.88 M ops/s | 52.62 M ops/s | +1.43% |
| 6 | 52.83 M ops/s | 53.81 M ops/s | +1.85% |
| 7 | 50.41 M ops/s | 52.76 M ops/s | +4.66% |
| 8 | 51.89 M ops/s | 53.46 M ops/s | +3.02% |
| 9 | 53.03 M ops/s | 53.62 M ops/s | +1.11% |
| 10 | 51.97 M ops/s | 53.00 M ops/s | +1.98% |
### Statistical Summary
| Metric | Baseline (C4=0) | Treatment (C4=1) | Delta |
|--------|-----------------|------------------|-------|
| **Mean** | **52.42 M ops/s** | **53.33 M ops/s** | **+1.73%** |
| Min | 50.41 M ops/s | 52.62 M ops/s | +4.39% |
| Max | 53.45 M ops/s | 53.87 M ops/s | +0.78% |
---
## Decision Matrix
### Success Criteria
| Criterion | Threshold | Actual | Pass |
|-----------|-----------|--------|------|
| **GO Threshold** | ≥ +1.0% | **+1.73%** | ✓ |
| NEUTRAL Range | ±1.0% | N/A | N/A |
| NO-GO Threshold | ≤ -1.0% | N/A | N/A |
### Decision: **GO**
**Rationale**:
1. Mean throughput gain of **+1.73%** exceeds GO threshold (+1.0%)
2. All individual runs show positive or near-zero delta (only 1/10 negative by -0.28%)
3. Consistent improvement across multiple runs (9/10 positive)
4. Pattern matches Phase 75-1 (C6: +2.87%) and Phase 75-2 (C5: +1.10%) success
**Quality Rating**: **Strong GO** (exceeds threshold by +0.73pp, robust across runs)
---
## Per-Class Coverage Analysis
### C4-C7 Optimization Status
| Class | Size Range | Coverage % | Optimization | Status |
|-------|-----------|-----------|--------------|--------|
| **C4** | 257-512B | 14.29% | Inline Slots | **GO (+1.73%)** |
| **C5** | 513-1024B | 28.55% | Inline Slots | GO (+1.10%, Phase 75-2) |
| **C6** | 1025-2048B | 57.17% | Inline Slots | GO (+2.87%, Phase 75-1) |
| **C7** | 2049-4096B | 0.00% | N/A | NO-GO (Phase 76-0: 0% ops) |
**Combined C4-C6 Coverage**: 100% of C4-C7 operations (14.29% + 28.55% + 57.17%)
### Cumulative Gain Tracking
| Optimization | Coverage | Individual Gain | Cumulative Impact |
|--------------|----------|-----------------|-------------------|
| C6 Inline Slots (Phase 75-1) | 57.17% | +2.87% | +2.87% |
| C5 Inline Slots (Phase 75-2) | 28.55% | +1.10% | +3.97% (C5+C6 4-point: +5.41%) |
| **C4 Inline Slots (Phase 76-1)** | **14.29%** | **+1.73%** | **+7.14%** (estimated, C4+C5+C6 combined) |
**Note**: Actual cumulative gain will be measured in follow-up 4-point matrix test if needed. Phase 75-3 showed C5+C6 achieved +5.41% (near-perfect sub-additivity at 1.72%).
---
## TLS Layout Impact
### TLS Cost Summary
| Component | Capacity | Size per Thread | Total (C4+C5+C6) |
|-----------|----------|-----------------|------------------|
| C4 inline slots | 64 | 512B | - |
| C5 inline slots | 128 | 1,024B | - |
| C6 inline slots | 128 | 1,024B | - |
| **Combined** | - | - | **2,560B (~2.5KB)** |
**System-Wide** (10 threads): ~25KB total
**Per-Thread L1-dcache**: +2.5KB footprint
**Observation**: No cache-miss spike observed (unlike Phase 74-2 LOCALIZE which showed +86% cache-misses). TLS expansion of 512B for C4 is well within safe limits.
---
## Comparison: C4 vs C5 vs C6
| Phase | Class | Coverage | Capacity | TLS Cost | Individual Gain |
|-------|-------|----------|----------|----------|-----------------|
| 75-1 | C6 | 57.17% | 128 | 1KB | **+2.87%** (highest) |
| 75-2 | C5 | 28.55% | 128 | 1KB | +1.10% |
| **76-1** | **C4** | **14.29%** | **64** | **512B** | **+1.73%** |
**Key Insight**: C4 achieves **+1.73% gain** with only **14.29% coverage**, showing higher efficiency per-operation than C5 (+1.10% with 28.55% coverage). This suggests C4 class has higher branch overhead in the baseline unified_cache path.
---
## Recommended Actions
### Immediate (Required)
1. **✓ Promote C4 Inline Slots to SSOT**
- Set `HAKMEM_TINY_C4_INLINE_SLOTS=1` (default ON)
- Update `core/bench_profile.h`
- Update `scripts/run_mixed_10_cleanenv.sh`
2. **✓ Document Phase 76-1 Results**
- Create `PHASE76_1_C4_INLINE_SLOTS_RESULTS.md`
- Update `CURRENT_TASK.md`
- Record in `PERFORMANCE_TARGETS_SCORECARD.md`
### Optional (Future Work)
3. **4-Point Matrix Test (C4+C5+C6)**
- Measure full combined effect
- Quantify sub-additivity (C4 + (C5+C6 proven +5.41%))
- Expected: +7-8% total gain if near-perfect additivity holds
4. **FAST PGO Rebase**
- Test C4+C5+C6 on FAST PGO binary
- Monitor for code bloat sensitivity (Phase 75-5 lesson)
- Track mimalloc ratio progress
---
## Test Artifacts
### Log Files
- `/tmp/phase76_1_c4_baseline.log` (C4=0, 10 runs)
- `/tmp/phase76_1_c4_treatment.log` (C4=1, 10 runs)
- `/tmp/phase76_1_analysis.sh` (statistical analysis)
### Binary Information
- Binary: `./bench_random_mixed_hakmem`
- Build time: 2025-12-18 10:42
- Size: 674K
- Compiler: gcc -O3 -march=native -flto
---
## Conclusion
Phase 76-1 validates that C4 inline slots optimization provides **+1.73% throughput gain** on Standard binary, completing the C4-C6 inline slots optimization trilogy.
The implementation follows the proven modular box pattern from Phase 75-1/75-2, integrates cleanly into the existing C5→C6→unified_cache cascade, and shows no adverse TLS or cache-miss effects.
**Recommendation**: Proceed with SSOT promotion to `core/bench_profile.h` and `scripts/run_mixed_10_cleanenv.sh`, setting `HAKMEM_TINY_C4_INLINE_SLOTS=1` as the new default.
---
**Phase 76-1 Status**: ✓ COMPLETE (GO, +1.73% gain validated on Standard binary)
**Next Phase**: Phase 76-2 (C4+C5+C6 4-point matrix validation) or SSOT promotion (if matrix deferred)