gpt4 book ai didi

assembly - 将 SSE 与 AVX128 混合使用以获得更短的指令?

转载 作者:行者123 更新时间:2023-12-04 02:35:16 24 4
gpt4 key购买 nike

根据我能收集到的所有信息,混合使用 SSE 和 128 位 (E)VEX 编码指令不会造成性能损失。这表明将两者混合应该没问题。当 SSE 指令通常比 VEX 等效指令短 1 个字节时,这可能是有益的。

但是,我从未见过任何人或任何编译器这样做过。例如,在 Intel 的 AVX(128 位)MD5 实现中,various vmovdqa可以替换为 movaps(或者 this vshufps 可以替换为较短的 shufps,因为 dest 和 src1 寄存器相同)。
避免使用 SSE 有什么特别的原因,还是我遗漏了什么?

最佳答案

你是对的,如果从 vzeroupper 中知道 YMM 鞋面为零,混合 AVX128 和 SSE 没有任何损失,如果不这样做可以节省代码大小,这是一个错过的优化。

另请注意,如果您不需要 REX 前缀,它只会节省代码大小。 2 字节 VEX 相当于 SSE1 的 REX + 0F。编译器确实尝试支持低位寄存器以希望避免 REX 前缀,但我认为他们没有考虑在每条指令中使用哪些寄存器组合来最小化总的 REX 前缀。 (或者即使他们确实尝试这样做,他们也不擅长)。人类可以花时间做这样的计划。

大多数时候它很小,只是偶尔的一个字节代码大小。这通常是一件好事,可以帮助前端。 (或者在 Intel CPU 上为 blendvps xmm, xmm, <XMM0> 保存一个 uop 而不是 pblendvps xmm, xmm, xmm, xmm(对于 pd 和 pblendvb 也是如此),如果你可以安排使用它而不需要另一个 movaps )

如果你弄错了,不利的一面是 SSE/AVX 转换惩罚(在 Haswell 和 Ice Lake 上),或者对 Skylake 的错误依赖。 Why is this SSE code 6 times slower without VZEROUPPER on Skylake? . IDK 如果 Zen2 做了类似的事情; Zen1 将 256 位操作拆分为 2 微指令,并且不关心 vzeroupper。


为了让编译器安全地执行此操作,他们必须跟踪更多内容,以确保他们不会在函数内部运行 SSE 指令,而 YMM 寄存器的上半部分是脏的。编译器无法将 AVX 代码生成限制为仅 128 位指令,因此他们必须开始跟踪可能弄脏 YMM 上半部分的执行路径。

但是,我认为他们无论如何都必须在整个功能的基础上这样做才能知道何时使用 vzeroupper之前 ret (在不按值接受或返回 __m256/i/d 的函数中,这意味着调用者已经在使用宽向量)。

但不需要vzeroupper与是否 movaps 是不同的是性能安全的,所以用类似的方式跟踪又是一回事。找到可以安全避免 VEX 前缀的所有情况。

不过,在某些情况下可能很容易证明它是安全的。如果编译器使用一种保守的算法,当分支可能有也可能没有脏鞋面时有一些遗漏的优化,并且在这种情况下总是使用 VEX,并且总是使用 vzeroupper,那会很好。 .

关于assembly - 将 SSE 与 AVX128 混合使用以获得更短的指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62239877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com