@mShuaiZhao
2018-01-11T08:50:11.000000Z
字数 1293
阅读 729
2018.01
ComputerArchitecture
厨房的例子
执行指令的主要步骤
添加流水线寄存器
流水线处理器性能分析
流水线寄存器自身的延迟
提高了指令的吞吐率
流水线的平衡性
按照流水级中时间最长的阶段来平衡
不平衡的流水线
流水线的调整
把原有的硬件资源分成多个部分
继续进行切分会怎样呢?
"超级流水线"
流水线的深度
级数并不是越多越好。
处理器流水线深度的变化
将CISC指令划分为多个RISC指令,实现多级流水线
CPU频率大战:消费者以频率为购买导向标。导致流水线深度加深,后来回落。
两个方向:加深流水线,增加流水线的宽度
超标量结构
对于处理器,也常称为“双发射”、“三发射”、“四发射”...
第一台超级计算机
Cortex-A9的超标量流水线
Core i7的超标量流水线
x86虽然是CISC系统,但是使用RISC指令系统实现的。
超标量流水线
空间并行性的优化。
超标量流水线 与 多核CPU
“冒险”(Hazard)
结构冒险
示例1
解决方案1
几乎万能的方法,stall并插入bubble。
这种解决方案效率比较低,应当尽量避免流水线的停顿。
解决方案2
现在的计算机中指令和数据还是放在同一个主存中,但是有不同的指令Cache和数据Cache,避免了同时向同一个存储器读取指令和数据的情况。
示例2
解决方案
数据冒险
示例1
解决方案1
控制冒险
示例1
解决方案1
程序中,经常会对同一个变量进行反复的写入和读取。
数据冒险示例
与上图相同
软件解决方案
该插入多少个nop指令?在不同的系统上运行?
期望对软件屏蔽硬件的实现细节。
出现数据冒险的情况,使控制信号变为什么也不做的状态
stall 并插入 bubble。
通过执行的指令,检查在后续中是否有使用到同样编号的存储器(单条指令周期),有的话可能会出现数据冒险。
这种情况很常见,使用这种方法极大影响性能。
数据前递
上一条指令将自己的运算结果传递到下一条指令去(Forwarding)。
Forwarding最后那里应该有多选器。产生了数据冒险时才使用。
Forwarding是从指令执行的顺序上来描述的,Bypass则是从电路的结构上来描述的(绕过了寄存器堆)。
case 2
解决方案
case 3
解决方案
引入超标量的架构又会带来新的数据冒险。
转移指令对流水线的影响
循环的过程中,不应被执行的指令被多次读取。
转移指令和流水线是冲突的。
转移指令是比较常用的指令。
转移指令对性能的影响
转移开销
转移指令的分类
无条件转移
无条件直接转移
流水线不停顿
无条件间接转移
流水线停顿一个周期
条件转移
直接转移
判断两个数相等是很简单的操作,其实没有必要用到ALU这么复杂的器件。
改进后控制冒险的影响
延迟转移技术
将无关的指令移到转移之后,确保这些指令一定会执行,不至于浪费性能。