【发布时间】: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 的一个特例。
标签: simd