nx_tensor_placement_test.nx source
↩ module page · 134 lines · 6809 B
1// nx_tensor_placement_test.nx -- smoke for nx_tensor_placement.
2
3import "nx_syscalls.nx"
4import "nx_tensor_placement.nx"
5
6func main() -> i64 {
7 let now: nx_size = 1000000
8
9 // 1: enum validity
10 if nx_tp_tier_is_valid(NX_TP_TIER_VRAM_HOT) != 1 { return 1 }
11 if nx_tp_tier_is_valid(NX_TP_TIER_NETWORK_PEER) != 1 { return 2 }
12 if nx_tp_tier_is_valid(-1) != 0 { return 3 }
13 if nx_tp_tier_is_valid(8) != 0 { return 4 }
14 if NX_TP_TIER_N != 8 { return 5 }
15
16 if nx_tp_v_is_valid(NX_TP_V_OK) != 1 { return 6 }
17 if nx_tp_v_is_valid(NX_TP_V_REFUSED_HOTLOCK) != 1 { return 7 }
18
19 // 2: tier classification predicates
20 if nx_tp_tier_is_gpu(NX_TP_TIER_VRAM_HOT) != 1 { return 8 }
21 if nx_tp_tier_is_gpu(NX_TP_TIER_VRAM_WARM) != 1 { return 9 }
22 if nx_tp_tier_is_gpu(NX_TP_TIER_RAM_HOT) != 0 { return 10 }
23 if nx_tp_tier_is_cpu_memory(NX_TP_TIER_RAM_HOT) != 1 { return 11 }
24 if nx_tp_tier_is_cpu_memory(NX_TP_TIER_RAM_WARM) != 1 { return 12 }
25 if nx_tp_tier_is_cpu_memory(NX_TP_TIER_VRAM_HOT) != 0 { return 13 }
26 if nx_tp_tier_is_cold(NX_TP_TIER_NVME_MMAP) != 1 { return 14 }
27 if nx_tp_tier_is_cold(NX_TP_TIER_NETWORK_PEER) != 1 { return 15 }
28 if nx_tp_tier_is_cold(NX_TP_TIER_VRAM_HOT) != 0 { return 16 }
29
30 // 3: construction -- RTX 5080 16GB VRAM, 64GB RAM example budgets
31 let r: *NxPlacementRegistry = nx_tp_new(64, 8000, 8000, 32000, 32000, 1000000)
32 if r.capacity != 64 { return 17 }
33 if r.n_placements != 0 { return 18 }
34 if r.vram_hot_budget != 8000 { return 19 }
35 if r.ram_warm_budget != 32000 { return 20 }
36
37 if nx_tp_new(0, 1, 1, 1, 1, 1) != (0 as *NxPlacementRegistry) { return 21 }
38
39 // 4: register a tensor in VRAM_WARM
40 if nx_tp_register(r, 1001, NX_TP_TIER_VRAM_WARM, 4000, 0xCAFE, now) != NX_TP_V_OK { return 22 }
41 if r.n_placements != 1 { return 23 }
42
43 // 5: find it
44 let t1: *NxTensorPlacement = nx_tp_find(r, 1001)
45 if t1.tier != NX_TP_TIER_VRAM_WARM { return 24 }
46 if t1.bytes != 4000 { return 25 }
47 if t1.pinned != 0 { return 26 }
48 if t1.access_count != 0 { return 27 }
49
50 // 6: invalid tier rejected
51 if nx_tp_register(r, 1002, 99, 100, 0, now) != NX_TP_V_INVALID { return 28 }
52 if nx_tp_register(r, 0, NX_TP_TIER_RAM_HOT, 100, 0, now) != NX_TP_V_INVALID { return 29 }
53
54 // 7: touch -- access_count increments + last_touched_us updates
55 if nx_tp_touch(r, 1001, now + 100) != NX_TP_V_OK { return 30 }
56 if nx_tp_touch(r, 1001, now + 200) != NX_TP_V_OK { return 31 }
57 let t1b: *NxTensorPlacement = nx_tp_find(r, 1001)
58 if t1b.access_count != 2 { return 32 }
59 if t1b.last_touched_us != (now + 200) { return 33 }
60
61 // 8: promote VRAM_WARM -> VRAM_HOT. vram_hot_budget=8000, current used=0, need 4000 -> OK
62 if nx_tp_promote(r, 1001, NX_TP_TIER_VRAM_HOT, 0xBEEF, now + 300) != NX_TP_V_PROMOTED { return 34 }
63 let t1c: *NxTensorPlacement = nx_tp_find(r, 1001)
64 if t1c.tier != NX_TP_TIER_VRAM_HOT { return 35 }
65 if t1c.home_address != 0xBEEF { return 36 }
66
67 // 9: tier accounting
68 if nx_tp_bytes_in_tier(r, NX_TP_TIER_VRAM_HOT) != 4000 { return 37 }
69 if nx_tp_bytes_in_tier(r, NX_TP_TIER_VRAM_WARM) != 0 { return 38 }
70 if nx_tp_count_in_tier(r, NX_TP_TIER_VRAM_HOT) != 1 { return 39 }
71
72 // 10: budget exhaustion -- register another big tensor in RAM_HOT then try to promote to VRAM_HOT
73 nx_tp_register(r, 1002, NX_TP_TIER_RAM_HOT, 6000, 0, now)
74 // VRAM_HOT now has 4000, budget 8000; promoting 6000-byte tensor would need 10000 -> NO_BUDGET
75 if nx_tp_promote(r, 1002, NX_TP_TIER_VRAM_HOT, 0, now) != NX_TP_V_NO_BUDGET { return 40 }
76 // Tier unchanged
77 let t2: *NxTensorPlacement = nx_tp_find(r, 1002)
78 if t2.tier != NX_TP_TIER_RAM_HOT { return 41 }
79
80 // 11: promote to same tier or colder rejected
81 if nx_tp_promote(r, 1001, NX_TP_TIER_VRAM_HOT, 0, now) != NX_TP_V_INVALID { return 42 }
82 if nx_tp_promote(r, 1001, NX_TP_TIER_RAM_HOT, 0, now) != NX_TP_V_INVALID { return 43 }
83
84 // 12: demote VRAM_HOT -> RAM_WARM
85 if nx_tp_demote(r, 1001, NX_TP_TIER_RAM_WARM, 0xDEAD, now + 400) != NX_TP_V_DEMOTED { return 44 }
86 let t1d: *NxTensorPlacement = nx_tp_find(r, 1001)
87 if t1d.tier != NX_TP_TIER_RAM_WARM { return 45 }
88 if nx_tp_bytes_in_tier(r, NX_TP_TIER_VRAM_HOT) != 0 { return 46 }
89 if nx_tp_bytes_in_tier(r, NX_TP_TIER_RAM_WARM) != 4000 { return 47 }
90
91 // 13: pin + try demote
92 if nx_tp_pin(r, 1002) != NX_TP_V_OK { return 48 }
93 let t2_pin: *NxTensorPlacement = nx_tp_find(r, 1002)
94 if t2_pin.pinned != 1 { return 49 }
95 if nx_tp_demote(r, 1002, NX_TP_TIER_NVME_MMAP, 0, now) != NX_TP_V_REFUSED_HOTLOCK { return 50 }
96 if nx_tp_unpin(r, 1002) != NX_TP_V_OK { return 51 }
97 if nx_tp_demote(r, 1002, NX_TP_TIER_NVME_MMAP, 0, now) != NX_TP_V_DEMOTED { return 52 }
98
99 // 14: demote to same or hotter rejected
100 nx_tp_register(r, 1003, NX_TP_TIER_RAM_HOT, 100, 0, now)
101 if nx_tp_demote(r, 1003, NX_TP_TIER_RAM_HOT, 0, now) != NX_TP_V_INVALID { return 53 }
102 if nx_tp_demote(r, 1003, NX_TP_TIER_VRAM_HOT, 0, now) != NX_TP_V_INVALID { return 54 }
103
104 // 15: tier pressure -- VRAM_HOT used=0/8000 = 0; RAM_WARM used=4000/32000 = Q10 128
105 if nx_tp_tier_pressure_q10(r, NX_TP_TIER_VRAM_HOT) != 0 { return 55 }
106 let ram_warm_pressure: nx_int = nx_tp_tier_pressure_q10(r, NX_TP_TIER_RAM_WARM)
107 if ram_warm_pressure != 128 { return 56 }
108
109 // 16: capacity exceeded
110 let r_full: *NxPlacementRegistry = nx_tp_new(2, 1000, 1000, 1000, 1000, 1000)
111 nx_tp_register(r_full, 1, NX_TP_TIER_RAM_HOT, 10, 0, now)
112 nx_tp_register(r_full, 2, NX_TP_TIER_RAM_HOT, 10, 0, now)
113 if nx_tp_register(r_full, 3, NX_TP_TIER_RAM_HOT, 10, 0, now) != NX_TP_V_INVALID { return 57 }
114
115 // 17: null handling
116 let null_r: *NxPlacementRegistry = (0 as i64) as *NxPlacementRegistry
117 if nx_tp_register(null_r, 1, NX_TP_TIER_RAM_HOT, 100, 0, now) != NX_TP_V_NULL { return 58 }
118 if (nx_tp_find(null_r, 1) as i64) != 0 { return 59 }
119 if nx_tp_touch(null_r, 1, now) != NX_TP_V_NULL { return 60 }
120 if nx_tp_promote(null_r, 1, NX_TP_TIER_VRAM_HOT, 0, now) != NX_TP_V_NULL { return 61 }
121 if nx_tp_demote(null_r, 1, NX_TP_TIER_RAM_WARM, 0, now) != NX_TP_V_NULL { return 62 }
122 if nx_tp_pin(null_r, 1) != NX_TP_V_NULL { return 63 }
123 if nx_tp_unpin(null_r, 1) != NX_TP_V_NULL { return 64 }
124 if nx_tp_bytes_in_tier(null_r, NX_TP_TIER_VRAM_HOT) != 0 { return 65 }
125 if nx_tp_count_in_tier(null_r, NX_TP_TIER_VRAM_HOT) != 0 { return 66 }
126 if nx_tp_tier_pressure_q10(null_r, NX_TP_TIER_VRAM_HOT) != 0 { return 67 }
127
128 // 18: unknown id refused
129 if nx_tp_touch(r, 9999, now) != NX_TP_V_INVALID { return 68 }
130 if nx_tp_pin(r, 9999) != NX_TP_V_INVALID { return 69 }
131 if nx_tp_promote(r, 9999, NX_TP_TIER_VRAM_HOT, 0, now) != NX_TP_V_INVALID { return 70 }
132
133 return 0
134}