它们都可以同时处理多条指令,但是我认为它们之间存在一个根本区别,这解释了为什么有两个名称,而我们并没有一直使用超标量的名称?
此外,如果我理解正确的话,现代 CPU 中同时存在标量和矢量指令,所以我认为这两者并不互相排斥(标量指令,例如 mov 或 add 将以超标量方式执行,而点积将以某种特殊的黑魔法方式以矢量方式计算)?
答案1
A超标量处理器能够并行执行单个程序中的多条指令。它通过分析指令流来确定哪些指令不相互依赖,并在处理器内拥有多个执行单元来同时执行工作(例如多个算术逻辑单元). 编译器支持一般不是需要优化超标量处理器的代码,因为该功能通常完全在硬件中实现。1
A矢量处理器包含专门设计用于同时对整个多个数据值组进行操作的指令(称为数组或者向量)。大多数现代高性能处理器都包含某种形式的矢量处理能力;例如,上交所 ADDPS
大多数 x86 处理器中提供的指令计算两个向量之和,每个向量包含四个单精度值。使用向量指令通常需要编译器、开发人员和操作系统的支持,而且并不是每个处理器(即使是当前一代)都支持最先进的向量指令(例如,英特尔赛扬和奔腾处理器,甚至卡比湖,不支持AVX)。
有关当今处理器如何实现高性能的更多技术信息,请参阅这个答案。
1另一种相当不寻常的设计方法是拥有多个执行单元,但让编译器决定每个时钟周期向每个执行单元发出什么指令。这称为非常长的指令字并且通常仅在专用处理器上发现。
答案2
由于没有人提出答案,我认为我已经找到答案了。
标量处理器只是一个普通的处理器,执行标量指令,每次处理一个数字。没什么特别的。
矢量处理器另一方面,使用矢量指令,这些指令应该同时处理多个数字。有专门用于此目的的更宽的寄存器(例如,SSE 的 128 位 xmm* 可以将多个值打包到其中,例如 4 个 32 位整数;AVX-512 引入了 512 位寄存器,这是我能找到的最宽的寄存器)。矢量操作由处理器中为此目的而制造的特殊单元完成。矢量处理器的典型示例是 GPU - 它只进行矢量计算。
超标量是用于表示特定优化的术语,允许标量指令在不同的“常规”执行单元(例如多个 ALU)上并行执行。它将指令分为多个“流”(我刚刚编造了这个术语),然后同时执行。
那么它们与矢量对应物有何不同?标量指令不应该以这种方式执行。有多种可能的危险可能出现并阻止完全并行执行,例如数据或程序依赖性。在这种情况下,该指令的执行必须等待其依赖性得到满足,从而暂停该“流”的执行。CPU 必须处理所有依赖性以避免数据损坏,因此在以这种方式优化执行时必须特别小心。
它也没有引入任何新指令 - 一切看起来都只是正常的标量 CPU 操作。另一方面,矢量 CPU 具有用于矢量操作的特殊指令。主要区别在于,对于矢量操作,程序员(或者更确切地说,编译器)必须处理数据,并且由于不会同时干扰不同的寄存器(请记住,所有值都打包到宽寄存器中),因此可以避免各种危险。另一方面,超标量 CPU 会尽力找出哪些指令彼此独立并同时执行它们。
请注意,我从未说过任何类别是相互排斥的?它们不是。矢量单元将执行矢量指令,而 CPU 将尝试找到并行化标量指令的最佳方法。事实上,所有现代 CPU 都支持矢量指令(SSE*、3DNow!、AVX 等)和标量指令(x86),这些指令将以“超标量”方式执行。