nx_bench_core_test.nx source
↩ module page · 172 lines · 6150 B
1// nx_bench_core_test.nx -- KAT for B1 bench harness.
2
3import "nx_syscalls.nx"
4import "nx_etg.nx"
5import "nx_perf_pathology.nx"
6import "nx_bench_core.nx"
7
8func main() -> i64 {
9 let samples_buf: *u8 = sys_mmap(256)
10 let samples: *i64 = samples_buf as *i64
11 let result_buf: *u8 = sys_mmap(128)
12 let result: *NxBenchResult = result_buf as *NxBenchResult
13 let entry_buf: *u8 = sys_mmap(128)
14 let entry: *NxEtgEntry = entry_buf as *NxEtgEntry
15 let signals_buf: *u8 = sys_mmap(256)
16 let signals: *NxPerfSignals = signals_buf as *NxPerfSignals
17
18 // ----- T1 OPTIMAL: median inside band, no waste signals -----
19 samples[0] = 105; samples[1] = 95; samples[2] = 100
20 samples[3] = 110; samples[4] = 90; samples[5] = 98
21 samples[6] = 102
22 nx_perf_signals_init(signals)
23 signals.cpu_pct = 50
24 signals.mem_bw_pct = 40
25 let rc1: i64 = nx_bench_record_samples(
26 result, entry, samples, 7,
27 80, 120, // band 80..120 ns
28 signals,
29 NX_ETG_PROBE_CPU_SYSCALL,
30 0xDEADBEEF, 1, 12345
31 )
32 if rc1 != 0 { return 1 }
33 if result.in_band != 1 { return 2 }
34 if result.pathology != NX_PERF_PATH_OPTIMAL { return 3 }
35 if entry.outcome != NX_ETG_OUTCOME_CONFIRMED { return 4 }
36 if result.median_ns != 100 { return 5 } // sorted middle
37 if result.min_ns != 90 { return 6 }
38 if result.max_ns != 110 { return 7 }
39 if result.attestation_hash == 0 { return 8 }
40
41 // ----- T2 BOTTLENECK_CPU: out of band + CPU saturated -----
42 samples[0] = 500; samples[1] = 450; samples[2] = 480
43 samples[3] = 520; samples[4] = 470
44 nx_perf_signals_init(signals)
45 signals.cpu_pct = 99
46 signals.mem_bw_pct = 10
47 let rc2: i64 = nx_bench_record_samples(
48 result, entry, samples, 5,
49 50, 200, // band 50..200 ns -- way under measured
50 signals,
51 NX_ETG_PROBE_CPU_ISA,
52 0xDEADBEEF, 1, 12345
53 )
54 if rc2 != 0 { return 20 }
55 if result.in_band != 0 { return 21 }
56 if result.pathology != NX_PERF_PATH_BOTTLENECK_CPU { return 22 }
57 if entry.outcome != NX_ETG_OUTCOME_FALSIFIED { return 23 }
58
59 // ----- T3 LATENCY_SPIKE: tail signal dominates -----
60 samples[0] = 100; samples[1] = 105; samples[2] = 95
61 samples[3] = 110; samples[4] = 102
62 nx_perf_signals_init(signals)
63 signals.tail_p99_over_p50 = 1500
64 let rc3: i64 = nx_bench_record_samples(
65 result, entry, samples, 5,
66 80, 120,
67 signals,
68 NX_ETG_PROBE_CPU_SYSCALL,
69 0xDEADBEEF, 1, 12345
70 )
71 if rc3 != 0 { return 30 }
72 if result.pathology != NX_PERF_PATH_LATENCY_SPIKE { return 31 }
73 if entry.outcome != NX_ETG_OUTCOME_FALSIFIED { return 32 }
74
75 // ----- T4 PAYWALL_HONORED: reclamation cardinal pathology -----
76 samples[0] = 100; samples[1] = 105; samples[2] = 95
77 samples[3] = 110; samples[4] = 102
78 nx_perf_signals_init(signals)
79 signals.paywall_responsive = 1
80 let rc4: i64 = nx_bench_record_samples(
81 result, entry, samples, 5,
82 80, 120,
83 signals,
84 NX_ETG_PROBE_GPU_TENSOR,
85 0xDEADBEEF, 1, 12345
86 )
87 if rc4 != 0 { return 40 }
88 if result.pathology != NX_PERF_PATH_VENDOR_PAYWALL_HONORED { return 41 }
89 if entry.outcome != NX_ETG_OUTCOME_PAYWALLED_BUT_RESPONSIVE { return 42 }
90
91 // ----- T5 TOO_FEW_SAMPLES error -----
92 samples[0] = 100; samples[1] = 105
93 nx_perf_signals_init(signals)
94 let rc5: i64 = nx_bench_record_samples(
95 result, entry, samples, 2, // below MIN_MEASURED=3
96 80, 120,
97 signals,
98 NX_ETG_PROBE_CPU_SYSCALL,
99 0xDEADBEEF, 1, 12345
100 )
101 if rc5 != NX_BENCH_ERR_TOO_FEW_SAMPLES { return 50 }
102
103 // ----- T6 BAD_BAND (lower > upper) -----
104 samples[0] = 100; samples[1] = 105; samples[2] = 95
105 let rc6: i64 = nx_bench_record_samples(
106 result, entry, samples, 3,
107 200, 100, // inverted band
108 signals,
109 NX_ETG_PROBE_CPU_SYSCALL,
110 0xDEADBEEF, 1, 12345
111 )
112 if rc6 != NX_BENCH_ERR_BAD_BAND { return 60 }
113
114 // ----- T7 Median + p99 indices on 10-sample run -----
115 samples[0] = 50; samples[1] = 60; samples[2] = 70
116 samples[3] = 80; samples[4] = 90; samples[5] = 100
117 samples[6] = 110; samples[7] = 120; samples[8] = 130
118 samples[9] = 200
119 nx_perf_signals_init(signals)
120 signals.cpu_pct = 50
121 let rc7: i64 = nx_bench_record_samples(
122 result, entry, samples, 10,
123 50, 200,
124 signals,
125 NX_ETG_PROBE_CPU_SYSCALL,
126 0xDEADBEEF, 1, 12345
127 )
128 if rc7 != 0 { return 70 }
129 if result.n_measured != 10 { return 71 }
130 if result.min_ns != 50 { return 72 }
131 if result.max_ns != 200 { return 73 }
132 // median index = 10/2 = 5; sorted samples[5] = 100
133 if result.median_ns != 100 { return 74 }
134 // p99 with N<100 collapses to max = 200
135 if result.p99_ns != 200 { return 75 }
136
137 // ----- T8 Attestation deterministic across two identical calls -----
138 samples[0] = 100; samples[1] = 105; samples[2] = 95
139 samples[3] = 110; samples[4] = 102
140 nx_perf_signals_init(signals)
141 signals.cpu_pct = 50
142 let rc8a: i64 = nx_bench_record_samples(
143 result, entry, samples, 5,
144 80, 120,
145 signals,
146 NX_ETG_PROBE_CPU_SYSCALL,
147 0xCAFEBABE, 1, 99999
148 )
149 if rc8a != 0 { return 80 }
150 let hash_a: i64 = entry.attestation_hash
151
152 samples[0] = 100; samples[1] = 105; samples[2] = 95
153 samples[3] = 110; samples[4] = 102
154 nx_perf_signals_init(signals)
155 signals.cpu_pct = 50
156 let entry2_buf: *u8 = sys_mmap(128)
157 let entry2: *NxEtgEntry = entry2_buf as *NxEtgEntry
158 let result2_buf: *u8 = sys_mmap(128)
159 let result2: *NxBenchResult = result2_buf as *NxBenchResult
160 let rc8b: i64 = nx_bench_record_samples(
161 result2, entry2, samples, 5,
162 80, 120,
163 signals,
164 NX_ETG_PROBE_CPU_SYSCALL,
165 0xCAFEBABE, 1, 99999
166 )
167 if rc8b != 0 { return 81 }
168 if entry2.attestation_hash != hash_a { return 82 }
169 if result2.pathology != result.pathology { return 83 }
170
171 return 0
172}