关闭

分支预测(Branch Prediction)

标签: c++optimization优化
27444人阅读 评论(1) 收藏 举报
分类:

分支预测(Branch Prediction)是现代处理器用来提高CPU执行速度的一种手段, 其对程序的分支流程进行预测, 然后预先读取其中一个分支的指令并解码来减少等待译码器的时间.维基百科上对此的解释是"a strategy in computer architecture design for mitigating the costs usually associated with conditional branches, particularly branches to short sections of code."

分支预测的方法有 静态预测 和 动态预测 两类:静态预测方法行为比较简单,如预测永远不转移、预测永远转移(jmp)、预测后向转移等等,它并不根据执行时的条件和历史信息来进行预测,因此预测的准确性不会很高;动态预测方法则根据同一条转移指令过去的转移情况来预测未来的转移情况。

由于程序中的条件分支是根据程序指令在流水线处理后的结果来执行的,所以当CPU等待指令结果时,流水线的前级电路也处于等待分支指令的空闲状态,这样必然出现时钟周期的浪费。如果CPU能在前条指令结果出来之前就预测到分支是否转移,那么就可以提前解码并执行相应的指令,这样就避免了流水线的空闲等待,也就相应提高了CPU的整体执行速度。但另一方面,一旦前条指令结果出来后证明分支预测是错误的, 也就是产生了错误的分支预测,那么就必须将已经装入流水线执行的指令和结果全部清除,然后再装入正确的指令重新处理,这样就比不进行分支预测而是等待结果再执行新指令有额外的周期消耗。

因此,分支预测的错误并不会导致结果的错误,而只是导致流水线的停顿,如果能够保持较高的预测准确率,分支预测就能提高流水线的性能, 换言之, 如果在软件开发过程中, 能够考虑这一特性, 减少甚至移除条件分支(值得一提的是, 条件转移不需要预测, 因此条件转移也远没有产生错误分支的性能代价大), 就能一定程度上提供程序的整体效率.

下面是几种常见的优化策略:

1.避免在循环中嵌套条件分支. 如果可能,将分支移到外部, 使用多个子循环.

	do 
	{
		if (condition_1){
			//branch_1
		} else if (condition_2){
			//branch_2
		} else {
			//branch_3
		} //if
	} while (true);

	//改进版本
	if (condition_1) {
		do {
			//branch_1
		} while (true);
	} else if (condition_2) {
		do {
			//branch_2
		} while (true);
	} else {
		do {
			//branch_3
		} while (true);
	} //if

2.合并分支条件. 此举在某种情况下可以大大降低产生错误分支预测的概率.

	if (condition_1 == 0 || condition_2 == 0 || 
		condition_3 == 0) {
		//branch
	} //if

	//改进版本:
	if ((condition_1 | condition_2 | condition_3) == 0) {
		//branch
	} //if

3.移除明显的条件分支, 将执行概率大的条件分支移前.这一条不仅仅有助于规避错误分支带来的性能惩罚, 还减少了不必要的检测分支条件消耗的CPU时钟周期.

 

尽管现代编译器的优化技术已经十分强大(举个例子, 如果你的产品主要运行在Intel的核心上, 那么使用Intel的编译器并开启优化, 通过VTune性能器来不断改进程序, 你的程序效率将比编译在Any CPU时有很大的飞跃~), 但是比起程序员本身终归略逊, 因此, 程序员或许寄希望于compiler optimization的同时, 更不妨掌握一些优化细节, 对此, 个人认为阅读一些CPU工作原理的书籍颇有裨益~

 


 

1
0
查看评论

学习笔记——分支预测入门

考试题: 1、《[我要考试]计算机体系结构_威斯康星_博士资格考试_Fall2000_Q2》 资源: 1、中科大_高性能处理器体系结构_L5_分支预测 正文如下: ======== 看体系结构,看了流水线,知道流水线流起来之后,就会产生hazard,然后就会对haza...
  • wahaha_nescafe
  • wahaha_nescafe
  • 2013-01-18 08:51
  • 1428

开源处理器Rocket的分支预测机制研究与性能评估(二)

Rocket是基于RISC-V指令集架构的开源处理器,具有分支预测功能,其实现了GShare分支预测机制,在分析Rocket处理器分支预测处理过程、分支预测实现原理的基础上,利用模拟器进行了性能测试,并依据测试结果,对Rocket处理器分支预测参数配置给出建议。
  • leishangwen
  • leishangwen
  • 2017-06-06 14:01
  • 697

如何在编程中降低分支预测错误的几率

条件分支是计算机语言最基本的操作之一。不幸的是,由于条件分支打乱了指令流的顺序,它也是处理器最难高效执行的指令之一。分支有时可以在单个时钟周期内完成执行,有时它们需要花费几十个时钟周期。分支有两种形式:条件分支和非条件分支。条件分支不是跳转到指定的指令(采纳分支,taken branch),就是执行...
  • Duofeng
  • Duofeng
  • 2007-03-19 14:57
  • 1844

分支预测

分支预测(Branch Prediction):   从P5时代开始的一种先进的,解决处理分支指令(if-then-else)导致流水线失败的数据处理方法,由CPU来判断程序分支的进行方向,能够加快运算速度。 当包含流水线技术的处理器处理分支指令时就会遇到一个问题,根据判定条件的真/假的不同,有...
  • ldld1717
  • ldld1717
  • 2016-02-29 09:57
  • 941

最近比较火的CPU漏洞解析,附带修改过带注释源码一份

先说结果,由于CPU乱序执行和分支预测功能,可以通过判断需要读取的页面是否被 cache 缓存来判断内存中存在什么内容。 简单粗暴,直接上本帅改过的代码,含中文注释,不谢。 另外膜拜下这份源码的大神。 再另外一下,乱序执行和分支预测现在CPU基本都有,目的是为了让执行单元全速执行避...
  • qq_25827741
  • qq_25827741
  • 2018-01-07 15:11
  • 859

分支预测器(Branch Predictor) 汇总介绍

当包含流水线技术的处理器处理分支指令时就会遇到一个问题,根据判定条件的真/假的不同,有可能会产生转跳,而这会打断流水线中指令的处理,因为处理器无法确定该指令的下一条指令,直到分支执行完毕。流水线越长,处理器等待的时间便越长,因为它必须等待分支指令处理完毕,才能确定下一条进入流水线的指令。   ...
  • edonlii
  • edonlii
  • 2013-04-03 11:01
  • 9138

有意思的分支预测

在stackoverflow上遇到一个有意思的问题,遂移植到国内. Why is processing a sorted array faster than an unsorted array?What is Branch Prediction? Consider a railroad junc...
  • scugxl
  • scugxl
  • 2016-03-06 12:05
  • 733

【Java深入学习系列】之CPU的分支预测(Branch Prediction)模型

作者不明,转自并发编程网   http://ifeve.com/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array/ 说明: 本文以stackoverflow上Why is it fas...
  • kiyoki
  • kiyoki
  • 2016-09-22 10:58
  • 969

学习笔记——体系结构_动态分支预测

说来好惭愧,这个应该是我7、8年前应该学习的东西,现在我还在看这个。 不过既来之则安之,下面就动态分支预测做个整理。 本文参考了如下的内容: 《中科大_高性能处理器体系结构_L6_动态分支预测》 全局预测GlobalHistory 在《学习笔记——分支预测入门》这部分,...
  • wahaha_nescafe
  • wahaha_nescafe
  • 2013-01-29 14:51
  • 2119

分支预测(Branch Prediction)

分支预测(Branch Prediction): 从P5时代开始的一种先进的,解决处理分支指令(if-then-else)导致流水线失败的数据处理方法,由CPU来判断程序分支的进行方向,能够加快运算速度。 当包含流水线技术的处理器处理分支指令时就会遇到一个问题,根据判定条件的真/假的...
  • dyllove98
  • dyllove98
  • 2013-05-05 12:24
  • 4468
    联系作者
    通过QQ与我联系(全天候7*24小时基本不在线)
    最新评论
    免责声明
    如果转载的文章侵犯了您的版权,请务必告知,我将立刻删除;
    博客所有文章允许转载,原创类不要求注明出处,随意就好;
    如果是转载的文章,建议直接转载原始来源,因为原作者极可能有更新