【发布时间】:2017-06-08 17:45:29
【问题描述】:
似乎recurring problem 许多英特尔处理器(直到 Skylake,除非我错了)在将 AVX-256 指令与 SSE 指令混合时表现出较差的性能。
根据Intel's documentation,这是由于 SSE 指令被定义为保留 YMM 寄存器的高 128 位,因此为了能够通过不使用 AVX 数据路径的高 128 位来节省功耗, CPU 在执行 SSE 代码时将这些位存储起来,并在输入 AVX 代码时重新加载它们,存储和加载成本很高。
但是,我找不到明显的原因或解释为什么 SSE 指令需要保留那些高 128 位。相应的 128 位 VEX 指令(使用它可以避免性能损失)通过始终清除 YMM 寄存器的高 128 位而不是保留它们来工作。在我看来,当英特尔定义 AVX 架构时,包括将 XMM 寄存器扩展到 YMM 寄存器时,他们可以简单地定义 SSE 指令也将清除高 128 位。显然,由于 YMM 寄存器是新的,因此不可能有依赖于 SSE 指令保留这些位的遗留代码,而且在我看来,英特尔也很容易看到这一点。
那么,Intel 定义 SSE 指令以保留 YMM 寄存器的高 128 位的原因是什么?有用吗?
【问题讨论】:
-
Agner Fog 对一个得到英特尔回复的问题有一些见解:software.intel.com/en-us/forums/intel-isa-extensions/topic/…
-
@MichaelPetch:很棒的发现!
标签: performance x86 avx