Vectorization AVX指令vxorpd和vpxor之间的差异

Vectorization AVX指令vxorpd和vpxor之间的差异,vectorization,intel,xor,simd,avx,Vectorization,Intel,Xor,Simd,Avx,据报道, vxorpd ymm,ymm,ymm:计算a和b中压缩双精度(64位)浮点元素的位异或,并将结果存储在dst中 vpxor ymm,ymm,ymm:计算a和b中256位(代表整数数据)的按位异或,并将结果存储在dst中 这两者的区别是什么?在我看来,这两条指令都会对ymm寄存器的所有256位执行按位异或运算。如果我对整数数据使用vxorpd(反之亦然),是否会造成性能损失?将一些注释组合成一个答案: 除了性能,它们有相同的行为(我认为即使有内存参数:所有AVX指令都缺少对齐要求)

据报道,

  • vxorpd ymm,ymm,ymm
    :计算a和b中压缩双精度(64位)浮点元素的位异或,并将结果存储在dst中
  • vpxor ymm,ymm,ymm
    :计算a和b中256位(代表整数数据)的按位异或,并将结果存储在dst中

这两者的区别是什么?在我看来,这两条指令都会对ymm寄存器的所有256位执行按位异或运算。如果我对整数数据使用
vxorpd
(反之亦然),是否会造成性能损失?

将一些注释组合成一个答案:

除了性能,它们有相同的行为(我认为即使有内存参数:所有AVX指令都缺少对齐要求)

在Nehalem到Broadwell上,
(V)PXOR
可以在3个ALU执行端口p0/p1/p5中的任何一个上运行<代码>(V)XORPS/D只能在p5上运行

一些CPU在整数和FP“域”之间有“旁路延迟”。假设在SnB/IvB上,旁路延迟有时为零。e、 g.使用“错误”类型的随机或布尔运算时。在Haswell身上,他的例子表明,
orps
用于整数指令的结果时没有额外的延迟,但是
por
用于
addps
的结果时有额外的1个延迟时钟

在Skylake上,FP布尔可以在任何端口上运行,但旁路延迟取决于它们运行在哪个端口上。(有关表格,请参阅英特尔优化手册)。端口5在FP数学运算之间没有旁路延迟,但端口0或端口1有旁路延迟。由于FMA单元位于端口0和1上,uop发布阶段通常会在FP重载代码中将布尔值分配给端口5,因为它可以看到很多uop排队等待p0/p1,但p5不那么忙。()

我建议你不要担心这个。哈斯韦尔和天湖的曲调会很好。或者总是在整数数据上使用VPXOR,在FP数据上使用VXORPS,Skylake会做得很好(但Haswell可能不会)


在AMD推土机/打桩机/蒸汽压路机上没有布尔运算的“FP”版本。(参见Agner Fog的Microach手册第182页)执行单元之间的数据转发存在延迟(ivec->fp或fp->ivec为1个周期,int->ivec为10个周期(
eax
->),ivec->int为8个周期(推土机上为8,10个周期,蒸汽压路机上为4,5个周期,用于movd/pinsrw/pextrw)),因此无论如何,使用适当的布尔insn无法避免AMD上的旁路延迟
XORPS
编码所需的字节比
PXOR
XORPD
少一个字节(非VEX版本。VEX版本都需要4个字节)

在任何情况下,旁路延迟只是额外的延迟,而不是降低吞吐量。如果这些操作不是内部循环中最长的dep链的一部分,或者如果您可以并行交错两个迭代(因此您有多个依赖链同时进行无序执行),那么
PXOR
可能是一种方法


在Skylake之前的英特尔CPU上,压缩整数指令始终可以在比浮点指令更多的端口上运行,因此更喜欢整数运算。

在当前的英特尔处理器上,SIMD单元有两个域:INT和FLOAT。将数据从一个移动到另一个会导致性能下降。在INT域的吞吐量也更高。谢谢你!表示当使用错误数据类型的向量指令时,Intel Sandy Bridge和更高版本的CPU具有0-1个周期的“旁路延迟”(bypass delay)。请注意,
vxorpd
是AVX,而
vpxor
是AVX2(当然,这不会影响性能,只是兼容性)。