code wiki / _hdl_build / nx_vram_gov.nx

nx_vram_gov.nx source

↩ module page · 54 lines · 2746 B

1// nx_vram_gov.nx -- sovereign VRAM COEXISTENCE GOVERNOR (V-RAM-001, hardware resource rule #21). The RTX 5080's 2// 16 GB is SHARED across services (image-gen, companion-LLM, game-engine); without a governor they OOM each other 3// and crash a generation. This governs the shared budget: each tenant reserves VRAM, admission REJECTS anything 4// that would exceed the budget (never-OOM BY CONSTRUCTION), and a higher-priority request can EVICT lower-priority 5// tenants to fit. Composes nx_vram_budget's sizing (a tenant's size_mb = vram_config_mb). Pure state logic. 6// gov[*i64]: [0]=budget_mb [1]=used_mb [2]=ntenants ; tenant i at [3 + i*3] = {id, size_mb, priority}. license_tier: ORIGINAL 7 8func vg_init(gov: *i64, budget_mb: i64) -> i64 { gov[0] = budget_mb; gov[1] = 0; gov[2] = 0; return 0 } 9func vg_used(gov: *i64) -> i64 { return gov[1] } 10func vg_free(gov: *i64) -> i64 { return gov[0] - gov[1] } 11func vg_count(gov: *i64) -> i64 { return gov[2] } 12func vg_find(gov: *i64, id: i64) -> i64 { 13 var i: i64 = 0 14 while i < gov[2] { if gov[3 + i*3] == id { return i } i = i + 1 } 15 return 0 - 1 16} 17// reserve size_mb for tenant `id`; returns 1 admitted, 0 rejected (would exceed budget -> never OOM). 18func vg_admit(gov: *i64, maxt: i64, id: i64, size_mb: i64, prio: i64) -> i64 { 19 if gov[1] + size_mb > gov[0] { return 0 } // would OOM -> reject (the never-brick-the-box invariant) 20 if gov[2] >= maxt { return 0 } 21 let i: i64 = gov[2] 22 gov[3 + i*3] = id; gov[3 + i*3 + 1] = size_mb; gov[3 + i*3 + 2] = prio 23 gov[2] = i + 1 24 gov[1] = gov[1] + size_mb 25 return 1 26} 27// free a tenant's reservation (swap-remove). returns 1 if it existed. 28func vg_release(gov: *i64, id: i64) -> i64 { 29 let idx: i64 = vg_find(gov, id) 30 if idx < 0 { return 0 } 31 gov[1] = gov[1] - gov[3 + idx*3 + 1] 32 let last: i64 = gov[2] - 1 33 if idx != last { 34 gov[3 + idx*3] = gov[3 + last*3] 35 gov[3 + idx*3 + 1] = gov[3 + last*3 + 1] 36 gov[3 + idx*3 + 2] = gov[3 + last*3 + 2] 37 } 38 gov[2] = last 39 return 1 40} 41// admit, evicting strictly-LOWER-priority tenants until it fits (for a high-priority request). returns 1/0. 42func vg_admit_evict(gov: *i64, maxt: i64, id: i64, size_mb: i64, prio: i64) -> i64 { 43 var go: i64 = 1 44 while go == 1 { 45 if gov[1] + size_mb <= gov[0] { go = 0 } else { 46 var worst: i64 = 0 - 1 47 var worst_prio: i64 = prio 48 var i: i64 = 0 49 while i < gov[2] { if gov[3 + i*3 + 2] < worst_prio { worst_prio = gov[3 + i*3 + 2]; worst = i } i = i + 1 } 50 if worst < 0 { go = 0 } else { vg_release(gov, gov[3 + worst*3]) } // evict the lowest-priority tenant 51 } 52 } 53 return vg_admit(gov, maxt, id, size_mb, prio) 54}