AVX指令vxorpd和vpxor之间的区别

时间:2014-11-15 05:40:53

标签: vectorization intel xor simd avx

根据Intel Intrinsics Guide

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

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

1 个答案:

答案 0 :(得分:10)

将一些评论结合到一个答案中:

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

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

某些CPU在整数和FP“域”之间存在“旁路延迟”。 Agner Fog's microarch docs说在SnB / IvB上,旁路延迟有时为零。例如当使用“错误”类型的shuffle或boolean操作时。在Haswell上,他的示例显示orps在整数指令的结果上使用时没有额外的延迟,但por在{{1}的结果上使用时有额外的1个时钟延迟}。

在Skylake上,FP布尔值可以在任何端口上运行,但旁路延迟取决于它们碰巧运行的端口。 (有关表格,请参阅英特尔的优化手册)。 Port5在FP数学操作之间没有旁路延迟,但端口0或端口1没有。由于FMA单元在端口0和1上,uop发布阶段通常会在FP重码中将booleans分配给port5,因为它可以看到很多uop排队等待p0 / p1但是p5不太忙。 (How are x86 uops scheduled, exactly?)。

我建议不要担心这个。调整Haswell和Skylake会很好。或者只是总是在整数数据上使用VPXOR而在FP数据上使用VXORPS,而Skylake会很好(但Haswell可能不会)。

在AMD Bulldozer / Piledriver / Steamroller上,没有布尔运算的“FP”版本。 (参见Agner Fog的microarch手册第182页。)在执行单元之间转发数据有延迟(对于ivec-> fp或fp-> ivec为1个周期,对于int-> ivec为10个周期({{1 }} - > addps),8个循环用于ivec-> int。(8,10在推土机上.4,5在压路机上用于movd / pinsrw / pextrw))所以无论如何,你无法避免通过使用适当的布尔insn绕过AMD的延迟。 eax确实比xmm0XORPS(非VEX版本)编码少一个字节.VEX版本都需要4个字节。

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

在Skylake之前的Intel CPU上,压缩整数指令总是可以运行在比浮点数更多的端口上,所以更喜欢整数运算。