在ILP section of Wikipedia's CPU article的第二段中:
在CPU的一部分是超标量而部分不是超标量的情况下,由于调度停顿而没有遭受性能损失的部分。英特尔P5奔腾有两个超标量ALU,每个时钟周期可接受一条指令,但其FPU每个时钟周期不能接受一条指令。因此P5是整数超标量但不是浮点超标量。
什么是调度失速?为什么CPU的非超标量部分的性能会受到影响?
这是说标量部分比CPU的其余部分是标量要慢吗?
答案 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个任何操作,但不能重新排序它们并且指令问题是成对的,而不是独立的。
重要案例是:
最多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甚至更慢。