英特尔Xeon“骑士登陆”处理器将是第一个支持AVX-512的处理器,但它只支持"F“(比如没有SSE2的SSE,或者没有AVX2的AVX ),所以浮点的东西主要支持。
我正在编写的软件,操作字节和字(8-和16位),使用多达SSE4.1指令通过本质。
我不知道AVX-512 F中是否会有所有/大多数SSE4.1指令的EVEX编码版本,这是否意味着我的SSE代码可以自动获得EVEX扩展指令并映射到所有新寄存器。
维基百科说:
SIMD寄存器文件的宽度从256位增加到512位,总共有32个寄存器ZMM0-ZMM 31。这些寄存器可以作为AVX扩展的256位YMM寄存器和流SIMD扩展的128位XMM寄存器来处理,遗留的AVX和SSE指令可以扩展到使用EVEX编码形式时对16个附加寄存器XMM16-XMM 31和YMM16-YMM 31进行操作。
不幸的是,这并没有说明使用启用AVX2 512的SSE4代码是否会导致与将其编译为AVX2提供的(VEX编码遗留指令)相同的(可怕的)加速。
有人知道为AVX-512 F编译SSE2 2/4代码(C本质)会发生什么吗?人们能想象到像AVX1 1那样的字节和字指令的VEX编码那样的高速增长吗?
发布于 2016-06-17 22:42:32
好吧,我想我已经收集了足够多的信息来给出一个像样的答案。开始吧。
当本地SSE2 2/4代码在骑士登陆(KNL)上运行时会发生什么?
代码将在核心内单个VPU (称为兼容性层)上的寄存器的底部第四部分运行。根据科尔法克斯的一个预发布的webinar,这意味着只占用核心可用的总注册空间的1/4至1/8,并以遗留模式运行。
如果使用AVX-512 F的编译器标志重新编译相同的代码会发生什么?
SSE2 2/4代码将使用VEX前缀生成。这意味着pshufb变成vpshufb并与ymm中的其他AVX代码一起工作。指令不会被提升到EVEX 512的本机EVEX,也不会被允许专门处理新的zmm寄存器。指令只能用AVX512-VL提升到EVEX,在这种情况下,它们可以直接寻址(重命名) zmm寄存器。目前尚不清楚寄存器共享是否可行,但AVX2上的流水线在许多情况下使用半宽度AVX2 (AVX-128)显示了类似于完整256位AVX2代码的吞吐量。
最重要的是,如何在AVX512F上运行SSE2 2/4/ how 128字节/字大小代码?
您必须将128位块加载到xmm中,签名/零将这些字节/字扩展到zmm中的32位,并且操作起来就好像它们总是较大的整数一样。完成后,将其转换为字节/单词。
这么快吗?
根据在拉腊比(骑士兰定的原型)上发表的材料,任何整数宽度的类型转换从xmm到zmm都是免费的,反之亦然,只要寄存器是可用的。此外,在执行计算之后,32位结果可以动态截断为字节/字长,并将(打包)写入128位块中的未对齐内存,从而可能节省xmm寄存器。
在KNL上,每个核心都有两个VPU,它们似乎能够互相交谈。因此,32路32位查找是可以在一个vperm*2d指令的假定合理的吞吐量。这在AVX2中也是不可能的,它只能在128位通道内(或32位vpermd之间的通道之间进行置换,这不适用于字节/字指令)。结合自由类型转换、隐式使用掩码与AVX512 (节省昂贵的注册密集型使用blendv或显式掩码生成)以及更多比较器(本机、无符号/签名的lt/gt等)的存在,毕竟可以为AVX512F重写SSE2 2/4字节/字码提供合理的性能提升。至少在KNL上。
别担心,我一拿到我的手就会测试的。;-)
https://stackoverflow.com/questions/37713644
复制相似问题