Keccak-f1600 置换加速:CANN Crypto 如何批量处理 1600 位状态
Keccak-f1600 置换加速CANN Crypto 如何批量处理 1600 位状态【免费下载链接】cryptocrypto SIG 是密码学兴趣小组围绕昇腾 NPU 打造高性能密码软件库提供丰富的密码算子与算法实现项目地址: https://gitcode.com/cann/cryptoCANN crypto 是面向昇腾 NPU 的开源密码软件库其中的 KeccakF1600Tensor 算子专门解决 Keccak-f1600 置换的批量加速问题一次调用即可在 NPU 上对多达 8192 个 1600 位状态同时执行 24 轮置换为 SHA-3、SHAKE 等哈希算法提供高速的底层原语。为什么需要 Keccak-f1600 批量算子Keccak-f[1600] 是 SHA-3 与 SHAKE 家族哈希算法的核心置换函数它把 1600 位状态5×5 网格、共 25 条 64 位 lane反复打乱 24 轮每轮包含 θ、ρ、π、χ、ι 五个子步骤。CPU 上一次只能处理一个状态而 NPU 的优势在于大规模并行。CANN Crypto 的 keccak/ 模块把批量置换封装成标准 ACLNN 算子 aclnnKeccakF1600Tensor让上万个状态像张量一样喂给向量单元同时计算。 注意该算子只做置换本身不含消息吸收、填充padding和输出挤出需要完整哈希语义时可组合使用或参考 shake/ 等上层实现。算子长什么样[50, B]张量约定算子把多个状态压进一张二维 UINT32 张量输入输出形状均为[50, B]维度含义第 1 维50 行25 条 64 位 lane每条拆成低 32 位、高 32 位各占一行lane u 5v第 2 维B 列批内 B 个状态沿行方向连续存放这种一行一个 32 位半字的排布是关键技巧之一Ascend 向量单元天然以 32 位字为处理粒度把 64 位 lane 拆成两半后每条 lane 的低位、高位都能被向量指令整组处理无需跨字进位拼接。完整数据布局说明见 README接口细节见 docs/aclnnKeccakF1600Tensor.md。NPU 上的批量加速技巧分块并行256 个状态一个 tileKernel 按 tile 切分批量数据每个 tile 固定 256 个状态常量TILE见 keccak_f1600_u32_vector.h。所有 AI Core 按blockIdx起始、blockNum步长认领 tile循环直到整批处理完毕——分块逻辑见 keccak_f1600_tensor.h 的Process。主机侧的 Tiling 函数 会算出 tile 总数并与芯片 AIV 核数取小决定实际并行的 block 数B 最大 8192对应最多 32 个 tile。向量单元逐 lane 并行每一轮置换的 25 条 lane 都被展开成 50 个 32 位slot在向量单元V 核上用Xor、And、Or、ShiftLeft/ShiftRight等整组指令对 B 个状态一次性完成例如 64 位循环左移被拆成低字左移 高字右移 31 位再或合的向量操作RotlLaneTokeccak_f1600_u32_vector.h。所有中间量都驻留在本地统一缓冲区中共 126 个 slot状态 50 B/C/D 临时区 旋转暂存区避免反复访问片外内存这是批量场景下吞吐量的主要来源。24 轮置换的五步拆解Round函数keccak_f1600_u32_vector.h严格按密码标准实现每轮的五个子步骤θ列奇偶按列异或出 C 值高低 32 位各自独立累加ρπ旋转置换25 条 lane 的旋转量与目标位置在编译期静态展开为 25 条直接调用省掉运行时的旋转表索引χ非线性采用等价式B[x] ^ B[x2] ^ (B[x1] B[x2])复用 θ 阶段用过的 C、D 槽位ι轮常量仅对第一个 lane 异或 24 个固定 64 位常量RC[round]每轮结束状态原地更新24 轮后整批状态即完成置换Permute24。如何调用两步式 ACLNN 流程调用遵循标准两段式先 aclnnKeccakF1600TensorGetWorkspaceSize 查询工作空间并生成 executor再调aclnnKeccakF1600Tensor把计算提交到 ACL 流。约束要点1 ≤ B ≤ 8192输入输出形状一致且互不重叠不支持原地计算设备验证使用 CANN 9.1.0支持 Atlas A2ascend910b与 A3ascend910_93同步完成前不得释放张量与工作空间完整可运行示例见 test_aclnn_keccak_f1600_tensor.cpp配套的 acl_example.h 封装了流、缓冲区与张量管理几十行即可完成一次批量置换并校验全零初态的结果首 lane 应为0xf1258f7940e1dde7。验证从纯 C 参考到设备实测算子正确性由多层测试保障详见 tests/README.md层级内容golden.pyPython 独立置换实现 全零初态已知答案sha3_ref.c纯 C 参考实现仅参与测试test_permutation.cpp928 个状态比对生产置换头与参考算术模型test_aclnn_keccak.cppACLNN 设备结果与纯 C 参考逐字节对比覆盖 batch 64/256/1024/4096/8192相关文件导航 接口文档aclnnKeccakF1600Tensor.md算子定义 / 形状推导 / Tilingop_host/Kernel 与向量化置换keccak_f1600_tensor.cpp、keccak_f1600_u32_vector.h示例与测试examples/、tests/一句话总结CANN Crypto 通过[50, B]张量布局 256 状态分块 32 位半字向量指令三板斧把原本串行的 1600 位置换变成了 NPU 上可以整批并行的高吞吐原语是构建高性能 SHA-3 / SHAKE 管线的理想底座。【免费下载链接】cryptocrypto SIG 是密码学兴趣小组围绕昇腾 NPU 打造高性能密码软件库提供丰富的密码算子与算法实现项目地址: https://gitcode.com/cann/crypto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考