net*_*ope 10 intel simd vectorization xor avx
根据英特尔内部指南,
vxorpd ymm, ymm, ymm:计算a和b中打包的双精度(64位)浮点元素的按位XOR,并将结果存储在dst中.vpxor ymm, ymm, ymm:计算a和b中256位(表示整数数据)的按位XOR,并将结果存储在dst中.两者有什么区别?在我看来,两个指令都会对ymm寄存器的所有256位执行按位异或.如果我使用vxorpd整数数据会有任何性能损失(反之亦然)?
Pet*_*des 10
将一些评论结合到一个答案中:
除了性能之外,它们具有相同的行为(我认为即使有一个内存参数:所有AVX指令都缺乏对齐要求).
在Nehalem到Broadwell上,(V)PXOR可以在3个ALU执行端口p0/p1/p5中的任何一个上运行. (V)XORPS/D只能在p5上运行.
一些CPU在整数和FP"域"之间具有"旁路延迟". Agner Fog的微博文档称,在SnB/IvB上,旁路延迟有时为零.例如,当使用"错误"类型的shuffle或boolean操作时.在Haswell上,他的例子表明,orps当用于整数指令的结果时没有额外的延迟,但是当用于结果时,它por有额外的1个时钟延迟addps.
在Skylake上,FP布尔值可以在任何端口上运行,但旁路延迟取决于它们碰巧运行的端口.(有关表格,请参阅英特尔的优化手册).Port5在FP数学操作之间没有旁路延迟,但端口0或端口1没有.由于FMA单元在端口0和1上,uop发布阶段通常会在FP重码中将booleans分配给port5,因为它可以看到很多uop排队等待p0/p1但p5不太忙.(如何安排x86 uops,确切地说?).
我建议不要担心这个.调整Haswell和Skylake会很好.或者只是总是在整数数据上使用VPXOR,在FP数据上使用VXORPS,而Skylake会很好(但Haswell可能不会).
在AMD Bulldozer/Piledriver/Steamroller上,没有布尔运算的"FP"版本.(参见Agner Fog的microarch手册第182页.)在执行单元之间转发数据有延迟(ivec-> fp或fp-> ivec为1个周期,int-> ivec(eax- > xmm0)为10个周期,8个周期对于ivec-> int.(推土机上的8,10.对于movd/pinsrw/pextrw,4上的压路机5))所以无论如何,你无法通过使用适当的布尔insn来避免AMD的旁路延迟. XORPS确实需要少一个字节来编码PXOR或XORPD(非VEX版本.VEX版本都需要4个字节.)
在任何情况下,旁路延迟只是额外的延迟,而不是降低吞吐量.如果这些操作不是内循环中最长的dep链的一部分,或者如果你可以并行交错两个迭代(所以你有多个依赖链一次进行无序执行),那么PXOR可能是要走的路.
在Skylake之前的Intel CPU上,压缩整数指令总是可以在比浮点数更多的端口上运行,因此更喜欢整数运算.
| 归档时间: |
|
| 查看次数: |
2722 次 |
| 最近记录: |