【操作系统之十二】分支预测、CPU亲和性(affinity)
一、分支预测
当包含流水线技术的处理器处理分支指令时就会遇到一个问题,根据判定条件的真/假的不同,有可能会产生转跳,而这会打断流水线中指令的处理,因为处理器无法确定该指令的下一条指令,直到分支执行完毕。流水线越长,处理器等待的时间便越长,因为它必须等待分支指令处理完毕,才能确定下一条进入流水线的指令。分支预测技术便是为解决这一问题而出现的。分支预测技术包含编译时进行的静态分支预测和硬件在执行时进行的动态分支预测。
1、静态分支预测
(1)静态预测器
预测条件跳转不发生,因此总是顺序取下一条指令推测执行。仅当条件跳转指令被求值确实发生了跳转,则非顺序的代码地址被加载执行。
另外一种,则预测条件跳转总会发生,因CPU而异。对于这种静态预测如果产生错误,则惩罚就是清空后续的PipeLine中的指令。
(2)LSD:检测CPU是否处于程序的循环语句(for,while,do---while)中,如果处于循环,则会停止分支预测和禁用硬件取指,并且将LSD中的存储的指令流向ReoderBuffer。
2、动态分支预测
基于之前执行的分支信息,处理器对于正在执行的程序所做的决定。
(1)1-bit动态预测:根据该指令上次是否跳转来预测此次是否跳转。如果上次跳转,则预测此次也会跳转
(2)2-bit动态预测器:
当处于00状态时候,预测顺序分支
预测成功,仍处于00状态
预测失败,则调整为01状态
当处于01状态时,继续预测顺序分支
预测成功,则调整为00状态
预测失败,则调整为10状态
当处于10状态时,预测其他分支
预测成功,则调整为11状态
预测失败,则调整为01状态
当处于11状态时,预测其他分支
预测成功,仍处于11状态
预测失败,则回退到10状态

变种2-bit动态预测器:

BTB(Branch Target Buffer):
标记分支状态以及分支历史的一段内存被称为BTB,这段内存非常小,仅仅只存储了分支指令地址,以及预测的目标地址,以及预测的位。
当一个分支指令第一次执行时,处理器为该指令分配一个Entry放入BTB中,当指令读取请求的时候,将该指令同步放到L1的Instruction Cache以及BTB中,如果在BTB中Match上该指令,Branch Target Address将会从BTB中被读取。当指令分支执行完毕后,它的Target Address也会在BTB中被更新,Prediction Statistics也同样会更新。

3、对比
通常静态分支预测方法不需要太多硬件资源,不过它会提高编译器的复杂度,同理动态预测方法会增加硬件的复杂度,但是对编译器的要求不会太高。通常动态预测的结果会比较好,并且在编译期后决定分支,对面向对象的代码提供了更好的兼容性。
二、CPU亲和性(affinity)
CPU affinity 是一种调度属性(scheduler property), 它可以将一个进程"绑定" 到一个或一组CPU上.
在SMP(Symmetric Multi-Processing对称多处理)架构下,Linux调度器(scheduler)会根据CPU affinity的设置让指定的进程运行在"绑定"的CPU上,而不会在别的CPU上运行.
Linux调度器同样支持自然CPU亲和性(natural CPU affinity): 调度器会试图保持进程在相同的CPU上运行, 这意味着进程通常不会在处理器之间频繁迁移,进程迁移的频率小就意味着产生的负载小。
因为程序的作者比调度器更了解程序,所以我们可以手动地为其分配CPU核,而不会过多地占用CPU0,或是让我们关键进程和一堆别的进程挤在一起,所有设置CPU亲和性可以使某些程序提高性能。
参考:
处理器结构--分支预测(Branch Prediction)
分支预测
Linux中CPU亲和性(affinity)
【操作系统之十二】分支预测、CPU亲和性(affinity)的更多相关文章
- Linux中CPU亲和性(affinity)
0.准备知识 超线程技术(Hyper-Threading):就是利用特殊的硬件指令,把两个逻辑内核(CPU core)模拟成两个物理芯片, 让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和 ...
- cpu 亲和性 affinity
http://www.ibm.com/developerworks/cn/linux/l-affinity.html
- 【CPU微架构设计】利用Verilog设计基于饱和计数器和BTB的分支预测器
在基于流水线(pipeline)的微处理器中,分支预测单元(Branch Predictor Unit)是一个重要的功能部件,它负责收集和分析分支/跳转指令的执行结果,当处理后续分支/跳转指令时,BP ...
- CPU 分支预测
去年在安宁庄的时候, 有个同事阐述了一个观点:php中的if else 在执行时考虑到效率的原因,不会按我们的代码的顺序一条一条去试,而是随机找出一个分支,执行,如果不对,再随机找到一个分支 当时由 ...
- 从一段 Dubbo 源码到 CPU 分支预测的一次探险之旅
每个时代,都不会亏待会学习的人. 大家好,我是 yes. 这次本来是打算写一篇 RocketMQ 相关文章的,但是被插队了,我也是没想到的. 说来也是巧最近在看 Dubbo 源码,然后发现了一处很奇怪 ...
- 现代中央处理器(CPU)是怎样进行分支预测的?
人们一直追求CPU分支预测的准确率,论文Simultaneous Subordinate Microthreading (SSMT)中给了一组数据,如果分支预测的准确率是100%,大多数应用的IPC会 ...
- 如何在代码层面提供CPU分支预测效率
关于分支预测的基本概念和详细算法可以参考我之前写的知乎回答,基本概念不再阐述了~~ https://www.zhihu.com/question/486239354/answer/2410692045 ...
- [CSAPP笔记][第十二章并发编程]
第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟 ...
- {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器
Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...
随机推荐
- WEB API 有效的Action定义
不能有特殊名称(例如属性访问器和运算符的重载方法) 的某些编译器以特殊方式处理的成员.可使用MethodInfo.IsSpecialName判断. 不能标记为[NonAction] 所在的类必须是Ap ...
- SpringBoot静态资源文件
1.默认静态资源映射 Spring Boot对静态资源映射提供了默认配置 Spring Boot默认将 /** 所有访问映射到一下目录 classpath:/static classpath:/pub ...
- Java解析复杂JSON数据的一种方法
1.需解析JSON数据: { "code": 0, "message": "success", "sid": " ...
- ELK——Elasticsearch 搭建集群经验
本文内容 背景 ES集群中第一个master节点 ES slave节点 迁移到:http://www.bdata-cap.com/newsinfo/1712679.html 本文总结 Elastics ...
- ES6 函数的拓展(四)
一.参数带默认值函数1.在函数形参可以赋予函数默认值[即实参严格匹配undefined时,在函数内部使用形参时调用它的默认值]2.函数name属性 [返回函数名称,无名的函数返回空字符串]3.函数le ...
- 下载win10系统
有时候想重装系统但总找不到下载的地方,今天记录一下.nsdn我告诉你,这里有许多软件下载 网站URL:https://msdn.itellyou.cn/ 我想下载一个Windows10 磁力地址 ed ...
- Spark GraphX图计算核心算子实战【AggreagteMessage】
一.简介 参考博客:https://www.cnblogs.com/yszd/p/10186556.html 二.代码实现 package graphx import org.apache.log4j ...
- LoadRunner脚本录制常见问题
LoadRunner录制脚本时为什么不弹出IE浏览器?当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决. 启动浏览器,打开Internet ...
- Python基础(三)--流程控制之if、while、for,break与continue
一.流程控制之if……else…… if语句是指编程语言中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一 if 条件1: 缩进的代码块 elif 条件2: 缩进的代码 ...
- Python的诞生和各种解释器
一:Python的诞生 参考:https://www.jianshu.com/p/1cc1382e5e04 二:Python的各种解释器 参考:https://www.liaoxuefeng.co ...