网页小游戏网站建设,莱芜网站建设sikesoft,电商网站的多选菜单插件,骨科医院网站优化服务商条件跳转引起的控制冒险虽然也可以通过在流水线中插入空泡来避免#xff0c;但是当流水线很深时#xff0c;需要插入更多的空泡。一个20级的流水线为例#xff0c;如果一条指令需要上一条指令的执行结束才能执行#xff0c;则需要在这两条指令之间插入19个空泡#xff0c;… 条件跳转引起的控制冒险虽然也可以通过在流水线中插入空泡来避免但是当流水线很深时需要插入更多的空泡。一个20级的流水线为例如果一条指令需要上一条指令的执行结束才能执行则需要在这两条指令之间插入19个空泡相当于流水线要暂停19个时钟周期这是CPU无法接受的。 如图所示为了避免这种情况发生现在CPU流水线在取指和译码的时候需要对跳转指令进行分析预测可能执行的分支和路径防止预取错误的分支路径指令给流水线带来停顿。 根据工作方式的不同分支预测分为静态预测和动态预测静态预测在程序编译时通过编译器进行分支预测这种预测方式对于循环程序最有效可以根据循环边界反复取指。而对于跳转分支静态预测就比较简单粗暴了。一般都是默认不跳转按照顺序执行我们在编写有跳转分支的程序时记得把大概率发生的执行代码放在前面。这样就能明显提高执行效率。 动态预测指在程序运行时进行预测不同的软件不同的程序分支行为我们可以采取不同的算法去提高预测的准确率如我们可以根据程序历史执行路径信息来预测本次跳转行为常见的动态预测方式有1-bit动态预测n-bit动态预测下一行预测双模太预测局部分支预测。融合分支预测循环预测等。随着大量新的应用软件出现为了应对新的程序逻辑行为分支预测器也越来越复杂占用芯片体积越来越大。除了Cache就是分支预测器体积最大了。 分支预测技术是提高CPU性能的一项关键技术本质是去除指令之间的相关性让程序更高效运行一个CPU性能高不高不仅取决于流水线多深主频多高cache多大还和分支预测技术息息相关。一个分支预测器好不好我们可以两个方面衡量分支判断速度和预测准确率目前分支预测技术可以达到95%的预测准确率。 2.5.5 乱序执行 我们编写的代码指令序列按照顺序依次存储在RAM中当程序执行时PC指针会自动到RAM中去取然后CPU按照顺序一条条一次执行这种称为顺序执行。当这些指令前后有数据依赖关系时就会产生数据冒险我们可以在指令序列之间添加空指令让流水线暂时停顿来避免流水线中预期的指令被冲刷掉。除此之外我们还可以通过乱序执行来避免流水线冲突。 造成流水线冲突的根源在于指令之间存在相关性。前后指令之间要么存在数据冒险要么产生结构冒险。我们可以通过重排指令的执行顺序而不是填充空指令来去掉这种依赖。
ADD R2,R1,R0
SUB R4,R3,R2
ADD R7,R6,R5
ADD R10,R9,R8
在上面程序中第二条sub指令要使用第一条指令的运算结果要等到第一条ADD指令执行结束于是就产生了数据冒险我们可以通过插入空指令来避免。
ADD R2,R1,R0
NOP 被另外的流水线执行
NOP 被另外的流水线执行
SUB R4,R3,R2
ADD R7,R6,R5
ADD R10,R9,R8 通过暂停了流水线2个时钟周期避免了流水线冲突当指令序列中国呢存在依赖关系时就需要在流水线中不断插入空指令造成流水线频繁的停顿为了避免这种情况我们对指令重排。
ADD R2,R1,R0
ADD R7,R6,R5 提前执行把流水线占着
ADD R10,R9,R8 提前执行把流水线占着
SUB R4,R3,R2 安排到和第一条指令同一个流水线。
等第一个ADD执行完才能开始执行最后一个SUB就不存在数据冒险。 支持乱序执行的CPU处理器内部一般有专门的乱序执行逻辑电路该控制电路会对当前指令进行分析。看能否提前执行。