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编码那样的速度突变吗?
答案 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上。
不要担心,我会在我抓到手的那一刻测试。 ; - )