fractalyze/prime-ir
GitHub: fractalyze/prime-ir
PrimeIR 是基于 MLIR 构建的密码学计算中间表示,旨在通过保留数学语义的高级抽象实现密码学运算的自动化优化与异构后端代码生成。
Stars: 21 | Forks: 1
# PrimeIR
[](https://github.com/fractalyze/prime-ir/actions/workflows/ci.yml)
**PrimeIR** 是一个用于密码学计算的中间表示 (IR),构建于
[MLIR (多级中间表示)](https://mlir.llvm.org/) 之上。
PrimeIR 最初是为零知识 (ZK) 证明系统开发的,现已发展为支持更广泛的密码学应用,包括同态加密、数字签名以及其他基于素数域的协议。
PrimeIR 的核心目标是启用特定领域的自动化优化,并高效支持多样的、异构的后端,而无需对目标进行任何额外的微调。
## 动机
密码学系统通常需要特定领域的算术运算,例如域乘法或模逆。这些运算很难在像 LLVM IR 这样的低级 IR 层面上表达和优化。
相比之下,具备密码学感知能力的高级 IR 能够保留代数结构和开发者的意图,从而提供以下优势:
- **特定领域的优化**:MLIR 允许我们设计一种保留数学语义的领域特定语言 (DSL)。这使得诸如 $-(-x) = x$ 的简化成为可能。
- **硬件抽象**:MLIR 在设计之初就考虑了可扩展性,并为各种硬件目标提供了专用的 dialect——包括
[NVGPU](https://mlir.llvm.org/docs/Dialects/NVGPU/)、
[SPIR-V](https://mlir.llvm.org/docs/Dialects/SPIR-V/) 和
[AMDGPU](https://mlir.llvm.org/docs/Dialects/AMDGPU/)。这使得算法逻辑和特定于后端的代码生成之间能够实现清晰的分离。
PrimeIR 基于这一优势,允许高级计算和密码学运算的表达独立于其执行环境。这使得以下功能成为可能:
- **将相同的 IR 重新定向**到多个硬件后端(CPU、GPU、FPGA),而无需重写逻辑。
- **对 lowering 策略进行细粒度控制**,例如根据目标硬件使用不同的流水线和分块策略。
- **面向未来的集成**,支持密码学加速器或分布式计算平台。
PrimeIR 没有将密码学计算强制通过以 CPU 为中心的路径,而是使得定义**具有硬件感知但与后端无关的 IR** 成为可能,从而在各种设备上保持性能和准确性。
## 状态
- ✅:已完成
- 🟡:进行中
- ⚪:尚未开始
### [ModArith](/prime_ir/Dialect/ModArith/IR/ModArithOps.td)
- ✅ 快速 Montgomery 乘法
- ✅ Bernstein-Yang 批量求逆
- 🟡 专用 SIMD
- ✅ AVX512
- 🟡 ARM Neon
- ⚪ AVX2
- ⚪ DataFlow 分析
- Range 分析
- Montgomery 转换分析
### [Field](/prime_ir/Dialect/Field/IR/FieldOps.td)
- ✅ 素数域运算 (加法、倍乘、减法、取负、乘法、求逆、幂运算,...)
- ⚪ 二进制域运算
- 🟡 扩展域运算
- ✅ 二次扩展域运算
- ✅ 三次扩展域运算
- ✅ 四次扩展域运算
- 🟡 五次扩展域运算
### [TensorExt](/prime_ir/Dialect/TensorExt/IR/TensorExtOps.td)
- ✅ 位反转规范化
### [Elliptic Curve](/prime_ir/Dialect/EllipticCurve/IR/EllipticCurveOps.td)
- ✅ 群运算 (加法、倍乘、减法、取负、标量乘法,...)
- ✅ MSM
### [Poly](/prime_ir/Dialect/Poly/IR/PolyOps.td)
- ✅ NTT / INTT
## 前置条件
1. 请遵循 [bazel 安装指南](https://bazel.build/install)。
2. 安装用于 benchmark 的可选依赖。
- Ubuntu
sudo apt install libomp-dev
- Macos
brew install libomp
## 构建说明
1. 克隆 PrimeIR 仓库
git clone https://github.com/fractalyze/prime-ir
2. 构建 PrimeIR
bazel build //...
3. 运行一个测试优化:
创建一个测试输入文件 `negate.mlir`:
cat > negate.mlir <
func.func @negate(%a: !PF) -> !PF {
%0 = field.negate %a : !PF
%1 = field.negate %0 : !PF
return %1 : !PF
}
EOF
运行优化器:
bazel run //tools:prime-ir-opt -- --canonicalize $(pwd)/negate.mlir
预期输出:
!pf11 = !field.pf<11 : i32>
module {
func.func @negate(%arg0: !pf11) -> !pf11 {
return %arg0 : !pf11
}
}
## 社区
构建一个庞大的密码学编译器需要更广泛生态系统的协作——我们非常乐意让您参与到 PrimeIR 的塑造中来。请参阅
[fractalyze/CONTRIBUTING.md](https://github.com/fractalyze/.github/blob/main/CONTRIBUTING.md)
以获取一般性指南;如果您计划更新我们内置的 LLVM 补丁,或者需要关于如何使用外部 LLVM 检出的指导,请参阅此仓库中的 `CONTRIBUTING.md`。
我们使用 GitHub Issues 和 Pull Requests 来协调开发,较长时间的讨论在
[讨论区](https://github.com/fractalyze/prime-ir/discussions) 中进行。
标签:MLIR, 同态加密, 密码学, 异构计算, 手动系统调用, 编译器中间表示, 零知识证明