怎样做网站流量,wordpress调用分类产品,网站管理系统推荐,全国定制网站服务器云主机计分板算法简介
计分板记录着所有必要的信息#xff0c;用来控制以下事情#xff1a;
每条指令何时可以读取操作数并投入运行#xff08;对应着RAW冲突的检测#xff09;每条指令何时可以写入结果#xff08;对应着WAR冲突的检测#xff09;在计分板中#xff0c;WAW冲…计分板算法简介
计分板记录着所有必要的信息用来控制以下事情
每条指令何时可以读取操作数并投入运行对应着RAW冲突的检测每条指令何时可以写入结果对应着WAR冲突的检测在计分板中WAW冲突是在issue阶段检测的因此仍会导致整个流水线的停顿另一篇博文提到的Tomasulo算法提供了一种更优美的解决方案
需要强调的是计分板算法和普通的流水线是不一样的一般我们讨论的普通的五级流水线只有一个ALU所以当一条指令在使用ALU时其它指令是没法进入EXE阶段的但是计分板算法不一样它有多个功能部件如果指令使用的是不同的功能部件是能同时进入EXE阶段的。同理计分板算法对寄存器堆的读取也是可以多条指令同时进行的但是普通流水线是只有一条指令能访问普通流水线和计分板算法一样的是一个cycle最多发射一条指令。下面的计分板示例流程会说明计分板算法的特点。
动态调度核心思想回顾
允许就绪指令越过前面的停顿指令率先投入运行即乱序执行为了支持乱序执行需要对ID阶段进行改造因为就绪指令就是在ID阶段被阻塞的为了改造ID需要分析ID阶段的约束条件和存在的问题
约束条件ID阶段必须按序执行因为如果前一条指令还未译码后续的指令就无法进行冲突检测存在的问题在一个必须按序执行的阶段执行了过多的检测导致停顿增加
解决方案将ID阶段拆分为两个阶段
Issue对应之前的ID阶段但精简操作只做最必要的事如指令译码、资源冲突检测 – 这一阶段仍是按序执行的并且在这一阶段停顿的指令同样会阻塞后面的所有指令比如下面例子中因为资源冲突而未能发射的第二个LD阻塞了后面所有的指令 – 但这一阶段不再检测所有数据冲突因此不管就绪还是非就绪的指令都有机会发射出去Read operands等待数据冲突消除然后读取操作数 – 这一阶段检测数据冲突也是乱序执行实际发生的位置非就绪指令会停顿在这一阶段就绪指令会直接投入运行
不管是什么样的动态调度流水线都要将ID做这样的拆分差别主要是如何管理已发射、未就绪的指令计分板算法使用计分板Tomasulo算法使用保留站
每条指令的执行阶段 Issue阶段通过停顿整个流水线所有级解决WAW冲突。 Read operands通过监控源操作数是否可获得available来判定这个指令是否能执行以解决RAW冲突这只会造成单条指令的停顿流水线还是能继续 Write result阶段如果有数据需要写回计分板会先判断是否有先前的指令在读这个数据且还没读完通过引入停顿的方式解决WAR冲突这只会造成单条指令的停顿流水线还是能继续
计分板算法标记简介 计分板算法运行示例 注意cycle1阶段发射的时候就已经知道源和目标操作数以及源和目标操作数是否准备好并不需要等到Read operands阶段。 Cycle2时因为Read oprands操作读取完操作数后把Rj从Yes变成No使得其他指令没法对R2进行写这样可以避免WAR冲突。同时由于Interger部件被占用第二条指令及后面的流水线全部停顿直至第一条指令执行完毕。 注意cycle5阶段虽然第一个条指令已经过了excution阶段到了write result阶段但是第二条load指令并不会发射只能在下一个周期发射。且注意write result阶段会把计分板中和这条指令相关的所有功能部件状态及寄存器状态清空 注意cycle11是可以一次读取两个oprands的MUL和SUB指令同时在这个时钟周期读取了操作数。 注意cycle12、cycle13中不同的指令可以利用不同的功能部件同时执行MUL和SUB指令同时在这两个时钟周期处理了操作数。 注意cycle14阶段最后一条ADD指令只会在SUB写回的下一个周期才开始发射 注cycle23阶段DIV读完操作数ADD就可以写回了。
计分板算法性能分析
计分板算法没有处理控制冲突乱序执行仅局限在一个基本块内没有消除WAR/WAW冲突这些冲突仍会导致停顿
上述例子中的ADD.D的写回操作就被DIV.D给阻塞而停顿了。这属于WAR冲突。WAW冲突在上述例子中没有显示出来但是很显然计分板算法没解决这个问题只能通过停顿解决。