c-Knights Landing CPU(Xeon Phi)会加速字节/字整数代码吗



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寄存器和数据流单指令多数据扩展中的128位XMM寄存器,当使用EVEX编码形式时,传统AVX和SSE指令可以扩展为在16个附加寄存器XMM16-XMM31和YMM16-YMM31上操作。

不幸的是,这并没有说明在启用AVX512的情况下编译SSE4代码是否会带来与编译到AVX2相同的(令人敬畏的)加速(传统指令的VEX编码)。

有人知道为AVX-512F编译SSE2/4代码(C内部函数)时会发生什么吗?有人能指望像AVX1的字节和字指令的VEX编码那样的速度提升吗?

好吧,我想我已经拼凑了足够的信息来做出一个像样的答案。给。

当本地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代码的吞吐量相似。

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

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

这快吗?

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

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

别担心,我一拿到手就会测试

相关内容

  • 没有找到相关文章

最新更新