【发布时间】:2019-11-20 12:51:34
【问题描述】:
因为没有_mm_movelh_ps 的AVX 版本,我通常使用_mm256_shuffle_ps(a, b, 0x44) 作为AVX 寄存器的替代品。但是,我记得在其他问题中阅读过,如果可能的话,应该首选没有控制整数的 swizzle 指令(如_mm256_unpacklo_ps 或_mm_movelh_ps)(出于某种我不知道的原因)。昨天,我突然想到,另一种选择可能是使用以下内容:
_mm256_castpd_ps(_mm256_unpacklo_pd(_mm256_castps_pd(a), _mm256_castps_pd(b)));
由于演员表应该是无操作的,这是否比使用 _mm256_shuffle_ps 在性能方面更好\相等\更差?
另外,如果确实如此,如果有人能用简单的语言解释(我对汇编和微体系结构的理解非常有限)为什么应该更喜欢没有控制整数的指令,那就太好了。
提前致谢
补充说明:
Clang 实际上将 shuffle 优化为 vunpcklpd: https://godbolt.org/z/9XFP8D
所以看来我的想法还不错。但是,GCC 和 ICC 会创建 shuffle 指令。
【问题讨论】:
-
如果可能的话,应该首选[没有立即控制轮空的洗牌]听起来像我写的东西:P
-
@PeterCordes:感谢您的回答(如下)。我觉得我以后应该直接向你提出问题。 :D
-
嘿,如果它对未来的读者有用,我可能仍然会回答它。顺便说一句,请注意我在您接受后所做的更新。
-
@PeterCordes 看到了更新。
标签: c++ sse intrinsics avx