Stage MC-0c: shared VM code made per-VM or atomic (FABRIC-3.10.8 §3.4)
- Dictionary lookup index is per VM (vm->fc_index, struct SfFcIndex): was one global index rebuilt whenever a different VM was searched, and heat reorganization could reorder another VM's buckets. Allocated on first lookup, freed by vm_cleanup(); allocation failure counted/logged, lookup falls back to a newest-first dictionary walk. - PRNG: still one stream, stepped by compare-and-swap; SEED one store. - state_variable removed (write-only; STATE is vm->mode). - Sweep additions (Captain Bob's ruling): heartbeat_export.c delta last-values moved into each VM's HeartbeatState (were statics shared by every VM -- wrong across VMs today); TOP-WORDS list heap-sized per call (was static [1000]); inference_outputs_to_string() takes a caller buffer; three failure counters atomic; crc64 table published with release/acquire. - Confirmed, unchanged: g_runtime compiled out of the kernel, g_hotwords_cache unreferenced, ttf cache core-0-only. - Probe (removed): every VM has its own index; two VMs searched alternately 2x5000 lookups: 0 rebuilds, 0 wrong-VM results, all three ISAs. - Standard sequence on amd64/aarch64/riscv64: dict_hash set unchanged, G byte-identical, MINT/WIREBIND/USE ok, conservation true, 0 idle growth. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
33f4090d6d
commit
355909d46f
@@ -92,15 +92,35 @@ DictEntry *dict_find_word_heat_aware(VM *vm, const char *name, size_t len);
|
||||
*/
|
||||
void dict_adaptive_optimization_pass(VM *vm);
|
||||
|
||||
/* Frequency-class (fc) buckets — shared between dictionary_management.c and
|
||||
dictionary_heat_optimization.c. Declared here once to give LTO a single
|
||||
canonical type definition and avoid -Werror=lto-type-mismatch. */
|
||||
/* First-character (fc) lookup index — shared between dictionary_management.c
|
||||
and dictionary_heat_optimization.c. Declared here once to give LTO a single
|
||||
canonical type definition and avoid -Werror=lto-type-mismatch.
|
||||
|
||||
FABRIC-3.10.8 Stage MC-0c: one index per VM (vm->fc_index), not one for
|
||||
the whole system. The old global index held whichever VM's dictionary was
|
||||
searched last, so alternating between two VMs rebuilt it on every switch,
|
||||
and a heat reorganization could reorder another VM's buckets. SF_FC_BUCKETS
|
||||
is one bucket per possible first byte, the whole domain, not a capacity. */
|
||||
#ifndef SF_FC_BUCKETS
|
||||
#define SF_FC_BUCKETS 256
|
||||
#endif
|
||||
extern DictEntry **sf_fc_list[SF_FC_BUCKETS];
|
||||
extern size_t sf_fc_count[SF_FC_BUCKETS];
|
||||
extern size_t sf_fc_cap[SF_FC_BUCKETS];
|
||||
struct SfFcIndex {
|
||||
DictEntry **list[SF_FC_BUCKETS]; /* per bucket: entries, [0]=oldest */
|
||||
size_t count[SF_FC_BUCKETS];
|
||||
size_t cap[SF_FC_BUCKETS];
|
||||
DictEntry *cached_latest; /* the vm->latest this index reflects */
|
||||
uint64_t rebuilds; /* full rebuilds of this index, ever */
|
||||
};
|
||||
|
||||
/* This VM's index, allocated on first use; NULL only if that allocation
|
||||
failed (counted and logged -- lookups then walk the dictionary). */
|
||||
struct SfFcIndex *vm_dictionary_index(VM *vm);
|
||||
|
||||
/* Frees vm's index (vm_cleanup()). */
|
||||
void vm_dictionary_index_free(VM *vm);
|
||||
|
||||
/* Index allocations refused for lack of memory, system-wide. */
|
||||
uint32_t vm_dictionary_index_alloc_failures(void);
|
||||
|
||||
#endif /* DICTIONARY_HEAT_OPTIMIZATION_H */
|
||||
|
||||
|
||||
@@ -210,9 +210,12 @@ void inference_engine_run(InferenceInputs *inputs, InferenceOutputs *outputs);
|
||||
* Format: "window_width=XXX variance_q48=YYYY slope_q48=ZZZZ fit_quality=WWWW"
|
||||
*
|
||||
* @param outputs Inference outputs struct
|
||||
* @return Pointer to static string (valid until next call)
|
||||
* @param buf Caller's buffer (256 bytes holds any output) -- FABRIC-3.10.8
|
||||
* MC-0c: no longer a static buffer shared by every VM
|
||||
* @param cap Size of @p buf
|
||||
* @return @p buf
|
||||
*/
|
||||
const char* inference_outputs_to_string(const InferenceOutputs *outputs);
|
||||
const char* inference_outputs_to_string(const InferenceOutputs *outputs, char *buf, size_t cap);
|
||||
|
||||
/*
|
||||
* @brief Validate inference outputs for sanity
|
||||
|
||||
@@ -312,6 +312,13 @@ typedef struct
|
||||
uint64_t run_start_ns; /* Monotonic time at run start */
|
||||
uint32_t tick_number_offset; /* Tick counter for this run */
|
||||
|
||||
/* heartbeat_capture_tick_snapshot()'s previous values, for its deltas
|
||||
* (FABRIC-3.10.8 MC-0c: were function-local statics shared by every VM,
|
||||
* so each VM's delta was taken against whichever VM was sampled last). */
|
||||
uint64_t export_last_tick_count;
|
||||
uint64_t export_last_words_executed;
|
||||
uint64_t export_last_early_exit_count;
|
||||
|
||||
/* === L8 Attractor Bucket Statistics === */
|
||||
double bucket_sum_K; /* Sum of K values across bucket */
|
||||
double bucket_sum_K_squared; /* Sum of K^2 for variance calculation */
|
||||
@@ -594,6 +601,9 @@ typedef struct VM
|
||||
* @{
|
||||
*/
|
||||
HotwordsCache* hotwords_cache; /**< Frequency-driven dictionary acceleration cache */
|
||||
struct SfFcIndex *fc_index; /**< This VM's first-character lookup index
|
||||
* (FABRIC-3.10.8 MC-0c; dictionary_management.c,
|
||||
* allocated on first lookup, freed by vm_cleanup()) */
|
||||
/** @} */
|
||||
|
||||
/** @name Rolling Window of Truth (Deterministic Metrics)
|
||||
|
||||
Reference in New Issue
Block a user