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-REG,如:CMP EAX, ECX; JZ label
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的更多相关文章

  1. F1 score,micro F1score,macro F1score 的定义

    F1 score,micro F1score,macro F1score 的定义 2018年09月28日 19:30:08 wanglei_1996 阅读数 976   本篇博客可能会继续更新 最近在 ...

  2. 机器学习--Micro Average,Macro Average, Weighted Average

    根据前面几篇文章我们可以知道,当我们为模型泛化性能选择评估指标时,要根据问题本身以及数据集等因素来做选择.本篇博客主要是解释Micro Average,Macro Average,Weighted A ...

  3. Micro和Macro性能学习【转载】

    转自:https://datascience.stackexchange.com/questions/15989/micro-average-vs-macro-average-performance- ...

  4. 多分类评测标准(micro 和 macro)

  5. Mac入门 (二) 使用VMware Fusion虚拟机

    有了Mac机,还是需在Mac上用Windows怎么办?, VMware Fusion 是运行在Mac机上的虚拟机软件, 类似于VMware workstation. 这样就可以在Mac上运行Windo ...

  6. RPM Fusion on CentOS7

    RPM Fusion RPM Fusion provides software that the Fedora Project or Red Hat doesn't want to ship. Tha ...

  7. 第二周02:Fusion ICP逐帧融合

    本周主要任务02:Fusion 使用ICP进行逐帧融合 任务时间: 2014年9月8日-2014年9月14日 任务完成情况: 已实现将各帧融合到统一的第一帧所定义的摄像机坐标系下,但是由于部分帧之间的 ...

  8. (转)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  ...

  9. Sensor fusion(传感器融合)

    From Wikipedia, the free encyclopedia 来自维基百科,免费的百科Sensor fusion is combining of sensory data or data ...

  10. oracle rac cache fusion

    转载自 http://blog.csdn.net/tianlesoftware/article/details/6534239 Introduction This post is about orac ...

随机推荐

  1. [Spark][kafka]kafka 的topic 创建和删除试验

    kafka 的topic 创建和删除试验 zookeeper和kafka 的安装,参考: http://www.cnblogs.com/caoguo/p/5958608.html 参考上述URL后,在 ...

  2. xxtea---单片机数据加密算法

    转:https://www.cnblogs.com/LittleTiger/p/4384741.html 各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加 ...

  3. Js获取当前页面URL各种参数

    JS获取当前页面URL各种参数 一:Location Location 对象包含有关当前 URL 的信息. Location 对象是 Window 对象的一个部分,可通过 window.locatio ...

  4. 【Java并发.5】基础构建模块

    本章会介绍一些最有用的并发构建模块,有丶东西(最后一小节,纯干货). 5.1 同步容器类 同步容器类包括 Vector 和 Hashtable ,这些类实现线程安全的方式是:将它们的状态封装起来,并对 ...

  5. 07 YAPI/基础设施 - DevOps之路

    07 YAPI/基础设施 - DevOps之路 文章Github地址,欢迎start:https://github.com/li-keli/DevOps-WiKi 简介 YApi 是一个可本地部署的. ...

  6. ZOJ - 1610 经典线段树染色问题

    这个是一个经典线段树染色问题,不过题目给的是左右左右坐标,即[0,3]包含0-1这一段 1-2这一段 2-3这一段,和传统的染色不太一样,不过其实也不用太着急. 我们把左边的坐标+1,即可,那么[0, ...

  7. c语言之sizeof的细节

    关于sizeof,我们知道sizeof并不是一个函数,尽管通常我们会用sizeof()用法(这是c语言的坑),在此关于sizeof的一些关键不被认知的进行一下总结: # include "i ...

  8. PHP实用代码片段(三)

    1. 目录清单 使用下面的 PHP 代码片段可以在一个目录中列出所有文件和文件夹. function list_files($dir) { if(is_dir($dir)) { if($handle ...

  9. mysql 无法退出sql命令行编辑

    mysql 无法退出sql命令行编辑 | ANBOBhttp://www.anbob.com/archives/579.html mysql 无法退出sql命令行编辑 - 码农甲乙丙 - CSDN博客 ...

  10. Notepad++快捷使用

    用Notepad++写代码,要是有一些重复的代码想copy一下有木有简单的方法呢,确实还是有的不过也不算太好用.主要是应用键盘上的 Home 键 和 End 键.鼠标光标停留在一行的某处,按 Home ...