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

时间:2016-06-08 21:56:14

标签: c byte xeon-phi sse4 avx512

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 Extensions的128位XMM寄存器进行寻址,并且当使用EVEX时,可以扩展传统的AVX和SSE指令以对16个附加寄存器XMM16-XMM31和YMM16-YMM31进行操作编码形式。

遗憾的是,这并未说明使用启用AVX512编译SSE4代码是否会导致将其编译为AVX2提供的相同(超棒)加速(传统指令的VEX编码)。

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

1 个答案:

答案 0 :(得分:4)

好的,我想我已经拼凑了足够的信息来做出正确的答案。开始。

  

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

代码将在核心内单个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代码相似。

  

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

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

  

这快吗?

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

在KNL上,每个核心都有2个VPU,它们似乎能够相互通信。因此,在可能合理吞吐量的单个vperm * 2d指令中,32路32位查找是可能的。即使使用AVX2也无法实现这一点,AVX2只能在128位通道内进行置换(或仅在32位vpermd通道之间进行置换,这不适用于字节/字指令)。结合自由类型转换,能够使用AVX512隐式使用掩码(避免使用blendv或显式掩码生成的代价高昂且注册密集型使用),以及存在更多比较器(本机NOT,unsigned / signed lt / gt等) ,它可以提供合理的性能提升,毕竟重写AVX512F的SSE2 / 4字节/字代码。至少在KNL上。

不要担心,我会在我抓到手的那一刻测试。 ; - )