gpt4 book ai didi

intel - 混洗两个 __m128i 的 64 位部分的最佳方法

转载 作者:行者123 更新时间:2023-12-04 08:52:10 26 4
gpt4 key购买 nike

我有两个 __m128i s, ab ,我想洗牌,以便 a 的高 64 位落在 dst 的低 64 位和 b 的低 64 位落在dst的上位64 . IE。

dst[ 0:63]  = a[64:127]
dst[64:127] = b[0:63]

相当于:
__m128i dst = _mm_unpacklo_epi64(_mm_srli_si128i(a, 8), b);

或者
__m128i dst = _mm_castpd_si128(mm_shuffle_pd(_mm_castsi128_pd(a),_mm_castsi128_pd(b),1));

有没有比第一种方法更好的方法呢?第二条只是一条指令,但切换到浮点 SIMD 执行的成本比第一条的额外指令成本更高。

最佳答案

延迟并不总是最糟糕的事情。如果它不是循环携带的 dep-chain 的一部分,那么只需使用单个指令。

另外,可能没有!阿格纳雾的microarch doc说他在 Sandybridge 上使用“错误”类型的 shuffle 或 bool 值时,在某些情况下没有发现额外的延迟。混合仍然有额外的延迟。在 Haswell 上,他说混合类型的 shuffle 根本没有额外的延迟。 (第 140 页,数据旁路延迟。)

所以继续使用 shufps ,除非您非常关心您的代码在 Nehalem 上的运行速度。 (之前的设计(merom/conroe 和 Penryn)没有额外的旁路延迟来使用错误的移动或随机播放。)

对于 AMD,shufps运行在 ivec 域中,与 integer shuffle 相同,因此可以使用它。与英特尔一样,FP Blends 在 FP 域中运行,因此对 FP 数据没有旁路延迟。

如果您根据支持的指令集包含多个 asm 版本,而不像 x264 那样为每个 CPU 提供最佳版本,那么您可能会在您的 AVX CPU 版本中使用错误类型的操作,但使用多条指令在您的非 AVX 版本中。 Nehalem 有很大的惩罚(每个域转换有 2 个周期的绕过延迟),而 Sandybridge 是 0 或 1 个周期。 SnB 是第一代 AVX。

Pre-Nehalem(没有 SSE4.2)太旧了,可能不值得专门为它调整一个版本,即使它对“错误类型”洗牌没有任何惩罚。 Nehalem 正处于有点慢的风口浪尖上,因此在这些系统上运行的软件将很难实时运行,或者不会感觉很慢。因此,在 Nehalem 上表现不佳会增加糟糕的用户体验,因为他们的系统已经不是最快的。

关于intel - 混洗两个 __m128i 的 64 位部分的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25293695/

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