【问题标题】:A faster integer SSE unalligned load that's rarely used [duplicate]很少使用的更快的整数 SSE 未对齐负载 [重复]
【发布时间】:2016-11-17 03:49:40
【问题描述】:

我想了解更多关于_mm_lddqu_si128intrinsic(自SSE3 以来的lddqu 指令)与_mm_loadu_si128 内在(自SSE2 以来的movdqu 指令)相比的信息。

我今天才发现_mm_lddqu_si128。英特尔内在指南说

当数据跨越缓存线边界时,此内在函数可能比 _mm_loadu_si128 执行得更好

和a comment says它

在某些情况下会表现得更好,但绝不会表现得更差。

那么为什么没有更多地使用它(SSE3 是一个相当低的标准,因为所有 Core2 处理器都有它)?为什么当数据通过高速缓存行时性能会更好? lddqu 仅在某些处理器子集上可能更好。例如。在尼哈勒姆之前?

我意识到我可以通过阅读英特尔手册找到答案,但我认为这个问题可能对其他人来说很有趣。

【问题讨论】:

  • 我都试过了,没有发现性能差异(在 Core i7 2600 上试过)
  • @Rotem 可能只有在 Nehalem 之前更好(即在具有 SSE3 和 SSSE3 但没有 SSE4.1 的系统上)但这只是一个猜测。
  • “我意识到我可以通过阅读英特尔手册找到答案,但我认为其他人可能会对此问题感兴趣。” 我赞成这个问题,但请让我们不要在这里讨论主题......
  • @harold:不,只有 Prescott P4,不是 Merom。
  • 不是完全重复,但我对新问题的回答涵盖了这一点以及更多内容。它们应该以某种方式联系在一起,我认为重复的作品。 (我可以用指向另一个的链接来编辑它们。)有趣的是,大约 1.5 年后,我最终写了关于 AVX 256b 版本的几乎相同的答案。

标签: x86 sse intrinsics


【解决方案1】:

lddqu 在 P4 上使用了与 movdqu 不同的策略,但在支持它的所有其他 CPU 上运行相同。没有特别的缺点(因为 SSE3 指令不占用任何额外的机器代码字节,并且在这一点上甚至受到 AMD 的广泛支持),但除非您关心 P4,否则根本没有任何优点。

Dark Shikari(x264 视频编码器首席开发人员之一,负责许多 SSE 加速)went into detail about it in a blog post in 2008。这是一个archive.org链接,因为原版已离线,但他的博客中有很多好东西。

他提出的最有趣的一点是,Core2 仍然具有缓慢的未对齐加载,其中手动执行两次对齐加载和 palignr 可以更快,但仅适用于立即移位计数。由于 Core2 运行 lddqu 与 movdqu 相同,因此无济于事。

显然Core1确实专门实现了lddqu,所以它毕竟不仅仅是P4。


这个Intel blog post关于lddqu/movdqu的历史(我在2秒内用google找到了lddqu vs movdqu,/scold @Zboson)解释说:

(仅在 P4 上): 该指令由 加载在 16 字节边界上对齐的 32 字节块,提取未对齐对应的 16 字节 访问。

由于指令加载的字节数多于请求的字节数,因此存在一些使用限制。 lddqu应该 在未缓存 (UC) 和写入组合 (USWC) 内存区域上应避免。此外,通过其实施, 在需要存储加载转发的情况下应避免使用 lddqu。

所以我想这解释了为什么他们不一直使用该策略来实施movdqu。

我猜解码器没有可用的内存类型信息,这就是必须决定将指令解码到哪些微指令的时候。因此,即使是可取的,尝试在 WB 内存上机会主义地使用更好的策略也可能是不可能的。 (这不是因为存储转发)。


该博文的摘要:

从 Intel Core 2 品牌(Core microarchitecture , from mid 2006, Merom CPU and higher)到未来:lddqu 与 movdqu 做同样的事情

换句话说:
* 如果 CPU 支持补充流 SIMD 扩展 3 (SSSE3) -> lddqu 与 movdqu 做同样的事情,
* 如果 CPU 不支持 SSSE3 但支持 SSE3 -> 去 lddqu (并注意关于记忆类型的故事)

【讨论】:

  • @Zboson:其中大部分是出于历史兴趣,因为它基本上不再相关。没有 SSSE3 的 10% 的用户可能主要是 AMD。我从来没有拥有过P4。我有一个 P-MMX,然后是一些 AMD Athlon,然后是 K8,然后是 Core2 (Merom),然后是 SnB。英特尔的 BIOS 更新使我的 SnB 主板变砖了,所以我再次使用我的 Core2Duo E6600,直到我不再懒惰并决定要购买什么 Skylake 主板。去年夏天,我确实在台式机上看到了仍在使用的 P4,我想是在我哥哥和一个根本不是计算机极客(并且有一个游戏机)的人合租的公寓里。
  • @Zboson:是的,我也很惊讶,也很失望英特尔将a dangerous BIOS update for their DZ68DB motherboards 留在下载页面上这些年来没有任何警告。在尝试查看它们是否会使 Linux 图形驱动程序更好地工作时,我没有做任何进一步的阅读就更新了。我想几年前我已经看到了这些警告并且没有更新,但我已经忘记了。呵呵,我一直是个CPU极客。甚至在我对 asm 了解很多之前,我就已经阅读了有关它们如何工作的新闻文章,并且哪个更快。那里有大惊喜:P
  • 如果没有 SSSE3 的 10% 用户是 AMD,我假设他们有 SSE4a(巴塞罗那微架构)。我猜lddqu 的实现方式与movdqu 相同。在这种情况下,lddqu 对于所有实际目的都已过时。现在我明白为什么 SSE3 成为基础而不是 SSSE3。可能 99% 的 Intel 用户拥有 SSSE3,但许多 AMD 用户没有。
  • @Zboson:将基线设置为仅 SSE3 而不是 SSSE3 并不会特别伤害英特尔而不是 AMD。它伤害了英特尔的客户,但我们仍然会购买他们的 CPU。如果有的话,像这样的废话确实有利于英特尔,因为开发人员更有可能花时间只为英特尔 CPU 实现加速,而不是只为 AMD CPU 实现加速。例如甚至 AMD 也为未来的 CPU 放弃了 XOP。 (我希望 Intel 采用它;vpperm 2-source byte shuffle 填补了很多空白......)然后一些软件在 Intel 上的速度甚至比 AMD 还要快,从而扩大了性能差距。
  • 所以lddqu 最终死于 AVX512。 vpalignr 变成 valignr 并做正确的事。但是vpsrldq/vpslldq 仍然会进行车道内换档。我很好奇用于通道内 128 位移位的用例。在这个阶段,保留它不再是“免费的”。在 Cannonlake 的字节置换之前,它不是任何其他指令的子集。 (虽然我认为如果您稍微概括一下valign 硬件,它可以很便宜地完成。)
猜你喜欢
  • 2013-12-14
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 2014-09-17
  • 1970-01-01
  • 2016-09-19
  • 2011-03-14
相关资源
最近更新 更多