micro-fusion & macro-fusion
micro-fusion
随着技术的发展,CPU内部指令处理单元(execution unit)以及端口(port)增多,在Pentium 4的时候,发出到Execution Unit的μops的throughput可以高达6(6 μops/clock cycle),这时候,流水线中的瓶颈会出现在register renaming(RAT)以及retirement(RRF),这两部分的throughput为3。为了突破这部分的瓶颈,Intel从Pentium M处理器开始引入了micro-fusion技术。
有很多对内存进行操作的指令都会被分成两个或以上的μops,如 add eax, [mem] 在解码时就会分成 mov tmp, [mem]; add eax, tmp。这类型的指令在前端只需要fetch与decode一条指令,相比原来的两条指令占用更少资源(带宽、解码资源、功耗),不过由于在解码后分成多个μops,占用资源(μop entries)增多,但是throughput相对较小,使得RAT以及RRF阶段显得更为拥堵。
micro-fusion为这种问题提供了很好的解决方案:把同一条指令的几个μops混合成一个复杂的μop,使得其在RAT以及RRF阶段只占用一项;而在EU阶段,该复杂μop会被多次发送到EU中进行处理,表现得像是有多个已被分解的μops一样。micro-fusion的指令可以被任意decoder进行解码
可以被micro-fused的指令:
- 所有的store指令,写回内存的store指令分为两个步骤:store-address、store-data。
- 所有读内存与运算的混合指令(load+op),如:
- ADDPS XMM9, OWORD PTR [RSP+40]
- FADD DOUBLE PTR [RDI+RSI*8]
- XOR RAX, QWORD PTR [RBP+32]
- 所有读内存与跳转的混合指令(load+jmp),如:
- JMP [RDI+200]
- RET
- CMP与TEST对比内存操作数并与立即数的指令(cmp mem-imm)。
上面的描述有例外的情况,就是不能采用RIP寄存器进行内存寻址:
- CMP [RIP+400], 27
- MOV [RIP+3000], 142
- JMP [RIP+5000000]
采用了RIP寄存器进行内存寻址的指令是不能被micro-fused的,并且这些指令只能由decoder0进行解码。
macro-fusion
Intel在Core处理器时开始引入macro-fusion技术。与micro-fusion一样,macro-fusion能使得指令占用更少的资源与功耗。不同的是macro-fusion是把两条指令组合成一个复杂的μop,这种μops在pipeline的各个阶段中也是只占用一项。
在Core微处理器中,第一条指令必须为CMP或者TEST,作用于REG-REG,REG-IMM或者REG-MEM,第二条指令必须为条件跳转指令,并且指令恰好位于第一条指令之后。比较然后进行条件跳转这种指令组合在日常的代码中非常普遍,因此如果代码设计得当,将能更容易触发macro-fusion,达到减少带宽占用以及功耗的效果。
指令流在predecode后,可以分离出一条一条的指令,然后流经instruction queue。在instruction queue与decoder之间会对可以合并的指令对进行macro-fusion。macro-fused后的指令可以被任意decoder进行解码
进行macro-fusion的指令对需要满足以下条件:
1. 对与CMP与TEST来说,只有是下面的模式才能进行合并:
REG-IMM, 如:CMP EAX, 0x80; JZ label
REG-MEM, 如:CMP EAX, [ECX]; JZ label
MEM-REG, 如:CMP [EAX], ECX; JZ label
如果是MEM-IMM模式的话,则不能合并。
2. 不同的第一条指令,对第二条指令有不同的匹配要求,并不是所有的条件跳转指令都能与第一条指令进行配对合并。
Core微处理器中可以进行macro-fusion的指令对:
| Macro-Fusibility | |||||||
|---|---|---|---|---|---|---|---|
| Instruction | TEST | CMP | |||||
| JO/JNO | ✔ | ✘ | |||||
| JC/JB/JAE/JNB | ✔ | ✔ | |||||
| JE/JZ/JNE/JNZ | ✔ | ✔ | |||||
| JNA/JBE/JA/JNBE | ✔ | ✔ | |||||
| JS/JNS/JP/JPE/JNP/JPO | ✔ | ✘ | |||||
| JL/JNGE/JGE/JNL/JLE/JNG/JG/JNLE | ✔ | ✘ | |||||
可见TEST可以跟所有的条件跳转指令合并,但是CMP只能跟检查了carry flag或者zero flag的条件跳转指令合并,也就是说Core微处理器中,对于有符号的比较跳转无法进行合并,但是无符号的比较跳转则可以进行合并。


如上图所示,有符号的条件跳转指令为JGE,而无符号的条件跳转指令为JAE。在Core微处理器中CMP与JAE可以进行macro-fusion,得到形如CMPJAE的μop。
不过在Nehalem微处理器之后就可以支持有符号跳转指令的macro-fusion了。
Sandy Bridge微处理器进一步扩充了指令可以进行macro-fusion的指令对:
| Macro-Fusibility | |||||||
|---|---|---|---|---|---|---|---|
| Instruction | TEST | CMP | AND | ADD | SUB | INC | DEC |
| JO/JNO | ✔ | ✘ | ✔ | ✘ | ✘ | ✘ | ✘ |
| JC/JB/JAE/JNB | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ |
| JE/JZ/JNE/JNZ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
| JNA/JBE/JA/JNBE | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ |
| JS/JNS/JP/JPE/JNP/JPO | ✔ | ✘ | ✔ | ✘ | ✘ | ✘ | ✘ |
| JL/JNGE/JGE/JNL/JLE/JNG/JG/JNLE | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
Reference:
Intel® 64 and IA-32 Architectures Optimization Reference Manual
Macro-Operation Fusion (MOP Fusion)
A JOURNEY IN MODERN COMPUTER ARCHITECTURES
Intel 64 and IA-32 Architectures Software Developer's Manual
micro-fusion & macro-fusion的更多相关文章
- F1 score,micro F1score,macro F1score 的定义
F1 score,micro F1score,macro F1score 的定义 2018年09月28日 19:30:08 wanglei_1996 阅读数 976 本篇博客可能会继续更新 最近在 ...
- 机器学习--Micro Average,Macro Average, Weighted Average
根据前面几篇文章我们可以知道,当我们为模型泛化性能选择评估指标时,要根据问题本身以及数据集等因素来做选择.本篇博客主要是解释Micro Average,Macro Average,Weighted A ...
- Micro和Macro性能学习【转载】
转自:https://datascience.stackexchange.com/questions/15989/micro-average-vs-macro-average-performance- ...
- 多分类评测标准(micro 和 macro)
- Mac入门 (二) 使用VMware Fusion虚拟机
有了Mac机,还是需在Mac上用Windows怎么办?, VMware Fusion 是运行在Mac机上的虚拟机软件, 类似于VMware workstation. 这样就可以在Mac上运行Windo ...
- RPM Fusion on CentOS7
RPM Fusion RPM Fusion provides software that the Fedora Project or Red Hat doesn't want to ship. Tha ...
- 第二周02:Fusion ICP逐帧融合
本周主要任务02:Fusion 使用ICP进行逐帧融合 任务时间: 2014年9月8日-2014年9月14日 任务完成情况: 已实现将各帧融合到统一的第一帧所定义的摄像机坐标系下,但是由于部分帧之间的 ...
- (转)Illustrated: Efficient Neural Architecture Search ---Guide on macro and micro search strategies in ENAS
Illustrated: Efficient Neural Architecture Search --- Guide on macro and micro search strategies in ...
- Sensor fusion(传感器融合)
From Wikipedia, the free encyclopedia 来自维基百科,免费的百科Sensor fusion is combining of sensory data or data ...
- oracle rac cache fusion
转载自 http://blog.csdn.net/tianlesoftware/article/details/6534239 Introduction This post is about orac ...
随机推荐
- Android so注入(inject)和Hook技术学习(二)——Got表hook之导入表hook
全局符号表(GOT表)hook实际是通过解析SO文件,将待hook函数在got表的地址替换为自己函数的入口地址,这样目标进程每次调用待hook函数时,实际上是执行了我们自己的函数. GOT表其实包含了 ...
- Spring Cloud 入门教程(六): 用声明式REST客户端Feign调用远端HTTP服务
首先简单解释一下什么是声明式实现? 要做一件事, 需要知道三个要素,where, what, how.即在哪里( where)用什么办法(how)做什么(what).什么时候做(when)我们纳入ho ...
- JavaScript技巧总结和本地存储(二)
离线检测 检测是否离线,html5为此定义了一个navigator.onLine属性,这个属性为true表示设备能上网,false表示离线,这个属性还有点兼容问题.因此单独使用这个属性不能确定网络是否 ...
- (Beta)Let's-M2后分析报告
设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 在M1阶段我们对用户需求进行了调研,同时M1阶段我们的开发目标就是为了解决用户发起.参与.查看.搜 ...
- spring实例入门
首先是bean文件: package onlyfun.caterpillar; public class HelloBean { private String helloWord = " ...
- 软工网络15团队作业7——Alpha冲刺之事后诸葛亮
Deadline: 2018-5-16 22:00PM,以博客提交至班级博客时间为准 事后诸葛亮分析 Alpha冲刺,很多同学经历了"Learning by doing"的学一门新 ...
- Python之异常处理(执行python文件时传入参数)
使用sys模块 使用sys模块里的argv参数,用来保存参数值 import sys #sys.argv的作用是获取到运行python文件时,传入的参数 #默认如果运行python文件不传参数,arg ...
- 爬虫——cookies池的搭建
https://github.com/Python3WebSpider/cookiesPool
- vsconsole
一.安装 npm install vconsole 二. if (process.env.NODE_ENV === `development`) { const { logger } = requir ...
- Oracle 强制中止正在执行的SQL语句
-- 1 查询正在执行的sql语句 select b.sid, b.username, b.serial#, a.spid, b.paddr, c.sql_text, b.machine from v ...