AVX-512 Galois 域相关指令的用途是什么?

What are the AVX-512 Galois-field-related instructions for?

AVX-512 指令集扩展之一是 AVX-512 + GFNI,“Galois Field New Instructions”。

伽罗瓦理论是关于域扩展的。这与处理矢量化整数或浮点值有什么关系?据推测,这些指令执行 "Galois field affine transformation"、它的逆运算和 "Galois field multiply bytes"。

那些是什么字段?这些说明实际上有什么作用,有什么用?

我认为主要用例之一是 SW RAID6 parity, including generating new parity on every write. (Not just during recovery / rebuild). RAID5 can use simple XOR parity for its one and only parity member of each stripe, but RAID6 needs two different parities that can recover N blocks of data from any N of the N+2 blocks of data+parity. This is forward error correction,这是 ECC 解决的类似问题。

伽罗华域对此很有用;例如,它们是广泛使用的 Reed-Solomon 代码的基础。例如Par2 使用 16 位伽罗瓦域允许非常大的块计数为一个大文件或一组文件生成相对细粒度的错误恢复数据。 (最多 64k 个块)。

不幸的是,GFNI 不适合 PAR2,因为 GFNI 只支持 GF2P8 GF(28),不支持 GF(216) par2 使用的。 http://lab.jerasure.org/jerasure/gf-complete/issues/14 says it's possible to use GF2P8AFFINEQB 实现更宽的字长,这样可能会加速 PAR2。

但它应该对 RAID6 有用,包括生成 新的写入奇偶校验,这非常 CPU 密集。 Linux 内核的 md 驱动程序已经包含使用 SSE2 或 AVX2 的内联汇编,这是 kernel_fpu_begin()kernel_fpu_end() 的少数用途之一。 (使用 A 2013 paper looks at optimizing GF coding using Intel SIMD, mentioning Linux's md RAID and GF-Complete, the project linked earlier. The current state of the art is something like two pshufb byte shuffles to implement a 4-bit table lookup; GFNI could bring that down to 1 instruction especially if the hard-coded GF polynomial baked into gf2p8mulb。)

(RAID6 使用奇偶校验的方式与 par2 不同,它为跨磁盘的每个条带“垂直”生成单独的奇偶校验,而不是为一个大数据阵列“水平”生成单独的奇偶校验。底层数学是相似的。)

英特尔很可能计划在未来的某些 Silvermont 系列 Atom 上支持 GFNI,因为指令有传统的 SSE 编码,没有 3 操作数 VEX 或 EVEX。 许多其他引入了仅使用 VEX 编码的新指令,包括一些 BMI1/BMI2 标量整数指令。

Silvermont 系列(Airmont、Goldmont、Tremont 等)在 NAS 设备中得到一些使用,其中大部分 CPU 需求可能来自 RAID6。带有 GFNI 的未来版本可以节省电力,或者在不提高时钟速度的情况下避免瓶颈。

AVX + GFNI 表示支持 YMM 版本(即使没有 AVX2),AVX512F + GFNI 表示支持 ZMM 版本。 (HTML 摘录 at felixcloutier.com strangely only mentions the non-VEX 128-bit encoding while also listing a _mm_maskz_gf2p8affine_epi64_epi8 intrinsic (masking requires EVEX). HJLebbink's HTML extract 确实包括 VEX 和 EVEX 形式。也许它们只出现在英特尔的“未来扩展”手册中,HJ 擦除但 Felix 没有。)

使用 512 位向量确实会在短时间内限制涡轮时钟速度(在 Skylake-Xeon 上),因此内核可能不希望这样做。但在某些情况下,如果您不受内存限制,它可以显着减少 CPU 开销。


“场”是一个数学概念:

(wikipedia) In mathematics, a field is a set on which addition, subtraction, multiplication, and division are defined and behave as the corresponding operations on rational and real numbers do.

...

including the existence of an additive inverse −a for all elements a, and of a multiplicative inverse b−1 for every nonzero element b

Galois 域是一种 Finite Field,具有以下 属性:GF8 数中的位表示 8 次多项式的 0 或 1 个系数. (我很可能完全屠杀了它,但它是类似的东西而不是位值。)这就是为什么无进位加法(又名 XOR)和无进位乘法(使用 shift/XOR 而不是 shift/add) 在 Galois 域上很有用)

gf2p8mulb 的多项式 x^8 + x^4 + x^3 + x + 1 匹配 AES (Rijndael) 中使用的多项式;这更加支持了 英特尔之所以将其包含在内是因为硬件在那里的假设。

如果它也用于任何其他常见应用程序,它可能会为我们提供有关这些说明的“预期”用例的线索。

有一个 VAES 扩展,它提供 AESENC 的版本以及 YMM 和 ZMM 向量的相关指令,从仅使用 AES-NI + AVX2 的 128 位向量开始。因此,英特尔显然正在将 AES HW 扩展到 512 位 SIMD 向量。 IDK 如果这会激发广泛的 GFNI 或反之亦然,或两者兼而有之。 (宽 GFNI 意义重大;如果它被限制为 128 位,使用 vpshufb 查找表的优化 AVX512 实现将击败它。)

这些指令与 AES (Rijndael) 块密码密切相关。 GF2P8AFFINEINVQB 使用用户定义的仿射变换执行 Rijndael S-Box 替换。

GF2P8AFFINEQB 本质上是 8x8 位矩阵与 GF(2) 中的 8 位向量的(无进位)乘法,因此它在其他面向位的算法中应该很有用。它还可以用于在 GF(28).

的同构表示之间进行转换

GF2P8MULB multiplies two (vectors of) elements of GF(28), actually 8-bit numbers in polynomial representation with the Rijndael reduction polynomial. This operation is used in Rijndael's MixColumns step.

请注意,有限域中的乘法仅与整数乘法松散相关。

为了回答目的部分,我的猜测是添加这些主要是为了加速 SM4 encryption,这与 AES 在设计上有相似之处。
这个猜测来自于 ARM 也在大约同一时间 added SM4 acceleration in ARMv8.4,这表明芯片制造商想要加速这个算法,可能是因为它会在中国市场获得显着的吸引力。此外,事实上,它是 Icelake 中唯一添加的 AVX512 扩展,它也具有 SSE 编码,因此 Tremont 可以支持它,这表明他们打算将其用于 networking/storage 目的。

GFNI 在用于纠错的 Reed Solomon 编码中也非常有用(正如上面 Peter 所提到的)。它直接适用于任何 GF(28) 实现(例如 this) and the affine instruction can be used for other field sizes and polynomials - in fact, it's the fastest technique I know of 在英特尔处理器上这样做。

仿射指令还有一堆带外用例,包括 8 位移位和位置换。相当于RISC-V的bmatxor指令,其中有些use cases are listed here.
Some links describing use cases for this instruction.