content:
- dynamic scheduling
- dynamic branch prediction
1. 在程序中经常会出现由于结构冒险而导致本可以先执行的语句因为前一个语句的暂停而暂停例如下
div a,b,c
add d,a,e
sub k,f,m
显然SUB指令和前面的两个指令一点关系都没有,但是由于前面的ADD和DIV有数据相关所以ADD得等DIV给值而霸占了SUB的资源,导致一个本来没有必要的stall。因此需要打破顺序执行。这个主张中主要会遇到下面一些问题:
- WAW
- RAW
- 导致只能引用非精确异常处理(这个理由不是很清楚)
实现乱序执行需要进行的改进:把ID阶段分为两个阶段,一个阶段issue指令,一个阶段等待操作数。issue阶段从一个FIFO的栈中取指令,因此可以一直取如果没有操作数就放到一个缓存单元中,让其一直等待而issue可以一直顺序取指就可以。对于乱序执行等待操作数的阶段,后面的指令可以通过数据旁路之类的技术取得操作数,而不需要一直等前面的指令做完。另外EX阶段就有很多个不同的unit可以直接同时执行操作,可以视为配合前面ID阶段的改进。
tomasulo算法
这个算法把指令分成了三类: load/store; 一般指令(蓝绿都是这一类);branch
其执行主要可以分为三个阶段:
- issue:从指令队列中取指令
- execution
- 一般指令:只要CDB总线上有数据就立马读进来,只要operand能用就立马zhi行
- load/store: 首先要等base register被释放,即可将有效地址写进buffer. load之后要等memory空闲,store要等operand写进来和memory空闲
- branch: 此时没有任何指令被允许初始化执行,要等到所有在这个指令之前的分支全都判断完才能执行(这个可以用分支预测的方法来提高性能)
- write result:把结果放到CDB上再从CDB放到寄存器和存储器里去。
2. 对于分支动态预测基本方法用的是一个saturate state machine(因为在00和11时会一直沉浸在里面,所以叫这个计数器saturating counter)