核心问题
现有的FHE方案存在“能力分化”:
算术电路FHE编译器(如BFV和CKKS)计算加法/乘法极快,但无法高效处理比较、分支等非多项式运算及逻辑函数;
逻辑电路FHE编译器(如TFHE)功能完备且易于部署,但计算算术运算极其缓慢;
混合电路FHE 编译器:实现逻辑到算术转换所需的计算成本过高(如,E^3)
研究难点
1. 缺乏统一的中间表示(IR)
算术FHE和逻辑FHE使用完全不同的数据格式(RLWE密文 vs LWE密文)和操作符。现有编译器的IR都是为单一方案设计的,无法同时描述和控制两种方案,更无法在它们之间进行自动转换和优化。
2. 跨方案转换的调度与参数选择极为复杂
何时该用算术FHE?何时该切换为逻辑FHE?
切换需要插入sampleextract(RLWE→LWE)和repack(LWE→RLWE)等昂贵操作。如何编排这些操作以最小化开销,同时为每个密文片段选择最优的加密参数(如模数、环维度)和安全级别,是一个巨大的调度与优化难题。此前没有任何编译器能自动化这个过程。
关键技术
HEIR通过一套基于多层中间表示(MLIR)的创新架构解决了上述难题,其关键技术包括:
1. 基于MLIR的、分层的FHE专用方言体系
高层FHE方言:抽象了同态计算的操作(如FHE.add,FHE.sub)和数据类型(如FHEFloat,FHEVector),屏蔽了底层加密细节,使得程序转换阶段可以专注于逻辑而非密码学。
底层LWE/RLWE方言:精确描述了逻辑FHE和算术FHE的具体操作(如lwe.add,rlwe.mul)和密文类型。这种分层设计使得编译器可以逐步、受控地将高层逻辑降级到底层具体实现,并在过程中插入优化。
2. 自动化的程序分割与类型转换系统
基于运算符的转换:编译器采用一个简单而有效的启发式策略:默认使用LWE密文。当识别到连续、密集的算术运算(特别是向量化运算)时,它会自动将相关变量提升为RLWE密文,并利用repack将多个LWE打包成RLWE,利用sampleextract做反向转换,从而充分利用算术FHE的SIMD能力。
微型repack算法:针对现实应用中常见的“少量”LWE密文打包场景,论文提出了一个轻量级的repack算法(Algorithm 1),它基于自同构和累加,比通用方法更高效,有效降低了方案切换的开销。
3. 面向密文层级管理的引导调度
FHE密文在每次乘法后噪声会增长。论文提出了一种自动化的层级管理算法(Algorithm 2),通过静态分析程序的“定义-使用链”,为每个密文变量计算其所需的“层级”(代表乘法深度)。当层级超过预设阈值时,编译器会自动插入一个逻辑FHE的“可编程引导”(PBS,即查表操作)来重置噪声,从而支持无限深度的同态计算,而无需用户手动干预。
主要结论与创新
HEIR是首个无需DSL、功能完备、自动跨方案编译的FHE编译器
首个无需DSL(领域特定语言)的功能完备FHE编译器:用户只需编写标准C代码,HEIR就能自动生成混合使用CKKS和TFHE的高效同态程序,大大降低了使用门槛。
性能上的压倒性优势:在同时包含算术和逻辑运算的端到端真实应用(如加密数据库查询、K-means聚类)中,HEIR生成的程序运行速度比最先进的逻辑电路编译器(Transpiler)快72倍到179倍。
在纯算术和纯逻辑任务上表现优异:相比顶尖的算术编译器(EVA),HEIR在内积等任务上快1.4-11倍;相比逻辑编译器(Transpiler),在最小值查找等任务上快3.2-4.1倍。
可接受的编译开销:HEIR的编译时间很短(<1秒),与高性能算术编译器相当。虽然内存消耗略高(用于存储更多优化密钥),但换来了巨大的运行时性能提升。
最终结论:通过“统一中间表示 + 自动程序分割 + 智能转换调度”的跨方案编译策略,HEIR成功打破了FHE在可用性与效率之间的长期权衡,为构建实用化的隐私计算系统铺平了道路。
主要创新
| 创新点 | 说明 |
|---|---|
| 统一IR | 基于MLIR构建多层方言体系,统一表达算术和逻辑FHE |
| 自动程序分割 | 自动识别算术密集区和逻辑密集区,分别分配CKKS和TFHE |
| 自动类型转换 | 自动插入方案切换操作(repack / sampleextract) |
| 编码优化 | 自动选择槽编码或系数编码,内积等运算可快1.4~11倍 |
| 层级管理 | 自动分析密文深度,按需调度PBS(可编程引导)重置噪声 |
知识体系
一、隐私计算与全同态加密(FHE)
①FHE核心概念
基本思想:在加密数据上直接计算。
两大主流方案:
算术FHE(以CKKS为例):特点为SIMD、高效算术、基于RLWE问题。擅长:大规模加法和乘法。不擅长:比较、分支、超越函数。
逻辑FHE(以TFHE为例):特点为每个密文1比特、基于LWE问题、可编程引导(PBS)。擅长:任何布尔函数、查表。不擅长:高精度算术。
编码方法:槽编码(SIMD友好)、系数编码(内积/卷积友好)。
关键转换原语:sampleextract(RLWE→LWE)、repack(LWE→RLWE)。
②编译器设计与中间表示(IR)
多层IR架构(MLIR):不同抽象层次用不同dialect表示,每一层解决一个问题,每一层完成一次降级,让优化在正确的层次上发生
静态单赋值(SSA)形式:每个变量只赋值一次,值不会改变。因为编译器做优化时,需要知道值从哪里来、到哪里去。SSA让这种分析变得非常简单。
编译流程:前端(C→IR)→ 中间端(转换+优化)→ 后端(IR→可执行代码)。
编译器先把C代码(前端)转成多层IR,中间用SSA形式方便分析优化,通过dialect(如FHE、RLWE、LWE)逐步降级,最后后端生成可执行代码。
③HEIR的关键技术细节
diaclect设计:FHE 方言 = 意图(做什么)LWE / RLWE 方言 = 方案(如何做)
FHE dialect(最高层,与具体加密方案无关)
LWE dialect(逻辑 FHE,面向 TFHE 类方案):每个密文只加密 1 比特或很小的整数;支持布尔门(AND/OR/NOT)和可编程引导 PBS。程序中的 比较、分支、查表、最小值 等逻辑密集区域被分割到 LWEdialect
RLWE dialect(算术 FHE,面向 CKKS / BFV):一个密文打包很多数值(SIMD);高效的多项式加法和乘法。程序中的大量加法和乘法、向量运算、矩阵运算 等算术密 集区域会使用RLWE dialect
程序分割算法:
分割原因:一个真实程序里算术和逻辑是交织的,必须切块。
识别“算术密集区域”核心思路:从「所有变量都是 LWE 密文」开始,当发现某个变量被连续的、SIMD 友好的算术操作使用时,就把它及其相关变量提升为 RLWE。
微型repack算法:
方案切换需要将多个 LWE 密文(每个加密一个数)打包成一个 RLWE 密文,如果一次性打包很多 LWE(例如 1024 个),可以用基于解密的快速 repack。但很多真实应用(如几个 LWE 密文)不适合这种方法,开销太大。HEIR 提出了微型 repack:专为「小批量」(t 很小,比如 2~8 个)设计,精度高、开销小。
层级管理算法:
在 CKKS 等算术 FHE 中,每个乘法会消耗一个层级,层级用完了,再计算就会出错。引导(bootstrap) 可以重置噪声并恢复层级,但开销大。通过定义‑使用链分析密文深度并调度 PBS (可编程引导) 实现层级管理