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}