SIMD(单指令多数据)和 VLIW(超长指令字)之间到底有什么区别?一个是另一个的子集吗?还是它们是两个完全不同的东西?
1 回答
完全不相关且正交。一台机器可以有一个或两个,或者两者都没有。SIMD 指令可以作为扩展添加到 VLIW ISA。(但 VLIW 已融入机器代码格式和 ISA。)
- 现代微处理器 90 分钟指南!非常好,涵盖了这两个概念。
- https://en.wikipedia.org/wiki/SIMD
- https://en.wikipedia.org/wiki/Very_long_instruction_word
VLIW 是一个块中的多条指令一起解码,并在不检查它们之间的危险/依赖关系的情况下执行:编译器需要这样做,所以 VLIW 的想法是卸载一些寻找指令级并行性(ILP)的工作) 到编译器。
最著名的例子之一是 Intel/HP 的 Itanium ISA。 https://www.realworldtech.com/mckinley/涵盖了一些关于它的细节,以及第一代 Merced 微架构(不是很好)。 https://www.realworldtech.com/ev8-mckinley/5/有关于第二代微架构 McKinley 的更多详细信息。
VLIW 是提供一些 MIMD 功能的一种方式(针对多个数据的多条指令,对不同的数据执行不同的操作。)
SIMD 是对多个数据元素执行相同操作的一条指令,因此通过 CPU 流水线在每个时钟上获得更多工作只涉及扩大执行单元,而不是扩大整个流水线。(单指令,多数据。)大量数据并行的问题可以同时以 SIMD、ILP 和线程级并行的形式将其暴露给 CPU。
(例如,使用多个累加器创建单独的依赖链 (ILP) 的矩阵乘法或点积,其中每个累加器是 4、8 或 16 个浮点数 (SIMD) 的向量。您可以跨内核划分工作,所以例如,在 Skylake 或 Zen2 上,每个内核每个时钟都可以获得 2x 8 FMA。)