SIMD 在超标量乱序 CPU 上有啥好处?

Posted

技术标签:

【中文标题】SIMD 在超标量乱序 CPU 上有啥好处?【英文标题】:What is the benefit of SIMD on a superscalar out-of-order CPU?SIMD 在超标量乱序 CPU 上有什么好处? 【发布时间】:2017-03-14 18:29:21 【问题描述】:

我一直在阅读最近可用的 AVX-512 指令,我觉得有一个我不理解的基本概念。 SIMD 对已经乱序执行的超标量 CPU 有什么好处?

考虑以下伪汇编代码。使用 SIMD:

load 16 floats to register simd-a
load 16 floats to register simd-b
multiply register simd-a by simd-b as 16 floats to register c
store the results to memory

这没有 SIMD:

load a float to register a
load a float to register b
multiply register a and register b as floats to c
store register c to memory

load a float to register a (contiguous to prior load to a)
load a float to register b (contiguous to prior load to b)
multiply register a and register b as floats to c
store register c to memory (contiguous to previous stored result)

[continued for 16 floats]

我已经有一段时间没有做这样的低级工作了,但在我看来,CPU 可以将非 SIMD 示例转换为按数据顺序运行:

    并行处理 32 条加载指令(如果内存正确对齐,可能只是两个对缓存/内存的请求) 加载完成后并行执行 16 条乘法指令 16 次存储到内存,如果事情正确对齐,这也只是对缓存/内存的单个请求

从本质上讲,感觉 CPU 可能足够智能,可以在两种情况下以相同的速度执行。显然,随着我们继续向 ISA 添加更多和更广泛的 SIMD 指令,我在这里遗漏了一些东西,那么这些类型的指令的实用价值从何而来?

【问题讨论】:

SIMD 和 OOO 提供两种不同的并行:SIMD 是数据并行,OOO 是指令级并行 (ILP)。这两个概念是正交的。与提供相同吞吐量的非 SIMD 设计相比,SIMD 简化了硬件,例如解码带宽和注册文件访问。请注意,该问题与计算机体系结构选择/权衡有关,并不是真正的编程问题。基于这个原因,我投票关闭它。 @njuffa,ILP 和 DLP 是相互配合还是不能混合使用? @FackedDeveloper 它们是正交的。您可以两者都没有,一个或另一个,或两者兼有。现代 x86 处理器支持 SIMD 和 OOO 执行,以及其他形式的并行。例如超线程和多核处理器。 @njuffa,您认为说 SIMD 是数据并行的特例而 ILP 是任务并行的特例是否合理? SMT(例如超线程)也是任务并行,但我认为它实际上也是 ILP 的一个特例。 【参考方案1】:

区别主要是在硬件上实现这样的设计的可行性。由于各种原因,超标量架构的可扩展性不是很好。例如,在一个周期内重命名这么多寄存器是很困难的,因为您要重命名的东西可能是依赖的(如果它真的被翻译成 SIMD 代码,它们就不会是这样,但你不知道这一点)。物理寄存器文件需要大量额外的读写端口,这很烦人。相比之下,更宽的寄存器很容易。转发网络的规模将爆炸式增长。每个周期都必须将 很多 微操作插入到活动窗口中,其中很多必须被唤醒和调度,其中很多必须退出。由于机器现在充斥着更多数量级的微操作,您可能希望支持更大的活动窗口,否则它实际上会变得更小(对于等效代码,它变得不那么有效)。

整个内存业务也更加困难,因为现在您必须在一个循环中支持大量访问(所有访问都必须经过单独的翻译,对其应用排序约束,参与转发等等),而不仅仅是更广泛的访问(这相对容易)。

基本上,这种假设的设计采用了很多在合理的功率和面积预算下已经难以有效实施的东西,然后使它们变得更加困难。许多这些事情的复杂性与您希望在一个循环中通过它们的微操作数的数量大致成二次关系,而不是线性关系。

他们一直在做的添加更宽的 SIMD 主要只是复制粘贴 SIMD 单元(因此大多数 AVX 和 AVX2 指令的语义很烦人)并给一些东西更高的位宽。如果你这样做,没有不好的缩放。

【讨论】:

谢谢!这很有意义,也很有帮助。我对这些东西的大部分理解都非常熟悉,所以很高兴听到功率和晶体管预算如何发挥作用。 那么 SIMDization 是否受益于 ILP?或者当你使用 SIMD 指令时,没有办法 OOO? @FackedDeveloper 我不太清楚你的意思 @FackedDeveloper 没有paddps,这是padddaddps 的混合体。但除了奇怪的例子之外,没有什么能从本质上阻止 SIMD 指令的多次发出。例如,Skylake 可以在同一周期内发出两个 addps @FackedDeveloper 这一切都取决于微架构,您可以查看 Agner Fog 的表格或英特尔的优化指南或users.atw.hu/instlatx64

以上是关于SIMD 在超标量乱序 CPU 上有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

CPU乱序效果测试程序

编译器的过度优化CPU乱序执行

Linux 内核 内存管理优化内存屏障 ④ ( 处理器内存屏障 | 八种处理器内存屏障 | 通用内存屏障 | 写内存屏障 | 读内存屏障 | 数据依赖屏障 | 强制性内存屏障 |SMP内存屏障 )

计算机组成原理6-流水线多发射和超标量SIMD

如何证明CPU的乱序执行(Out-of-order Execution)?

Linux 内核 内存管理优化内存屏障 ④ ( 处理器内存屏障 | 八种处理器内存屏障 | 通用内存屏障 | 写内存屏障 | 读内存屏障 | 数据依赖屏障 | 强制性内存屏障 |SMP内存屏障 )