NTT 的各类优化:Harvey、PtNTT,Intel AVX2、ARM Neon、GPGPU

参考文献:

  1. [Har14] Harvey D. Faster arithmetic for number-theoretic transforms[J]. Journal of Symbolic Computation, 2014, 60: 113-119.
  2. [Sei18] Seiler G. Faster AVX2 optimized NTT multiplication for Ring-LWE lattice cryptography[J]. Cryptology ePrint Archive, 2018.
  3. [ZXZ+19] Zhou S, Xue H, Zhang D, et al. Preprocess-then-NTT technique and its applications to K yber and N ew H ope[C]//Information Security and Cryptology: 14th International Conference, Inscrypt 2018, Fuzhou, China, December 14-17, 2018, Revised Selected Papers 14. Springer International Publishing, 2019: 117-137.
  4. [ZLP21] Zhu Y, Liu Z, Pan Y. When NTT meets Karatsuba: preprocess-then-NTT technique revisited[C]//International Conference on Information and Communications Security. Cham: Springer International Publishing, 2021: 249-264.
  5. [CHK+21] Chung C M M, Hwang V, Kannwischer M J, et al. NTT multiplication for NTT-unfriendly rings: New speed records for Saber and NTRU on Cortex-M4 and AVX2[J]. IACR Transactions on Cryptographic Hardware and Embedded Systems, 2021: 159-188.
  6. [BHK+21] Becker H, Hwang V, Kannwischer M J, et al. Neon ntt: Faster dilithium, kyber, and saber on cortex-a72 and apple m1[J]. Cryptology ePrint Archive, 2021.
  7. [HLS+22] Hwang V, Liu J, Seiler G, et al. Verified NTT multiplications for NISTPQC KEM lattice finalists: Kyber, SABER, and NTRU[J]. IACR Transactions on Cryptographic Hardware and Embedded Systems, 2022: 718-750.
  8. [DL22] Duong-Ngoc P, Lee H. Configurable mixed-radix number theoretic transform architecture for lattice-based cryptography[J]. IEEE Access, 2022, 10: 12732-12741.
  9. [ZLH+23] Zhao Y, Liu X, Hu Y, et al. Design of an Efficient NTT/INTT Architecture with Low-Complex Memory Mapping Scheme[J]. IEEE Transactions on Circuits and Systems II: Express Briefs, 2023.
  10. 快速乘法技巧:Karatsuba, Toom, Good, Schonhage, Strassen, Nussbaumer
  11. Baby-Step Giant-Step & Homomorphic DFT
  12. ARM NEON技术 - 基础介绍
  13. Tensor Core 和 Cuda Core 的区别
  14. Nvidia Tensor Core-WMMA API 编程入门

文章目录

  • 软件优化
    • Harvey Butterfly
    • Preprocess-then-NTT
    • Improved PtNTT
    • NTT-unfriendly rings
  • 硬件优化
    • Sei18
    • Neon NTT
    • Mixed-radix NTT
    • TensorFHE
    • Others

软件优化

Harvey Butterfly

在 Shoup’s NTL 中,radix-2 NTT 的蝴蝶实现如下:

在这里插入图片描述

它采用了 Barrett 算法的变体,Shoup’s modular multiplication:修改 W ′ ≈ β / p W' \approx \beta/p Wβ/p W ≈ W β / p W \approx W\beta/p WWβ/p,于是 Barrett 取模算法就额外计算了与常数 W W W 的数乘运算。但是这个蝴蝶的 if-else 语句过多,容易使得 CPU 分支预测失败并导致回滚。

[Har14] 提出使用 Z p \mathbb Z_p Zp冗余表示 [ 0 , 2 p ) [0,2p) [0,2p) [ 0 , 4 p ) [0,4p) [0,4p)),从而移除了一些 if-else 语句。正确性要求:Shoup 模乘算法 W T ( m o d β ) WT\pmod\beta WT(modβ),只要求了 0 ≤ T < β 0 \le T < \beta 0T<β,并不需要 T < p T<p T<p,因此只要维持 4 p < β 4p<\beta 4p<β 结果就是正确的。

GS 蝴蝶的实现:

在这里插入图片描述

CT 蝴蝶的实现:

在这里插入图片描述

另外,也可以使用 Montgomery 模乘(而非 Shoup’s Barrett 模乘)去实现蝴蝶,此时也可以继续采取冗余表示:

在这里插入图片描述

Preprocess-then-NTT

[ZXZ+19] 考虑了 Z q \mathbb Z_q Zq 不存在 ζ 2 n \zeta_{2n} ζ2n 的情况,并非采取 Incomplete NTT,而是先对多项式做一些预处理(其实就是 Nussbaumer 转换)

1-Round Preprocess-then-NTT(1PtNTT),给定 f ∈ Z q [ x ] / ( x n + 1 ) f \in \mathbb Z_q[x]/(x^n+1) fZq[x]/(xn+1),那么
ψ : Z q [ x ] / ( x n + 1 ) → ( Z q [ y ] / ( y n / 2 + 1 ) ) [ x ] / ( x 2 − y ) f e v e n ( x 2 ) + x ⋅ f o d d ( x 2 ) ↦ f e v e n ( y ) + f o d d ( y ) ⋅ x \begin{aligned} \psi: \mathbb Z_q[x]/(x^n+1) &\to (\mathbb Z_q[y]/(y^{n/2}+1))[x]/(x^2-y)\\ f_{even}(x^2)+x\cdot f_{odd}(x^2) &\mapsto f_{even}(y)+f_{odd}(y)\cdot x \end{aligned} ψ:Zq[x]/(xn+1)feven(x2)+xfodd(x2)(Zq[y]/(yn/2+1))[x]/(x2y)feven(y)+fodd(y)x
此时,只需要 n ∣ q − 1 n\mid q-1 nq1(而非 2 n ∣ q − 1 2n\mid q-1 2nq1),那么两个系数 f e v e n , f o d d f_{even}, f_{odd} feven,fodd 就可以完全 NTT,即
1 P t N T T ( f ) : = ( N T T ( f e v e n ) , N T T ( f o d d ) ) 1PtNTT(f) := (NTT(f_{even}),\,\, NTT(f_{odd})) 1PtNTT(f):=(NTT(feven),NTT(fodd))
对于多项式乘法,就简单地采取 School 乘法即可。但是为了模 ( x 2 − y ) (x^2-y) (x2y) 方便,[ZXZ+19] 另外计算了 f o d d ′ ( y ) : = y ⋅ f o d d ( y ) f_{odd}'(y):=y \cdot f_{odd}(y) fodd(y):=yfodd(y) 以及它的 NTT 域,那么
h e v e n = f e v e n ⋅ g e v e n + f o d d ⋅ g o d d ′ h o d d = f e v e n ⋅ g o d d + f o d d ⋅ g e v e n \begin{aligned} h_{even} &= f_{even} \cdot g_{even} + f_{odd} \cdot g_{odd}'\\ h_{odd} &= f_{even} \cdot g_{odd} + f_{odd} \cdot g_{even} \end{aligned} hevenhodd=fevengeven+foddgodd=fevengodd+foddgeven
这一共需要计算 f e v e n , f o d d , g e v e n , g o d d , g o d d ′ f_{even},f_{odd},g_{even},g_{odd},g_{odd}' feven,fodd,geven,godd,godd 五个长度为 n / 2 n/2 n/2 的 forward NTT,以及 h e v e n , h o d d h_{even},h_{odd} heven,hodd 两个长度为 n / 2 n/2 n/2 的 inverse NTT。计算复杂度为 7 n / 2 log ⁡ n + 2 n 7n/2\log n+2n 7n/2logn+2n

其实 y ∈ Z p [ y ] / ( y n / 2 + 1 ) y \in \mathbb Z_p[y]/(y^{n/2}+1) yZp[y]/(yn/2+1) 的 NTT 域极其特殊,于是 g o d d ′ g_{odd}' godd 明明可以在 N T T ( g o d d ) NTT(g_{odd}) NTT(godd) 下直接计算出来,这个额外的 forward NTT 是不必要的。2-Round Preprocess-then-NTT(2PtNTT)的计算方法类似,就是采取了 x 4 = y x^4=y x4=y 的变换,此时只要求 n / 2 ∣ q − 1 n/2 \mid q-1 n/2q1 即可。计算复杂度为 15 n / 4 log ⁡ n + 4 n 15n/4\log n+4n 15n/4logn+4n

Improved PtNTT

[ZXZ+19] 实际上是采取了 “跨步” 转换。 [ZLP21] 采取 “聚合” 转换,它称之为 2-Part-Sepration,只需要 n ∣ q − 1 n \mid q-1 nq1(而非 2 n ∣ q − 1 2n\mid q-1 2nq1
KaTeX parse error: Expected 'EOF', got '&' at position 31: …Z_q[x]/(x^n+1) &̲\to& \mathbb Z_…
采取 Karatsuba 算法,
f ↦ ( f 0 , f 0 + f 1 ) g ↦ ( g 0 , g 0 + g 1 ) u : = f 1 g 1 h = f 0 g 0 ⋅ ( 1 − y ) + ( f 0 + f 1 ) ( g 0 + g 1 ) ⋅ x + u ⋅ ( y 2 − y ) = ( f 0 g 0 − u ) + ( ( f 0 + f 1 ) ( g 0 + g 1 ) − f 0 g 0 − u ) ⋅ y \begin{aligned} f &\mapsto (f_0, f_0+f_1)\\ g &\mapsto (g_0, g_0+g_1)\\ u &:= f_1g_1\\ h &= f_0g_0 \cdot (1-y) + (f_0+f_1)(g_0+g_1) \cdot x + u \cdot (y^2-y)\\ &= (f_0g_0-u) + ((f_0+f_1)(g_0+g_1)-f_0g_0-u) \cdot y \end{aligned} fguh(f0,f0+f1)(g0,g0+g1):=f1g1=f0g0(1y)+(f0+f1)(g0+g1)x+u(y2y)=(f0g0u)+((f0+f1)(g0+g1)f0g0u)y
上述算法需要计算 f 0 , f 1 , g 0 , g 1 f_0,f_1,g_0,g_1 f0,f1,g0,g1 四个长度为 n / 2 n/2 n/2 的 forward NTT(应当是模 x n / 2 − y x^{n/2}-y xn/2y 的多项式,没法直接 NTT 啊!),以及 f 0 g 0 , f 1 g 1 , ( f 0 + f 1 ) ( g 0 + g 1 ) f_0g_0,f_1g_1,(f_0+f_1)(g_0+g_1) f0g0,f1g1,(f0+f1)(g0+g1) ( ⋯ ) ⋅ y (\cdots)\cdot y ()y 四个 point-wise mult,其中的 N T T ( y ) NTT(y) NTT(y) 就只是常数而已。得到的 h h h 是长度 n / 2 n/2 n/2 的向量(嗯?明显不正常啊),只需一次 inverse NTT 就可以恢复出 h = f g h=fg h=fg

将它更加细分,
KaTeX parse error: Expected 'EOF', got '&' at position 31: …Z_q[x]/(x^n+1) &̲\to& \mathbb Z_…
此时的 f f f 被转换为 ∑ i f i ( x ) ⋅ y i \sum_i f_i(x) \cdot y^i ifi(x)yi,分成了 2 α 2^\alpha 2α 块。采取类似的乘法技巧,需要 2 α + 1 2^{\alpha+1} 2α+1 次长度为 n / 2 α n/2^\alpha n/2α 的 forward NTT,以及 2 2 α + 2 α + 1 − 4 2^{2\alpha}+2^{\alpha+1}-4 22α+2α+14 次的 point-wise mult,最终得到一个长度为 n / 2 α n/2^\alpha n/2α 的结果(这是什么鬼!),执行一次 inverse NTT。[ZLP21] 说上述算法的复杂度为 5 n log ⁡ n + O ( n ) 5n\log n+O(n) 5nlogn+O(n),而原始 NTT 乘法的复杂度为 3 n log ⁡ n + O ( n ) 3n\log n+O(n) 3nlogn+O(n),因此减速因子是 5 / 3 5/3 5/3

[ZLP21] 另外还对 [ZXZ+19] 进行了优化,也就是不再计算 N T T ( g o d d ′ ) NTT(g_{odd}') NTT(godd),而是使用 N T T ( y ) NTT(y) NTT(y) 计算乘积。多了一次 ponit-wise mult 的开销,但是减少了一次 forward NTT 运算。称其为:1-Round Improved-Preprocess-then-NTT(1IPtNTT),计算复杂度为 6 ⋅ n / 2 log ⁡ ( n / 2 ) + 4 ⋅ n / 2 = 3 n log ⁡ n − n 6\cdot n/2\log(n/2)+4\cdot n/2 = 3n\log n-n 6n/2log(n/2)+4n/2=3nlognn

另外,[ZLP21] 还将它扩展到更加细分, α \alpha α-IPtNTT(其实就是 Nussbaumer 转换),
Z q [ x ] / ( x n + 1 ) ≅ ( Z q [ y ] / ( y n / 2 α + 1 ) ) [ x ] / ( x 2 α − y ) \mathbb Z_q[x]/(x^n+1) \cong (\mathbb Z_q[y]/(y^{n/2^\alpha}+1))[x]/(x^{2^\alpha}-y) Zq[x]/(xn+1)(Zq[y]/(yn/2α+1))[x]/(x2αy)
然后只需 n / 2 α ∣ q − 1 n/2^\alpha \mid q-1 n/2αq1,即可执行长度为 n / 2 α n/2^\alpha n/2α 的完全 NTT,然后 [ZLP21] 采取 School 乘法,计算这个 ( m o d x 2 α − y ) \pmod{x^{2^\alpha}-y} (modx2αy) 的多项式乘法。计算复杂度为 3 n log ⁡ n + ( 3 ⋅ 2 α − 2 − 3 α + 1 / 2 ) ⋅ n 3n\log n + (3 \cdot 2^{\alpha-2}-3\alpha+1/2)\cdot n 3nlogn+(32α23α+1/2)n,如果采取 Karatsuba 算法后面的线性项可以更小一些。

对于 α = 2 , 3 \alpha=2,3 α=2,3,达到最优的复杂度 3 n log ⁡ n − 5 / 2 n 3n\log n-5/2n 3nlogn5/2n,当 n = 1024 n=1024 n=1024 量级,甚至比原始的 NTT 算法的 3 n log ⁡ n + O ( n ) 3n\log n + O(n) 3nlogn+O(n) 还要快不少(比率是 0.887 0.887 0.887)。换句话说,由于多项式的长度变短,蝴蝶层数减少,不完全的 NTT 乘法甚至可能会更快!

NTT-unfriendly rings

[CHK+21] 考虑了 PQC 中 NTT 不友好的 Saber、NTRU、LAC 方案的 NTT 加速实现。

  • Saber 的代数结构 Z q [ x ] / ( x n + 1 ) \mathbb Z_q[x]/(x^n+1) Zq[x]/(xn+1),其中 q = 2 13 q=2^{13} q=213 不是素数,维度 n = 256 n=256 n=256
  • NTRU 的代数结构有三个, Z 3 [ x ] / ( Φ n ( x ) ) \mathbb Z_3[x]/(\Phi_n(x)) Z3[x]/(Φn(x)) Z q [ x ] / ( Φ n ( x ) ) \mathbb Z_q[x]/(\Phi_n(x)) Zq[x]/(Φn(x)) Z q [ x ] / ( Φ 1 ( x ) ⋅ Φ n ( x ) ) \mathbb Z_q[x]/(\Phi_1(x)\cdot\Phi_n(x)) Zq[x]/(Φ1(x)Φn(x)),其中的 n n n 是素数, q = 2 k q=2^k q=2k 不是素数
  • LAC 的代数结构 Z q [ x ] / ( x n + 1 ) \mathbb Z_q[x]/(x^n+1) Zq[x]/(xn+1),其中 q = 251 q=251 q=251 是一种 min-split modulus,它使得 x n + 1 x^n+1 xn+1 仅能分解为两个长度 n / 2 n/2 n/2 的不可约因子

[CHK+21] 考虑的优化技术:Standard CTTwisted GSNegacyclic ConvolutionsIncomplete NTTsGood’s TrickMixed-Radix NTTMultiple Moduli and Explicit CRT

  1. 对 Saber 的优化:切换到很大的模数 q ′ q' q(使得存在恰当的单位根),在 Z q ′ [ x ] / ( x n + 1 ) \mathbb Z_{q'}[x]/(x^n+1) Zq[x]/(xn+1) 上执行不完全 NTT,最后计算 School 乘法。需要立即 InvNTT 并计算模约简,维持结果的正确性。
  2. 对 NTRU 的优化:切换到很大的维度 N N N(使得可以执行 NTT),切换到很大的模数 q ′ q' q(使得存在恰当的单位根),在 Z q ′ [ x ] / ( x N + 1 ) \mathbb Z_{q'}[x]/(x^N+1) Zq[x]/(xN+1) 上利用 Good 和 Mixed-radix 计算不完全 NTT,最后计算 School 乘法。需要立即 InvNTT 并计算模约简,维持结果的正确性。
  3. 对 LAC 的优化:切换到很大的模数 q ′ q' q(使得存在恰当的单位根),在 Z q ′ [ x ] / ( x n + 1 ) \mathbb Z_{q'}[x]/(x^n+1) Zq[x]/(xn+1) 上执行不完全 NTT,最后计算 School 乘法。需要立即 InvNTT 并计算模约简,维持结果的正确性。

采取 AVX2 实现上述的 NTT 乘法,考虑:快速模约简、层融合、延迟模约简、配置寄存器不相互依赖、不同 NTT 技巧的复杂度。

硬件优化

Sei18

[Sei18] 考虑了 Kyber 的 NTT 算法的 AVX2 实现。

首先是 Montgomery 模乘算法的修改:[Mon85] 采用了 q ′ = − q − 1 ( m o d β ) q'=-q^{-1}\pmod\beta q=q1(modβ),计算无符号数的模乘,并保证输出结果是一个非负数。而 [Sei18] 采取了有符号数的变体,它最终的减法恰好消除了低位,没有进位,因此可以只计算高位。这就更加适合 AVX2,更密集的向量化

在这里插入图片描述

其次是专用的模约简,对于 Kyber 采用的素数 q = 7681 q=7681 q=7681,它的二进制表示是稀疏的

在这里插入图片描述

上述算法的输出范围是冗余的 − 2 15 + 4 q ≤ r < 2 15 − 3 q -2^{15}+4q \le r < 2^{15}-3q 215+4qr<2153q,但是足够被用于加法/减法,将输入输出维持在单个 word 内。对于两个 words 的模约简,可以采用 Montgomery 模约简,常数 1 1 1 预计算为 β ( m o d q ) \beta \pmod q β(modq) 即可。

对于一般的素数 q q q,我们也希望只在单个 word 内完成模约简。采取 Barrett 算法:

在这里插入图片描述

它的输出范围是 0 ≤ r ≤ q 0 \le r \le q 0rq(对于 a ≡ 0 ( m o d q ) a\equiv 0\pmod q a0(modq) 会冗余)。另外,假如 step 1 采取了预计算 − v -v v,并修改 step 4 成为 r = a + t r=a+t r=a+t,此时的输出范围是 − q ≤ r ≤ 0 -q \le r \le 0 qr0。通过交错使用这两种 modes,可以维持模加的结果在 [ − q , q ] [-q,q] [q,q] 范围内。

最后是 Lazy reduction:因为 Kyber 的模数满足 4 q < 2 15 = β / 2 4q<2^{15}=\beta/2 4q<215=β/2,因此加法结果可以累积起来,直到它溢出单个 word 之前,才执行一次 Barrett 模约简。在 NTT 中,我们采用了 Montgomery 模乘,它的结果范围是 − q < r ′ < q -q<r'<q q<r<q,因此每一层迭代,系数增长至多为 q q q,从而可以连续 3 3 3 层蝴蝶,累积但不溢出 β / 2 \beta/2 β/2,此时执行模约简依然可以得到正确结果。

Neon NTT

[BHK+21] 对比了 Montgomery 和 Barrett 的关系,提出了 Montgomery 模乘的类比:Barrett 模乘。不过,Shoup’s NTL 中其实已经采用了这种算法。

我们考虑四种 ”整数近似“ 函数:下取整 ⌊ z ⌋ \lfloor z \rfloor z,上取整 ⌈ z ⌉ \lceil z \rceil z,圆整 ⌊ z ⌉ \lfloor z \rceil z,以及 “ 2 Z 2\mathbb Z 2Z-取值” ⌊ z ⌉ 2 : = 2 ⋅ ⌊ z / 2 ⌉ \lfloor z \rceil_2:= 2 \cdot \lfloor z/2 \rceil z2:=2z/2,这些函数可简记为 [ ⁣ [ z ] ⁣ ] [\![z]\!] [[z]],并且并不要求 [ ⁣ [ z ] ⁣ ] = z , ∀ z ∈ Z [\![z]\!]=z,\forall z\in \mathbb Z [[z]]=z,zZ

对于取模函数,可以采用上述的任意近似函数来定义,
z ( m o d [ [ ⋅ ] ] N ) : = z − N ⋅ [ ⁣ [ z N ] ⁣ ] z \pmod{^{[[\cdot]]} N} := z - N \cdot [\![\dfrac{z}{N}]\!] z(mod[[]]N):=zN[[Nz]]

  • z ( m o d N ) z \pmod{N} z(modN),采用下取整的定义,范围 U N : = { 0 , 1 , ⋯ , N − 1 } U_N:=\{0,1,\cdots,N-1\} UN:={0,1,,N1},称为 canonical unsigned representative
  • z ( m o d ± N ) z \pmod{^\pm N} z(mod±N),采用圆整的定义,范围 S N : = { − ⌊ N / 2 ⌋ , ⋯ , ⌊ ( N − 1 ) / 2 ⌋ } S_N:=\{-\lfloor N/2\rfloor ,\cdots,\lfloor (N-1)/2\rfloor\} SN:={N/2,,⌊(N1)/2⌋},称为 canonical signed representative
  • z ( m o d ⌊ ⋅ ⌉ 2 N ) z \pmod{^{\lfloor\cdot\rceil_2} N} z(mod2N),采取 2 Z 2\mathbb Z 2Z-取值的定义,范围 { − N , ⋯ , N } \{-N,\cdots,N\} {N,,N},并且具有相同的奇偶性

我们首先给出 Barrett 和 Montgomery 的最基本描述:

在这里插入图片描述

根据这些整数近似函数的性质,可以计算出 Barrett 输出范围是 < 3 N / 2 <3N/2 <3N/2,假如继续约束 N < R / 3 N<R/3 N<R/3,那么输出结果 < R / 2 <R/2 <R/2,从而在 ( m o d R ) \pmod{R} (modR) 下的表示是唯一确定的。此时,就可以把 Barrett 的一些双精度运算简化为单精度运算,

在这里插入图片描述

对于 Montgomery,正如 [Sei18] 所说, m o n t + mont^+ mont+ 可以优化为单精度运算。但是 m o n t − mont^- mont 出于进位的限制,无法这么优化。

在这里插入图片描述

两种 Montgomery 之间的关系:

在这里插入图片描述

Barrett 和 Montgomery 之间的关系:

在这里插入图片描述

类比着 Montgomery 模乘:

在这里插入图片描述

[BHK+21] 提出了 Barrett 模乘:

在这里插入图片描述

可以采取单精度指令的优化,只需要三条指令,

在这里插入图片描述

[BHK+21] 还继续考虑了 Armv8-A Neon vector instructions 提供的各种特殊指令,以优化 Barrett 和 Montgomery 的模约简、模乘的计算效率。

Mixed-radix NTT

[DL22] 考虑了 radix- 2 k 1 2^{k_1} 2k1 以及 radix- 2 k 2 2^{k_2} 2k2 的混合,给出了 FPGA 的实现。

对于一般的 radix-2 NTT 算法,在硬件上难以实现高吞吐量。因此他们将大的 NTT 拆解为若干小的 NTT,从而实现硬件的加速。

在这里插入图片描述

他们继续讨论了如何在 FPGA 上更好地实现这个算法。

TensorFHE

三种专用硬件:GPGPU(通用目的 GPU)、FPGA(可编程逻辑门阵列)、ASIC(专用集成电路)

[FWX+23] 给出了第一个使用 GPGPU 上的 TCU(Tensor Core Unit)加速的 FHE 实现。TCU 是最近的技术,它用于计算 4 × 4 4 \times 4 4×4 的矩阵乘法,速度比通用的 Cuda Core 并行度高得多。

  • TCU 是一种专用于计算 multiply and accumulate (MAC) 运算的单元,不支持其他的运算
  • TCU 仅支持低精度运算(至多 INT8 的整数,至多 FP16 的浮点数),返回值是 type-s32,但是只有低 16 比特是有效的
  • TCU 是 warp 级别的,(二维)逐片运算;而 CUDA 是 thread 级别的,(一维)逐点运算
  • 专用计算卡(比如 A100,好贵、已禁运)中包含远比 CUDA 多的 TCU,但是游戏卡中的 TCU 比 CUDA 少得多

在这里插入图片描述

[FWX+23] 的实现分为两层,

  1. API Layer:在 CPU 上运行,将用户的 FHE 操作自动分解为若干 basic kernel,并且确定批处理参数
  2. Kernel Layer:在 GPGPU 上运行,执行 7 7 7 种 basic kernel,包括 NTT(使用了 TCU 加速)、Hadamard Multiplication、Element-wise Addition/Subtract、Frobenius Map(槽置换)、Conjugate(共轭)、Basis Conversion(在不同 RNS 下切换)

他们测试了基本实现的各项性能,发现存在:Read-After-Write(RAW)数据依赖问题、线程间的资源竞争、GPU 占用率不高、TCU 不支持取模运算、TCU 仅支持低精度运算,一系列的问题。

因为 NTT 需要多层的蝴蝶迭代,每个蝴蝶都需要计算取模运算,不同层的蝴蝶有数据依赖关系,因此不适合在 TCU 上加速。[FWX+23] 简单地采取暴力计算,原本的 DFT 计算公式为:
∀ k ∈ [ N ] , A k = ( ∑ i = 0 N − 1 ζ 2 N ( 2 i + 1 ) k ⋅ a N ) ( m o d q ) \forall k \in [N],\,\, A_k = \left( \sum_{i=0}^{N-1} \zeta_{2N}^{(2i+1)k} \cdot a_N \right) \pmod{q}\\ k[N],Ak=(i=0N1ζ2N(2i+1)kaN)(modq)
就是矩阵乘 A N = W N × a N A_N = W_{N} \times a_N AN=WN×aN,我们采取 RNS 系统,使得环元素的系数是远小于 32 32 32 比特的整数,然后使用长度 64 64 64 比特的累加器,直到计算完矩阵乘法之后,才统一执行取模运算。

但是上述的矩阵 W ∈ Z q N × N W \in \mathbb Z_q^{N \times N} WZqN×N 过大了,我们可以利用 Baby-Step Giant-Step(BSGS),将它转化为如下形式
A N 1 × N 2 = ( ( W 1 × a N 1 × N 2 ) ⊙ W 2 ) × W 3 T ( m o d q ) \begin{aligned} A_{N_1 \times N_2} = \left( (W_1 \times a_{N_1 \times N_2}) \odot W_2 \right) \times W_3^T \pmod{q} \end{aligned} AN1×N2=((W1×aN1×N2)W2)×W3T(modq)
其中的 a N 1 × N 2 a_{N_1 \times N_2} aN1×N2 是向量 a N , N = N 1 N 2 a_{N}, N=N_1N_2 aN,N=N1N2 的二维化,三个矩阵分别为:
W 1 = [ ζ 2 N 1 ( 2 i + 1 ) j ] i ∈ [ N 1 ] , j ∈ [ N 1 ] ∈ Z q N 1 × N 1 W 2 = [ ζ 2 N ( 2 i + 1 ) j ] i ∈ [ N 1 ] , j ∈ [ N 2 ] ∈ Z q N 1 × N 2 W 3 = [ ζ N 2 i j ] i ∈ [ N 2 ] , j ∈ [ N 2 ] ∈ Z q N 2 × N 2 \begin{aligned} W_1 &= \begin{bmatrix} \zeta_{2N_1}^{(2i+1)j} \end{bmatrix}_{i \in [N_1],j \in [N_1]} \in \mathbb Z_q^{N_1 \times N_1}\\ W_2 &= \begin{bmatrix} \zeta_{2N}^{(2i+1)j} \end{bmatrix}_{i \in [N_1],j \in [N_2]} \in \mathbb Z_q^{N_1 \times N_2}\\ W_3 &= \begin{bmatrix} \zeta_{N_2}^{ij} \end{bmatrix}_{i \in [N_2],j \in [N_2]} \in \mathbb Z_q^{N_2 \times N_2} \end{aligned} W1W2W3=[ζ2N1(2i+1)j]i[N1],j[N1]ZqN1×N1=[ζ2N(2i+1)j]i[N1],j[N2]ZqN1×N2=[ζN2ij]i[N2],j[N2]ZqN2×N2
这里的两个矩阵乘,以及一个阿达玛积,都是使用 GPGPU 暴力计算的。由于输入矩阵 a N 1 × N 2 , W 1 , W 3 a_{N_1 \times N_2}, W_1, W_3 aN1×N2,W1,W3 都是 32 32 32 比特的,因此可以将简单地按字节拆分 4 4 4 个同样形状的矩阵,输入到 TCU 中计算 GEMM(利用 4 × 4 4 \times 4 4×4 基本矩阵乘搭建出来)。矩阵 W 2 W_2 W2 不必拆分,阿达玛积是直接在 CUDA 上运算的,这需要把 TCU 的计算结果融合为单个 32 32 32 比特矩阵。

在这里插入图片描述

此外,密文的 RNS 表示的索引是 ( L , N ) (L,N) (L,N),对于多个密文的同一个 L L L 的各种参数/资源是相同的。但是自然的索引 ( C , L , N ) (C,L,N) (C,L,N) 是以密文标号 C C C 主序的,导致了同一个 L L L 索引的多个密文数据是间断存储的。如果我们重排内存,按照 ( L , C , N ) (L,C,N) (L,C,N) 存储,那么就可以对于不同密文 C C C 的同一个 L L L 上的 NTT 域连续读取,它们共享了 NTT 参数,可以打包在一起计算,隐藏 I/O 延迟、资源复用。

最后 [FWX+23] 在 A100 上的实现,比 FPGA 表现的更好一些,但是依旧比 ASIC 慢得多。

Others

[HLS+22] 分别在 Intel AVX2 平台、ARM Cortex M4 平台,实现了 NTRU、Kyber、Saber 三种 KEM 方案,一共 6 6 6 个实现。他们使用汇编语言编写 NTT 算法,然后使用 CryptoLine 工具包(形式化语言,不依赖编程模型),半自动化地分析验证这些实现的正确性以及一些属性。

[ZLH+23] 优化了 High-radix NTT 的访存模式,提出了一种低复杂度的 cross-bank-write-back memory mapping scheme,通过时间延迟累积蝴蝶的结果,最后串行写回内存。最后,他们设计了 radix-4 NTT 的 FPGA 加速器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/182153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QML Column Row 属性 pyside6

在 QML 中&#xff0c;Column 和 Row 是常用的布局元素&#xff0c;用于水平&#xff08;Row&#xff09;和垂直&#xff08;Column&#xff09;排列它们的子元素。以下是这两个元素的主要属性列表&#xff1a; Column 属性 spacing: 子元素之间的垂直间隔。width 和 height:…

并查集带权并查集

定义 : 并查集 : 一种数据结构&#xff0c;用于处理一些不相交集合的合并与查询问题&#xff1b; 例题 : 如 : 有n种元素&#xff0c;分属于不同的n个集合&#xff1b; 有两种操作 : 1.给出两个元素的亲属关系&#xff0c;合并两个集合(x与y是亲戚&#xff0c;亲戚的亲戚…

竞赛选题 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…

tcpdump使用心得

参考原文 https://danielmiessler.com/p/tcpdump/ 几个用例 tcpdump -i eth0 显示eth0网卡当前所有的抓包情况eth0是网卡名&#xff0c;可以通过ifconfig获得&#xff0c;也可以通过 tcpdump -D 显示当前可以监听的网卡 -i 参数表示接口&#xff0c;后跟要监听的网卡 tcpdu…

树与二叉树堆:链式二叉树的实现

目录 链式二叉树的实现&#xff1a; 前提须知&#xff1a; 前序&#xff1a; 中序&#xff1a; 后序&#xff1a; 链式二叉树的构建&#xff1a; 定义结构体&#xff1a; 初始化&#xff1a; 构建左右子树的指针指向&#xff1a; 前序遍历的实现&#xff1a; 中序…

LiveData源码分析,粘性事件,数据倒灌

最近面试天天被虐&#xff0c;有个问题问的很频繁&#xff0c;就是 LiveData 的数据倒灌问题怎么解决。 我不知道有多少人连数据倒灌是什么都没听过的&#xff0c;更不要说什么解决方案啦。 我按照我的理解描述一下数据倒灌&#xff1a;就是设置了 LiveData 的数据之后&#…

论文阅读:Distributed Initialization for VVIRO with Position-Unknown UWB Network

前言 Distributed Initialization for Visual-Inertial-Ranging Odometry with Position-Unknown UWB Network这篇论文是发表在ICRA 2023上的一篇文章&#xff0c;本文提出了一种基于位置未知UWB网络的一致性视觉惯性紧耦合优化测距算法( DC-VIRO )的分布式初始化方法。 对于…

处理跨域问题

这里只讨论后端对跨域支持,前端的跨域支持一般都是在测试阶段用用的,跨域还是要后端解决 跨域问题的产生:浏览器的一种安全机制-->同源策略限制 同源策略:URL中包括协议&#xff0c;域名&#xff0c;IP&#xff0c;端口都要完全相同&#xff0c;如果有一项不同&#xff0c;浏…

《荒野大镖客》游戏提示emp.dll丢失怎么搞,总结五个修复教程分享

在玩荒野大镖客这款游戏时&#xff0c;有些玩家可能会遇到找不到emp.dll文件的问题。这个问题通常会导致游戏无法正常运行或出现错误提示。本文将介绍荒野大镖客找不到emp.dll丢失的6种解决方法&#xff0c;并解释emp.dll是什么以及导致其丢失的原因。 什么是emp.dll&#xff…

2021-07-31

单日3亿日志数据准实时存储和分析 –ClickHouse 在自如大前端研发中心的应用 第一章 架构设计 和 用户体系建设 文章目录 单日3亿日志数据准实时存储和分析前言一、pandas是什么&#xff1f;二、使用步骤1.引入库2.读入数据 总结 前言 用户行为数据的收集和分析&#xff0c;…

JavaScript 的初步学习下篇

函数 语法格式 创建函数/函数声明/函数定义 function 函数名(形参列表) {函数体return 返回值; }函数调用 函数名(实参列表) // 不考虑返回值 返回值 函数名(实参列表) // 考虑返回值 注: 函数定义并不会执行函数体内容, 必须要调用才会执行. 调用几次就会执行几次. js 中…

怎么样的软件测试工程师才算“大神”?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

C#开发的OpenRA游戏之属性SelectionDecorations(13)

C#开发的OpenRA游戏之属性SelectionDecorations(13) 在前面分析SelectionDecorations属性类时,会发现它有下面这个属性: public class SelectionDecorations : SelectionDecorationsBase, IRender { readonly Interactable interactable; 它是定义了一个Interactabl…

【编写UI自动化测试集】Appium+Python+Unittest+HTMLRunner​

简介 获取AppPackage和AppActivity 定位UI控件的工具 脚本结构 PageObject分层管理 HTMLTestRunner生成测试报告 启动appium server服务 以python文件模式执行脚本生成测试报告 下载与安装 下载需要自动化测试的App并安装到手机 获取AppPackage和AppActivity 方法一 有源码…

大杀四方,华为组建智能车大联盟 | 百能云芯

最近&#xff0c;华为和一系列汽车公司合资的新公司迎来新的进展。除了与长安汽车的合作外&#xff0c;据传华为已经邀请奇瑞、赛力斯、北汽以及江淮汽车入股新公司&#xff0c;这将使华为成为中国智能汽车平台的重要主导者。 根据澎湃新闻的报道&#xff0c;知情人透露&#x…

Java EE 多线程

文章目录 1. 认识线程1.1 什么是进程1.2 什么是线程1.2.1. 线程是怎么做到的呢&#xff1f;1.2.2. 进程和线程的关系 1.3 多线程编程1.3.1. 第一个多线程程序1.3.2. 使用 jconsole 命令查看线程1.3.3. 实现 Runnable 接口&#xff0c;重写 run1.3.4. 继承 Thread 重写 run&…

配电网重构单时段+多时段(附带matlab代码)

配电网重构单时段多时段 对于《主动配电网最优潮流研究及其应用实例》的基本复现 简介&#xff1a;最优潮流研究在配电网规划运行中不可或缺&#xff0c;且在大量分布式能源接入的主动配电网环境下尤为重要。传统的启发式算法在全局最优解和求解速度上均无法满足主动配电网运行…

八股文-如何理解Java中的多态

什么是多态&#xff1f; 多态是面向对象编程的一个重要概念&#xff0c;它允许一个对象以不同的形式表现。也就是说&#xff0c;在父类中定义的属性和方法&#xff0c;在子类继承后&#xff0c;可以有不同的数据类型或表现出不同的行为。这可以使得同一个属性或方法&#xff0…

操作系统 day14(进程同步、进程互斥)

进程同步 概念 进程的异步性体现在&#xff0c;例如&#xff1a;当有I/O操作时&#xff0c;进程需要等待I/O操作&#xff0c;而每个I/O操作又是不同的&#xff0c;所以进程没有一个固定的顺序&#xff0c;固定的时间来执行&#xff0c;而这体现了进程的异步性。 进程互斥 …

freeRTOS异常处理函数分析(以RISC-V架构进行分析)

1、异常处理函数的注册 对RISC-V架构中断不熟悉&#xff0c;可参考博客&#xff1a;《RISC-V架构——中断处理和中断控制器介绍》&#xff1b; 2、异常处理函数分析 2.1、数调用关系 freertos_risc_v_trap_handler //异常处理函数入口portcontextSAVE_CONTEXT_INTERNAL //保存…