超标量和向量处理器有什么区别?

Luk*_*uke 8 cpu cpu-architecture

它们都可以同时处理多个指令,但我想有一个根本的区别,这解释了为什么有两个名称,而我们并没有总是切换到使用超标量?

另外,如果我理解正确的话,现代 CPU 中都存在标量和向量指令,所以我认为这两者并不相互排斥(标量指令,如 mov 或 add 将被超标量执行,例如点积将被计算为向量-ly 以某种特殊的黑魔法方式)?

Luk*_*uke 1

由于没有人提出答案,我想我已经找到了答案。

标量处理器只是一种常规处理器,执行一次处理一个数字的标量指令。没什么特别的。

另一侧的向量处理器使用向量指令,这些指令应该同时处理多个数字。有一些特殊的、更宽的寄存器专门用于此目的(例如,SSE 的 128 位 xmm*,可以将多个值打包到其中,例如 4 个 32 位整数;AVX-512 引入了 512 位寄存器,这是最宽的 I 寄存器。能找到)。矢量运算是由处理器中为此目的而设计的特殊单元完成的。矢量处理器的一个典型例子是 GPU - 它只进行矢量计算。

超标量这一术语用于表示允许标量指令在不同的“常规”执行单元(例如多个 ALU)上并行执行的特定优化。它将指令分成多个“流”(我刚刚创造了这个术语),然后同时执行。

那么它们与矢量对应物有何不同?标量指令不应该以这种方式执行。可能会出现多种可能的危险并阻止完全并行执行,例如数据或程序依赖性。在这种情况下,该指令的执行必须等待其依赖性得到满足,从而暂停该“流”的执行。CPU 必须处理所有依赖关系以避免数据损坏,因此在以这种方式优化执行时必须特别小心。

它还没有引入任何新指令 - 一切看起来都只是正常的标量 CPU 操作。另一方面,矢量 CPU 有用于矢量运算的特殊指令。主要区别在于,对于向量操作,程序员(或者更确切地说,编译器)必须处理数据,并且由于不会同时干预不同的寄存器(请记住,所有值都打包到宽寄存器中),因此存在各种危险被避免。另一方面,超标量 CPU 会尽力找出哪些指令是相互独立的,并同时执行它们。


请注意我从未说过任何类别是相互排斥的?他们不是。向量单元将执行向量指令,CPU 将尝试找到并行化标量指令的最佳方法。事实上,所有现代 CPU 都支持向量指令(SSE*、3DNow!、AVX 等)和标量指令 (x86),这些指令将以“超标量”方式执行。