AVX 指令 vxorpd 和 vpxor 之间的区别
Posted
技术标签:
【中文标题】AVX 指令 vxorpd 和 vpxor 之间的区别【英文标题】:Difference between the AVX instructions vxorpd and vpxor 【发布时间】:2015-01-12 14:37:43 【问题描述】:根据Intel Intrinsics Guide,
vxorpd ymm, ymm, ymm
:计算 a 和 b 中压缩双精度(64 位)浮点元素的按位异或,并将结果存储在 dst 中。
vpxor ymm, ymm, ymm
:计算 a 和 b 中 256 位(表示整数数据)的按位异或,并将结果存储在 dst 中。
两者有什么区别?在我看来,这两条指令都会对 ymm 寄存器的所有 256 位进行按位异或。如果我将vxorpd
用于整数数据(反之亦然),是否会降低性能?
【问题讨论】:
在当前的 Intel 处理器上,SIMD 单元有两个域:INT 和 FLOAT。将数据从一个移动到另一个会降低性能。 INT 域的吞吐量也更高。 感谢神秘主义者! This answer 表示,当您使用具有错误数据类型的向量指令时,英特尔 Sandy Bridge 和更高版本的 CPU 会出现 0-1 个周期的“旁路延迟” 还要注意vxorpd
是AVX 而vpxor
是AVX2(这当然不是影响性能,只是兼容性)。
【参考方案1】:
将一些 cmets 组合成一个答案:
除了性能之外,它们具有相同的行为(我认为即使有内存参数:所有 AVX 指令都缺乏对齐要求)。
从 Nehalem 到 Broadwell,(V)PXOR
可以在 3 个 ALU 执行端口 p0/p1/p5 中的任何一个上运行。 (V)XORPS/D
只能在 p5 上运行。
某些 CPU 在整数和 FP“域”之间存在“旁路延迟”。 Agner Fog's microarch docs 说在 SnB / IvB 上,旁路延迟有时为零。例如使用“错误”类型的随机播放或布尔运算时。在 Haswell 上,他的示例表明 orps
在用于整数指令的结果时没有额外的延迟,但 por
在用于 addps
的结果时有额外的 1 个时钟的延迟。
在 Skylake 上,FP 布尔值可以在任何端口上运行,但绕过延迟取决于它们碰巧在哪个端口上运行。 (有关表格,请参见英特尔的优化手册)。端口 5 在 FP 数学运算之间没有旁路延迟,但端口 0 或端口 1 有。由于 FMA 单元位于端口 0 和 1,因此 uop 发布阶段通常会将布尔值分配给 FP 繁重代码中的端口 5,因为它可以看到许多 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 个周期(eax
-> @ 987654329@), ivec->int 为 8 个周期。(推土机上为 8,10。movd/pinsrw/pextrw 上为 4, 5 在压路机上))所以无论如何,你不能通过使用适当的布尔值来避免 AMD 的旁路延迟insn XORPS
确实比 PXOR
或 XORPD
少了一个字节来编码(非 VEX 版本。VEX 版本都需要 4 个字节。)
在任何情况下,绕过延迟只是额外的延迟,而不是降低吞吐量。如果这些操作不是内部循环中最长的 dep 链的一部分,或者您可以并行交错两个迭代(因此您有多个依赖链同时进行无序执行),那么PXOR
可能是要走的路。
在 Skylake 之前的 Intel CPU 上,压缩整数指令始终可以在比浮点指令更多的端口上运行,因此更喜欢整数运算。
【讨论】:
以上是关于AVX 指令 vxorpd 和 vpxor 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
MSVC /arch:[指令集] - SSE3、AVX、AVX2
如何使用 SSE4.2 和 AVX 指令编译 Tensorflow?