为什么超标量处理器的非超标量部分的性能受到影响?

时间:2016-06-14 12:59:20

标签: cpu cpu-architecture processor

ILP section of Wikipedia's CPU article的第二段中:

  

在CPU的一部分是超标量而部分不是超标量的情况下,由于调度停顿而没有遭受性能损失的部分。英特尔P5奔腾有两个超标量ALU,每个时钟周期可接受一条指令,但其FPU每个时钟周期不能接受一条指令。因此P5是整数超标量但不是浮点超标量。

什么是调度失速?为什么CPU的非超标量部分的性能会受到影响?

这是说标量部分比CPU的其余部分是标量要慢吗?

3 个答案:

答案 0 :(得分:2)

我没有听说过“调度失速”这个术语"之前,但听起来它只是说管道会在标量部分出现瓶颈。

标量部分仍以最大吞吐量运行。因此,我认为该维基百科文章的措辞具有误导性:"未受到性能损失的部分"肯定会让它听起来像标量部分实现自己的最大吞吐量。

我想这算是一个"摊位"如果CPU的超标量部分期望每个周期发出2条指令,但它只能发出1,因为没有可用的执行资源。

答案 1 :(得分:1)

超标量处理器/核心是可以并行解码多个指令的处理器/核心,并且处理器/核心总体上看超标而不是它的部分。不确定是否有一些标准定义"调度档位"但是作者的目的是突出由执行单元的约束(仅限于两个ALU和一个FPU)引起的管道中的停顿,如果他使用了temm管道停顿会更好。当执行单元的i / p操作数不可用或操作数可用但执行单元不可用时,会发生停顿。例如,在以下代码中

int i1=1, i2=2, i3=3, i4=4;
float f1=1.0, f2=2.0;

i1 = i1 + i2;
i3 = i3 + i4;
f1 = f1 / (float) i1;
f2 = f2 / (float) i2;

前两个指令可以并行执行,但由于只有一个浮点单元,因此最后两个指令不能并行执行。因此,当浮点单元被占用时,第四条指令必须等待调度。

答案 2 :(得分:1)

来自维基百科:

结构性危害

当两个或多个指令同时需要处理器硬件的一部分时,会发生结构性危险。一个规范的例子是单个存储器单元,它可以在从存储器中检索指令的提取阶段和从存储器中写入和/或读取数据的存储器阶段中访问。[3]它们通常可以通过将组件分成正交单元(例如单独的缓存)或冒泡管道来解决。

P5是一个流水线式有序超标量(双发布)微处理器。因此它可以在同一周期开始1个整数和1个任何操作,但不能重新排序它们并且指令问题是成对的,而不是独立的。

重要案例是:

  • cpu不知道指令是否为fp或int,直到解码阶段(除非被预取)所以当只有一个管道可用时,2x提取+解码能力无效
  • 即使多个fp_add可以同时执行,它们也无法同时启动 - >性能打击
  • 如果指令不可配对,则一个管道停止,将阶段移动到其他管道,两个指令被序列化
  • 如果两个指令(双重发布)都是fp且一个不是可配对的,至少它们是流水线的,但同时仅限于几个指令(fp的阶段数为8(更高=停顿时更坏)效率不如整数)
  • 一些迭代fp函数占用fpu的所有资源,因此没有其他fp指令可以流水线化(FDIV停止任何新的fp指令)。可能是0.1-0.5 IPC。它们重复使用寄存器,不能同时与mmx指令一起使用。

最多3x fp_add可以同时执行(但不能与整数同时执行)或1 fp_mul + 2 fp_add可以同时执行(但不能同时执行)并且fpu由8个阶段,因此超过3个添加开始停止,直到第一个完成。

也许不是

int = int + int              // start at cycle-0
int = int + int              // start at cycle-0
float = float + float        // start at cycle-1
float = float + float        // start at cycle-2

你可以尝试

float = float + float     // start at cycle-0
int = int + int           // start at cycle-0
float = float + float     // start at cycle-1
int = int + int           // start at cycle-1

让配对工作并获得更好的表现。

纯整数:

 i0 fetch
 i0 decode i1 fetch
 i0 operands from mem  i1 decode i2 fetch 
 i0 execute i1 operands i2 decode ... i3 something
 i0 store i1 execute i2 operands ...  i4 something

每个管道同时运行4个= 8个指令畅通无阻运行= 2IPC

纯浮点:

 f0-fetch
 f0-decode f1-fetch
 f0-operand f1-decode f2-fetch
 f0-execute f1-operand f2-decode (3rd fp issued, no more fp additions)
 f0-store ....
 fx-fetch

3并行运行,少于1个IPC。 FDiv甚至更慢。