【问题标题】:Best way to shuffle 64-bit portions of two __m128i's随机播放两个 __m128i 的 64 位部分的最佳方法
【发布时间】:2014-10-07 06:10:52
【问题描述】:

我有两个__m128is、ab,我想将它们洗牌,以便a 的高64 位落在dst 的低64 位和低64 位中b 位于 dst 的上 64 位。即

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 执行比第一条的额外指令成本更高。

【问题讨论】:

  • 我还不知道更好的方法。来自 SSE 4.1 的 _mm_blend_epi16(a,b,7) 将在 dest 的上半部分为您提供 a 的上半部分,在 dest 的下半部分为您提供 b 的下半部分,但您仍然需要交换。
  • 您可以与另一个 _mm_shuffle_epi32(dst,0x4e) 交换,这可能比移位和解包更快(特别是如果混合是 3 个寄存器指令?)但我真的更喜欢 ssse3 或更早的解决方案跨度>
  • 我不知道 ssse3 或更低版本的更好方法。您可以在software.intel.com/sites/landingpage/IntrinsicsGuide 寻找它们
  • 是的,该页面已添加书签 ;)
  • @SteveCox,_mm_shuffle_epi32 在 SSE2 中可用。我一直在不支持> SSE2的机器上使用它,它工作正常。您绝对不想从整数指令跨越到双精度指令。根据英特尔文档,它可能会引入额外的延迟。

标签: intel sse simd intrinsics


【解决方案1】:

延迟并不总是最糟糕的事情。如果它不是循环承载的 dep 链的一部分,则只需使用单个指令。

另外,可能没有! Agner Fog 的microarch doc 说,在 Sandybridge 上使用“错误”类型的随机播放或布尔值时,他发现在某些情况下没有额外的延迟。混合仍然有额外的延迟。在 Haswell 上,他说混合类型的 shuffle 根本没有额外的延迟。 (第 140 页,数据绕过延迟。)

所以继续使用shufps,除非你非常关心你的代码在 Nehalem 上的速度。 (以前的设计(merom/conroe 和 Penryn)没有因使用错误的移动或洗牌而产生额外的绕过延迟。)

对于 AMD,shufps 在 ivec 域中运行,与整数 shuffle 相同,因此可以使用它。与 Intel 一样,FP 混合在 FP 域中运行,因此对 FP 数据没有旁路延迟。

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

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

【讨论】:

  • movhlps / movlhps 甚至比shufps / shufpd 更简单,而且编码更短。但是,如果它不在一个完整的随机播放单元上运行,它可能更有可能导致额外的旁路延迟。 (例如,根据 Agner 的表格,merom 在“float”域中运行它并 shufpd,但在“flt->int”域中运行 shufps)。
  • 我不知道我是如何错过两年前有人回答这个问题的。这解释了我所看到的。当时我正在使用 nelham 系统进行开发,并且看到了令人讨厌的旁路延迟。
  • @SteveCox:嘿,当我看到 +15 时,我没想到会是这个答案。 :P 仍然是 Nehalem 是(不是)混合浮点/整数向量的最糟糕的情况;最近的 Intel/AMD 几乎没有或没有额外的旁路延迟,尤其是对于 shuffle。 (可能因为非正交 SSE 洗牌,尤其是 2 输入洗牌!)。 AVX512F 增加了梦幻般的vpermt2d/vpermi2d 和 qword/ps/pd。 AVX512VBMI和AVX512BW有字节和字版本)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
相关资源
最近更新 更多