【发布时间】:2019-12-01 10:39:31
【问题描述】:
AVX-512 指令集扩展之一是AVX-512 + GFNI,“Galois Field New Instructions”。
伽罗瓦理论是关于域扩展的。这与处理矢量化整数或浮点值有什么关系?指令应该执行“Galois 域仿射变换”,它的倒数,以及“Galois 域乘字节”。
那些是什么字段?这些说明实际上有什么作用,有什么用处?
【问题讨论】:
标签: avx512 galois-field
AVX-512 指令集扩展之一是AVX-512 + GFNI,“Galois Field New Instructions”。
伽罗瓦理论是关于域扩展的。这与处理矢量化整数或浮点值有什么关系?指令应该执行“Galois 域仿射变换”,它的倒数,以及“Galois 域乘字节”。
那些是什么字段?这些说明实际上有什么作用,有什么用处?
【问题讨论】:
标签: avx512 galois-field
这些指令与 AES (Rijndael) 分组密码密切相关。 GF2P8AFFINEINVQB 使用用户定义的仿射变换执行 Rijndael S-Box 替换。
GF2P8AFFINEQB 本质上是 8x8 位矩阵与 GF(2) 中的 8 位向量的(无进位)乘法,因此它在其他面向位的算法中应该很有用。它还可用于在 GF(28) 的同构表示之间进行转换。
GF2P8MULBmultiplies GF(28) 的两个(向量)元素,实际上是用 Rijndael 约简多项式表示的多项式中的 8 位数字。该操作在Rijndael's MixColumns step中使用。
请注意,有限域中的乘法仅与整数乘法松散相关。
【讨论】:
aesenc 对 128 位 XMM 向量执行一轮 AES 加密。我认为如果他们想加速在一个 ZMM 向量中交错的多个 AES 流,英特尔会扩大 AES 指令。
gf2p8mulb 的烘焙多项式 x^8 + x^4 + x^3 + x + 1 与 Rijndael 匹配;这为您的假设提供了很大的分量,特别是如果它没有用于任何其他常见应用程序(如广泛的 RAID6 实现)
我认为主要用例之一是SW RAID6 parity,包括在每次写入时生成新的奇偶校验。 (不仅仅是在恢复/重建期间)。 RAID5 可以对其每个条带的唯一一个奇偶校验成员使用简单的 XOR 奇偶校验,但 RAID6 需要两个不同的奇偶校验,可以从 N+2 数据块中的任何 N 个数据块中恢复 N 块数据+奇偶校验。这是forward error correction,ECC 解决的类似问题。
伽罗瓦域对此很有用;例如,它们是广泛使用的 Reed-Solomon 码的基础。例如Par2 使用 16 位伽罗瓦域来允许非常大的块计数为一个大文件或一组文件生成相对细粒度的错误恢复数据。 (最多 64k 块)。
不幸的是,GFNI 对 PAR2 并不适用,因为 GFNI 只支持 GF2P8 GF(28),而不是 par2 使用的 GF(216)。 http://lab.jerasure.org/jerasure/gf-complete/issues/14 表示可以使用 GF2P8AFFINEQB 来实现更宽的字长,因此可以使用它来加速 PAR2。
但它应该对 RAID6 有用,包括生成新的写入奇偶校验,这是相当 CPU 密集型的。 Linux 内核的md 驱动程序已经包含使用SSE2 或AVX2 的内联汇编,这是kernel_fpu_begin() 和kernel_fpu_end() 的少数用途之一。 (A 2013 paper 着眼于使用 Intel SIMD 优化 GF 编码,提到了 Linux 的 md RAID 和 GF-Complete,这是之前链接的项目。当前的技术状态类似于两个 pshufb 字节洗牌来实现 4 位表查找;GFNI 可以将其减少到 1 条指令,尤其是在使用硬编码的 GF 多项式烘焙到 gf2p8mulb 时。)
(RAID6 使用奇偶校验的方式与 par2 不同,它为跨磁盘“垂直”的每个条带生成单独的奇偶校验,而不是为一个大数据数组“水平”生成奇偶校验。基础数学类似。)
英特尔很可能计划在未来的 Silvermont 系列 Atom 上支持 GFNI,因为指令有传统的 SSE 编码,没有 3 操作数 VEX 或 EVEX。 许多其他新指令引入了仅 VEX 编码,包括一些 BMI1/BMI2 标量整数指令。
Silvermont 系列(Airmont、Goldmont、Tremont 等)在大部分 CPU 需求可能来自 RAID6 的 NAS 设备中有所使用。带有 GFNI 的未来版本可以节省功耗,或者在不提高时钟速度的情况下避免瓶颈。
AVX + GFNI 表示支持 YMM 版本(即使没有 AVX2),而 AVX512F + GFNI 表示支持 ZMM 版本。 (HTML 提取 at felixcloutier.com 奇怪地只提到了非 VEX 128 位编码,同时还列出了 _mm_maskz_gf2p8affine_epi64_epi8 内在(屏蔽需要 EVEX)。HJLebbink's HTML extract 确实包括 VEX 和 EVEX 形式。也许它们只出现在英特尔的“未来扩展”手册,HJ 会刮掉但 Felix 没有。)
使用 512 位向量确实会在短时间内(在 Skylake-Xeon 上)限制涡轮时钟速度,因此内核可能不希望这样做。但在某些情况下,如果您不受内存限制,它可以显着减少 CPU 开销。
“场”是一个数学概念:
(wikipedia) 在数学中,域是一个集合,在该集合上定义了加法、减法、乘法和除法,其行为与对有理数和实数的相应运算一样。
...
包括所有元素 a 的加法逆 -a 和每个非零元素 b 的乘法逆 b-1 的存在
伽罗瓦域是Finite Field 的一种,具有以下性质:GF8 数中的位表示 8 次多项式的 0 或 1 个系数。 (很可能我完全扼杀了这一点,但它是类似的东西,而不是位置值。)字段)
gf2p8mulb 的烘焙多项式 x^8 + x^4 + x^3 + x + 1 与 AES (Rijndael) 中使用的多项式匹配;这为@nwellnhof's 的假设提供了更多的分量,即英特尔只是将其包含在内,因为硬件在那里。
如果它也用于任何其他常见应用程序,它可能会为我们提供这些说明的“预期”用例的线索。
有一个 VAES 扩展提供了 AESENC 的版本以及 YMM 和 ZMM 向量的相关指令,而 AES-NI + AVX2 仅提供 128 位向量。所以英特尔显然正在将 AES HW 扩展到 512 位 SIMD 向量。 IDK 如果这会激发广泛的 GFNI,反之亦然,或两者兼而有之。 (宽 GFNI 意义重大;如果将其限制为 128 位,则使用 vpshufb 查找表的优化 AVX512 实现将胜过它。)
【讨论】:
GF2P8AFFINEQB 使用正确的技巧可能可用于 16 位字长。还要感谢 GF16 与 GF2^16;我认为 par2 源代码使用 gf16 或 GaloisField<16> 作为类型名称,所以我习惯将其视为 GF16。修正了我的答案。
为了回答目的部分,我的猜测是添加这些主要是为了加速 SM4 encryption,它在设计上与 AES 有相似之处。
这个猜测来自于 ARM 大约在同一时间也有added SM4 acceleration in ARMv8.4,这表明芯片制造商希望加速这个算法,可能是因为它将在中国市场获得显着的吸引力。此外,它是 Icelake 中添加的唯一 AVX512 扩展,它也具有 SSE 编码,因此 Tremont 可以支持它,这表明他们打算将其用于网络/存储目的。
GFNI 在用于纠错的 Reed Solomon 编码中也非常有用(正如 Peter 上面提到的)。它直接适用于任何 GF(28) 实现(例如 this),并且仿射指令可用于其他字段大小和多项式 - 事实上,它是 fastest technique I know of 这样做在英特尔处理器上。
仿射指令还有一堆带外用例,包括 8 位移位和位置换。它相当于 RISC-V 的 bmatxor 指令,其中一些 use cases are listed here.
Some links describing use cases for this instruction.
【讨论】: