分支预测(Branch Prediction)

标签: c++ optimization 优化
27838人阅读 评论(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工作原理的书籍颇有裨益~

 


 

查看评论

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

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

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

考试题: 1、《[我要考试]计算机体系结构_威斯康星_博士资格考试_Fall2000_Q2》 资源: 1、中科大_高性能处理器体系结构_L5_分支预测 正文如下: ===...
  • wahaha_nescafe
  • wahaha_nescafe
  • 2013-01-18 08:51:36
  • 1514

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

Rocket是基于RISC-V指令集架构的开源处理器,具有分支预测功能,其实现了GShare分支预测机制,在分析Rocket处理器分支预测处理过程、分支预测实现原理的基础上,利用模拟器进行了性能测试,...
  • leishangwen
  • leishangwen
  • 2017-06-06 14:01:16
  • 794

分支预测

分支预测(Branch Prediction):   从P5时代开始的一种先进的,解决处理分支指令(if-then-else)导致流水线失败的数据处理方法,由CPU来判断程序分支的进行方向,能够加快...
  • ldld1717
  • ldld1717
  • 2016-02-29 09:57:23
  • 1037

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

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

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

作者不明,转自并发编程网   http://ifeve.com/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array/ ...
  • kiyoki
  • kiyoki
  • 2016-09-22 10:58:45
  • 1065

分支预测

当包含流水线技术的处理器处理分支指令时就会遇到一个问题,根据判定条件的真/假的不同,有可能会产生转跳,而这会打断流水线中指令的处理,因为处理器无法确定该指令的下一条指令,直到分支执行完毕。流水线越长,...
  • ctrloep
  • ctrloep
  • 2013-08-13 21:46:38
  • 1393

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

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

流水线相关问题及解决方法

流水线相关问题及解决方法     相关----由于一段机器语言程序的邻近指令之间出现了某种关联后,为了避免出错而使得它们不能同时被解释的现象,又称相关冲突。     在流水解释过程中可能会出现三种...
  • zhou1519
  • zhou1519
  • 2012-11-08 18:46:37
  • 2477

(转)动态转移预测

动态转移预测 一、动态转移预测概述 1、  动态移预测的概念   1)  动态转移预测就是利用硬件来动态地预测转移指令的转移行为,以减少转移指令对流水线性能的影响,也就是减少...
  • hivivi
  • hivivi
  • 2011-08-18 10:47:06
  • 2624
    最新评论