6

Intel Xeon Phi "Knights Landing" 处理器将是第一个支持 AVX-512 的处理器,但它只支持 "F"(比如没有 SSE2 的 SSE,或者没有 AVX2 的 AVX),所以主要是浮点数。

我正在编写通过内部函数使用高达 SSE4.1 指令对字节和字(8 位和 16 位)进行操作的软件。

我很困惑在 AVX-512F 中是否会有所有/大多数 SSE4.1 指令的 EVEX 编码版本,这是否意味着我可以期望我的 SSE 代码自动获得 EVEX 扩展指令并映射到所有新寄存器。

维基百科是这样说的:

SIMD寄存器文件的宽度从256位增加到512位,共有32个寄存器ZMM0-ZMM31。这些寄存器可以作为来自 AVX 扩展的 256 位 YMM 寄存器和来自 Streaming SIMD 扩展的 128 位 XMM 寄存器进行寻址,并且在使用 EVEX 时,可以扩展传统的 AVX 和 SSE 指令以对 16 个额外的寄存器 XMM16-XMM31 和 YMM16-YMM31 进行操作编码形式。

不幸的是,这并没有说明在启用 AVX512 的情况下编译 SSE4 代码是否会导致与将其编译为 AVX2 提供的相同(令人敬畏的)加速(遗留指令的 VEX 编码)。

有人知道为 AVX-512F 编译 SSE2/4 代码(C 内在函数)时会发生什么吗?可以期待像 AVX1 的字节和字指令的 VEX 编码那样的减速带吗?

4

1 回答 1

4

好的,我想我已经拼凑了足够的信息来做出一个体面的答案。开始。

当原生 SSE2/4 代码在 Knights Landing (KNL) 上运行时会发生什么?

代码将在内核中的单个 VPU(称为兼容层)上的底部四分之一的寄存器中运行。根据 Colfax 的预发布网络研讨会,这意味着仅占用内核可用的总寄存器空间的 1/4 到 1/8 并在传统模式下运行。

如果使用 AVX-512F 的编译器标志重新编译相同的代码会发生什么?

SSE2/4 代码将使用 VEX 前缀生成。这意味着 pshufb 变为 vpshufb 并与 ymm 中的其他 AVX 代码一起使用。指令不会被提升为 AVX512 的原生 EVEX,也不会被允许专门寻址新的 zmm 寄存器。指令只能通过 AVX512-VL 升级为 EVEX,在这种情况下,它们能够直接寻址(重命名)zmm 寄存器。目前尚不清楚寄存器共享是否可能,但 AVX2 上的流水线已证明在许多情况下,半角 AVX2 (AVX-128) 的吞吐量与完整的 256 位 AVX2 代码相似。

最重要的是,如何让我的 SSE2/4/AVX128 字节/字大小代码在 AVX512F 上运行?

您必须将 128 位块加载到 xmm 中,符号/零将这些字节/字扩展到 zmm 中的 32 位,并像它们总是更大的整数一样操作。然后完成后,转换回字节/字。

这速度快吗?

根据在 Larrabee(Knights Landing 的原型)上发布的材料,只要寄存器可用,任何整数宽度的类型转换都可以从 xmm 到 zmm 自由,反之亦然。此外,在执行计算之后,可以将 32 位结果即时截断为字节/字长,并以 128 位块的形式写入(打包)到未对齐的内存中,从而可能节省 xmm 寄存器。

在 KNL 上,每个内核都有 2 个 VPU,它们似乎能够相互通信。因此,32 路 32 位查找可能在单个 vperm*2d 指令中具有可能合理的吞吐量。即使使用 AVX2 也是不可能的,它只能在 128 位通道内置换(或仅在 32 位 vpermd 的通道之间置换,这不适用于字节/字指令)。结合自由类型转换、通过 AVX512 隐式使用掩码的能力(节省了使用 blendv 或显式掩码生成的昂贵和寄存器密集型使用),以及更多比较器的存在(本机 NOT、无符号/有符号 lt/gt 等) ,毕竟为 AVX512F 重写 SSE2/4 字节/字代码可能会提供合理的性能提升。至少在 KNL 上。

别担心,我会在我拿到手的那一刻进行测试。;-)

于 2016-06-17T22:42:32.280 回答