8

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

伽罗瓦理论是关于场扩展的。这与处理矢量化整数或浮点值有什么关系?指令应该执行“伽罗瓦域仿射变换”,它的逆,和“伽罗瓦域乘字节”。

那些是什么领域?这些说明实际上有什么作用,它有什么用?

4

3 回答 3

6

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

GF2P8AFFINEQB本质上是 8x8 位矩阵与 GF(2) 中的 8 位向量的(无进位)乘法,因此它在其他面向位的算法中应该很有用。它还可以用于在 GF(2 8 ) 的同构表示之间进行转换。

GF2P8MULB 将 GF(2 8 )的两个(向量)元素相乘,实际上是多项式表示中的 8 位数与 Rijndael 约简多项式。此操作用于Rijndael 的 MixColumns 步骤

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

于 2019-12-01T11:58:02.980 回答
5

主要用例之一是我认为SW RAID6 parity,包括在每次写入时生成新的 parity。(不仅仅是在恢复/重建期间)。RAID5 可以对其每个条带的一个也是唯一的奇偶校验成员使用简单的 XOR 奇偶校验,但 RAID6 需要两个不同的奇偶校验,可以从 N+2 数据块中的任何 N 个数据块中恢复 N 块数据+奇偶校验。这是前向纠错,ECC 解决的类似问题。

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

不幸的是,GFNI 不适用于 PAR2,因为 GFNI 仅支持 GF2P8 GF(2 8 ),而不支持 par2 使用的 GF(2 16 )。 http://lab.jerasure.org/jerasure/gf-complete/issues/14说可以使用GF2P8AFFINEQB来实现更宽的字长,因此可以加快 PAR2 的速度。

但它应该对 RAID6 很有用,包括在写入时生成新的奇偶校验,这非常占用 CPU。Linux 内核的驱动程序已经包含使用 SSE2 或 AVX2 的内联 asm,这是andmd的少数用途之一。(一篇 2013 年的论文着眼于使用英特尔 SIMD 优化 GF 编码,提到了 Linux 的RAID 和 GF-Complete,这是之前链接的项目。当前的技术状态类似于实现 4 位表查找的两个字节混洗;GFNI 可以带来减少到 1 条指令,特别是如果使用硬编码的 GF 多项式。)kernel_fpu_begin()kernel_fpu_end()mdpshufbgf2p8mulb

(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 版本。(奇怪的是,felixcloutier.com 上的 HTML 提取只提到了非 VEX 128 位编码,同时还列出了一个_mm_maskz_gf2p8affine_epi64_epi8内在(屏蔽需要 EVEX) 。HJLebbink 的 HTML 提取确实包括 VEX 和 EVEX 形式。也许它们只出现在英特尔的“未来扩展”中" HJ 刮掉但菲利克斯没有刮掉的手册。)

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


“场”是一个数学概念

维基百科)在数学中,域是定义加法、减法、乘法和除法的集合,其行为与有理数和实数的相应运算一样。

...

包括所有元素 a 的加法逆 -a 和每个非零元素 b的乘法逆 b -1的存在

伽罗瓦域是一种有限域,它具有以下性质:GF8 数中的位表示 8 次多项式的 0 或 1 个系数。(很可能我完全扼杀了这一点,但它是类似的东西而不是位置值。) 这就是为什么无进位加法(又名 XOR)和无进位乘法(使用移位/异或而不是移位/加法)在伽罗瓦域上很有用)

gf2p8mulb的烘焙多项式 x^8 + x^4 + x^3 + x + 1 与 AES (Rijndael) 中使用的多项式匹配;这更加强调了@nwellnhof 的假设,即英特尔只是将其包括在内,因为硬件在那里。

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

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

于 2019-12-01T11:44:55.143 回答
3

为了回答目的部分,我的猜测是这些主要是为了加速SM4 加密而添加的,它在设计上与 AES 有相似之处。
这一猜测来自于 ARM大约同时在 ARMv8.4 中添加了 SM4 加速,这表明芯片制造商希望加速该算法,可能是因为它将在中国市场获得显着牵引力。此外,它是 Icelake 中添加的唯一 AVX512 扩展,它也具有 SSE 编码,因此 Tremont 可以支持它,这表明他们打算将其用于网络/存储目的。

GFNI 在用于纠错的 Reed Solomon 编码中也非常有用(正如 Peter 上面提到的)。它直接适用于任何 GF(2 8 ) 实现(例如this),并且仿射指令可用于其他字段大小和多项式 - 事实上,这是我所知道的在英特尔处理器上执行此操作的最快技术。

仿射指令还有一堆带外用例,包括 8 位移位和位置换。它相当于 RISC-V 的bmatxor指令,这里列出了一些用例
一些描述此指令用例的链接

于 2020-06-07T11:30:33.780 回答