vxorpd ymm, ymm, ymm
:计算a和b中压缩双精度(64位)浮点元素的按位XOR,并将结果存储在dst中。vpxor ymm, ymm, ymm
:计算a和b中256位(表示整数数据)的按位XOR,并将结果存储在dst中。两者有什么区别?在我看来,两个指令都会对ymm寄存器的所有256位执行按位异或。如果我对整数数据使用vxorpd
(反之亦然),会不会有任何性能损失?
答案 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
确实比xmm0
或XORPS
(非VEX版本)编码少一个字节.VEX版本都需要4个字节。
在任何情况下,旁路延迟只是额外的延迟,而不是降低吞吐量。如果这些操作不是内循环中最长的dep链的一部分,或者如果你可以并行交错两个迭代(所以你有多个依赖链一次进行无序执行),那么{{1可能是要走的路。
在Skylake之前的Intel CPU上,压缩整数指令总是可以运行在比浮点数更多的端口上,所以更喜欢整数运算。