use*_*948 6 c byte sse4 xeon-phi avx512
英特尔至强披"骑士降落"处理器将是第一个支持AVX-512,但它只能支持"F"(如无SSE SSE2,或不AVX AVX2),所以浮点东西为主.
我正在编写使用内部函数通过SSE4.1指令操作字节和字(8位和16位)的软件.
我很困惑,是否会出现在AVX-512F全部/大部分SSE4.1指令EVEX编码的版本,以及这是否意味着我可以期待我的SSE代码来自动获取EVEX扩展指令和映射到所有新的寄存器.
维基百科说:
SIMD寄存器文件的宽度从256位增加到512位,共有32个寄存器ZMM0-ZMM31.如256位的YMM从AVX扩展和从流SIMD扩展128位XMM寄存器寄存器,这些寄存器可被寻址,和遗留AVX和SSE指令可以扩展到在16个附加寄存器XMM16-XMM31和YMM16-YMM31使用EVEX当操作编码形式.
这不幸的是没有澄清是否编译SSE4代码启用AVX512,会导致相同的(真棒)加速比它编译成AVX2提供(的传统指令VEX编码).
有人知道为AVX-512F编译SSE2/4代码(C内在函数)会发生什么?人们可以期待像AVX1的字节和字指令的VEX编码那样的速度颠簸吗?
好吧,我想我已经拼凑了足够的信息来做出一个不错的答案。开始。
当本机 SSE2/4 代码在 Knights Landing (KNL) 上运行时会发生什么?
该代码将在核心内单个 VPU(称为兼容层)上的寄存器的底部四分之一中运行。根据 Colfax 的预发布网络研讨会,这意味着仅占用内核可用的总寄存器空间的 1/4 到 1/8,并在传统模式下运行。
如果使用 AVX-512F 的编译器标志重新编译相同的代码会发生什么?
将生成带有 VEX 前缀的 SSE2/4 代码。这意味着 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,它们似乎能够相互通信。因此,在单个 vperm*2d 指令中可以进行 32 路 32 位查找,并且吞吐量可能合理。即使使用 AVX2 也是不可能的,AVX2 只能在 128 位通道内进行排列(或仅在 32 位 vpermd 的通道之间进行排列,这不适用于字节/字指令)。与自由类型转换相结合,能够通过 AVX512 隐式使用掩码(避免使用 Blendv 或显式掩码生成的昂贵且寄存器密集型的使用),以及更多比较器的存在(本机 NOT、无符号/有符号 lt/gt 等)毕竟,为 AVX512F 重写 SSE2/4 字节/字代码可能会提供合理的性能提升。至少在KNL上是这样。
别担心,我一拿到手就会测试一下。;-)