LATX, opt: add optional vpaes translation#291
Conversation
luzeng87
left a comment
There was a problem hiding this comment.
PR #291 审查 — vpaes AES-NI 向量表加速
作者: phorcys | POC | 1 提交, 10 文件
概述
用 OpenSSL vpaes 算法替换 AES-NI helper 函数调用。AES 轮函数改为 LA LSX/LASX SIMD 指令 + 查找表实现,避免 helper 调用开销。CBC/ECB/CTR 6-7x 提升,GCM 2.5-3x。
核心问题
1. AOT 重定位破损
[LOAD_VPAES_ENC_TABLES] = (void *)0,
// ... 5 个新表地址全部 = NULL
AOT 模式下 vpaes 崩溃。要么实现重定位(存实际表地址),要么标记 vpaes 与 AOT 不兼容。POC 可接受,合入前须修。
2. 每指令重复加载表
每条 AES 指令 vpaes_load_tables_lsx() 加载 7-9 张表 + vpaes_spill_low_fprs() 保存 FPR 0-7 → 计算 → vpaes_restore_low_fprs() 恢复。AES-128 10 轮 = 10 次完整表加载 + FPR spill。
优化方向:同 TB 内缓存表只加载一次;高 FPR 驻留表省去 spill/restore。
3. FPR 冲突
低 FPR 0-7 与 x86 FPU/MMX 共享,每次 spill 开销大。表加载到高 FPR (16-31) 可彻底省掉 spill。
4. GCM 瓶颈在 pclmulqdq
GCM 2.5x vs CBC 7x — GHASH 的 pclmulqdq 未优化。
次要
tr-avx.c纯格式化改动(无功能变更)- 缺 LSX 功能检查:CPU 不支持 LSX 时打开 vpaes 应回退或报错
总结
| 项目 | 评价 |
|---|---|
| 性能 | CBC/ECB/CTR 6-7x |
| AOT 兼容 | 破损 |
| 表重复加载 | POC 最大优化点 |
| FPR spill | 高 FPR 驻留可省 |
| 集成方式 | 开关可控、隔离干净 |
合入前提: AOT 表地址修正 + 同 TB 内表只加载一次。其余可后续。
|
我尝试了跨指令时候保持 f0-f7的表缓存.
获得的性能提升则不多, 只有ecb 略高, 估计是因为ecb的aes-ni指令比较密集.
我感觉:"是不是就让它每次都重新加载好了. 至少比c helper 快5-6倍? 而且不会带来一堆脏东西." |
|
ok, 把LOAD_VPAES_*这几个重定位项加上。让AOT可用即可。 |
|
已更新. |
Using openssl's vpaes to accel latx aes-ni emu.
This is a POC, tables are load in each inst, vr0-vr7 are purge/loaded too.
But it still gain great improment.
Table should be cached cross insts (maybe keep in tb)
GCM need faster pclmulqdq emu to accel.
running x64 openssl speed -evp aes-{128,192,256}-{cbc,ecb,ctr,gcm}