开发者学堂课程【高校精品课-大连理工大学-计算机组织与结构:E906的流水线】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/3/detail/16056
E906的流水线
内容介绍
一、E906流水线介绍
二、指令的乱序写回
三、L/S 类型指令的流水执行
四、浮点指令的执行冲突问题
一、E906流水线介绍
E906处理器有5级整形流水线
-即指令提取、指令译码、指令执行、内存访问、写回
-采用按序单发射的机制,不支持乱序发射同时也不支持多发射,处理器从内存中一次只能取一条指令
指令的流水执行
这个是单执行周期的指令的流水执行过程,下面有三条指令,每条指令是五个执行阶段,它依次错开采用流水执行的方式,一共用七个时钟周期就可以完成三条指令的执行。如果串行执行就需要15个周期才能够把三条指令都执行完,所以流水线的采用实际上是能够大幅提高指令的执行速度的。
二、指令的乱序写回
两执行周期乘法指令和多执行周期除法指令
为了减少长周期指令对流水线造成的堵塞,E906设计乱序写回机制,除法指令需要4个周期,后续没有冲突的加法指令可以先于除法指令回写
这个是两执行周期的乘法指令和多执行周期的除法指令,当前有四条指令,第一条是一个乘法指令,它有两个执行周期,我们用 EX 来表示,第二个出发指令有四个执行周期,为了减少长周期指令对流水线造成的阻塞,E906设计了乱序写回机制,出发指令需要四个周期,后续没有冲突的加法指令是可以先与除法指令写回的。
下面这条加法指令,如果和他紧挨着的上面的除法指令没有相关就可以直接执行完毕,可以先于除法指令执行结束。但是下面一条加法指令是与除法有冲突的加法指令就必须等待,要等待除法指令的执行周期结束以后才能开始自己的执行周期。执行完一码之后插入两个气泡导致后续的加法指令向后延续了两个周期。
三、L/S 类型指令的流水执行
第一条 Add 指令与 Load 指令没有数据冲突,超前 Load 指令回写寄存器;第二条 Add 指令与 Load 指令存在冲突阻塞执行
在这个例子当中第一条加法指令和load的指令没有数据冲突,超前露的指令写回到寄存器中那第二条Add指令和load指令存在冲突,所以要阻塞执行。
第一条是个 Store 指令,第二条是 load 指令,第三条 Add 指令实际上是和 load 的指令没有冲突。Load 指令和Add指令都可以顺利执行。但是第四条加法指令是和 Load 指令有冲突的,所以他在指令译码之后插入了气泡,等待load指令执行到一定阶段,最后一条 Add 指令才能够继续往后走,所以这两条 Add 执行,执行的时间实际上是差了三个时钟周期的。
四、浮点指令的执行冲突问题
浮点除法指令需要多个周期完成,后续紧挨的没有冲突的浮点加法可以先于除法指令回写,对于存在冲突的浮点指令需要等待浮点除法指今完成才能发射到执行单元
浮点除法指令需要多个周期才能完成,后续紧挨着没有冲突的浮点加法指令实际是可以先与除法指令写回的,但是对于存在冲突的浮点指令需要等待浮点除法指令完成以后才能发射到执行单元。
第一条是浮点乘法指令,第二条是浮点除法指令,第三条浮点加法指令,它和浮点除法没有冲突,这两条指令都可以顺利执行完这条除法和这条加法,这两条浮点指令都能顺利执行完。
但是最后一条浮点加法指令是和浮点除法指令有冲突,在异码之后插入了三个气泡,等这个浮点除法指令的执行阶段结束以后,最后一条浮点加法指令才能够开始执行。这个就是它的冲突问题造成的后续加法指令执行延后。