首页 文章

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

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

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

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

1 回答

  • 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上 .

    别担心,我会测试我手上的那一刻 . ;-)

相关问题