code wiki / (root) / nx_aesctr_ni_bench.nx

nx_aesctr_ni_bench.nx source

↩ module page · 86 lines · 3173 B

1// nx_aesctr_ni_bench.nx -- direct 1:1 speedup of the AES-GCM hot path (AES-CTR block 2// encryption): software aes128_encrypt_block vs hardware __aes128_enc_block, same key, 3// same buffer, same tools. Must be compiled by the AES-NI-capable toolchain. 4// 5// expect_exit: 0 (prints both throughputs; exits nonzero only on a correctness mismatch) 6 7import "nx_syscalls.nx" 8import "nx_aes128_gcm.nx" 9const K_MAGIC_2970000: i64 = 2970000 10const K_MAGIC_1000000: i64 = 1000000 11 12func b_ps(s: *u8, n: i64) -> i64 { sys_write(1, s, n); return 0 } 13func b_pn(v: i64) -> i64 { 14 let b: *u8 = sys_mmap(24) 15 var x: i64 = v 16 if x < 0 { x = 0 - x } 17 var i: i64 = 22 18 if x == 0 { b[i] = 0x30 as u8; i = i - 1 } 19 else { while x > 0 { b[i] = (0x30 + (x - (x/10)*10)) as u8; x = x / 10; i = i - 1 } } 20 sys_write(1, ((b as i64) + i + 1) as *u8, 22 - i) 21 return 0 22} 23 24func main() -> i64 { 25 let key: *u8 = sys_mmap(16) 26 var i: i64 = 0 27 while i < 16 { key[i] = (i + 1) as u8; i = i + 1 } 28 let sched: *u8 = sys_mmap(176) 29 aes128_expand_key(key, sched) 30 31 // --- correctness cross-check: software vs AES-NI on one block must match --- 32 let sw: *u8 = sys_mmap(16) 33 let blk: *u8 = sys_mmap(16) 34 let ctr0: *u8 = sys_mmap(16) 35 i = 0 36 while i < 16 { ctr0[i] = (i * 3 + 1) as u8; i = i + 1 } 37 aes128_encrypt_block(ctr0, sched, sw) // software 38 i = 0 39 while i < 16 { blk[i] = ctr0[i]; i = i + 1 } 40 let cz: i64 = __aes128_enc_block(blk, sched) // hardware (in place) 41 i = 0 42 while i < 16 { 43 if (sw[i]&0xff) != (blk[i]&0xff) { b_ps("MISMATCH at " as *u8, 12); b_pn(i); b_ps("\n" as *u8, 1); sys_exit(1); return 1 } 44 i = i + 1 45 } 46 b_ps("xcheck OK (software == AES-NI)\n" as *u8, 30) 47 48 let N: i64 = K_MAGIC_2970000 49 let ctr: *u8 = sys_mmap(16) 50 let ks: *u8 = sys_mmap(16) 51 let mb: i64 = N / K_MAGIC_1000000 52 53 // --- software AES-CTR --- 54 i = 0 55 while i < 16 { ctr[i] = 0; i = i + 1 } 56 let t0: i64 = sys_now_ms() 57 var pos: i64 = 0 58 while pos < N { aes128_encrypt_block(ctr, sched, ks); nx_aes128_gcm_inc32(ctr); pos = pos + 16 } 59 let t1: i64 = sys_now_ms() 60 61 // --- hardware AES-NI CTR --- 62 i = 0 63 while i < 16 { ctr[i] = 0; i = i + 1 } 64 let t2: i64 = sys_now_ms() 65 pos = 0 66 while pos < N { 67 var b: i64 = 0 68 while b < 16 { ks[b] = ctr[b]; b = b + 1 } 69 let r: i64 = __aes128_enc_block(ks, sched) 70 nx_aes128_gcm_inc32(ctr) 71 pos = pos + 16 72 } 73 let t3: i64 = sys_now_ms() 74 75 let sw_ms: i64 = t1 - t0 76 let ni_ms: i64 = t3 - t2 77 b_ps("software AES-CTR " as *u8, 17); b_pn(mb); b_ps("MB = " as *u8, 5); b_pn(sw_ms); b_ps("ms" as *u8, 2) 78 if sw_ms > 0 { b_ps(" (" as *u8, 3); b_pn((N/1000)/sw_ms); b_ps(" KB/s)" as *u8, 6) } 79 b_ps("\n" as *u8, 1) 80 b_ps("AES-NI AES-CTR " as *u8, 17); b_pn(mb); b_ps("MB = " as *u8, 5); b_pn(ni_ms); b_ps("ms" as *u8, 2) 81 if ni_ms > 0 { b_ps(" (" as *u8, 3); b_pn((N/1000)/ni_ms); b_ps(" KB/s)" as *u8, 6) } 82 b_ps("\n" as *u8, 1) 83 if ni_ms > 0 { b_ps("speedup x" as *u8, 9); b_pn(sw_ms / ni_ms); b_ps("\n" as *u8, 1) } 84 sys_exit(0) 85 return 0 86}