Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (6) - 流水线前端微熔合/宏熔合

版权声明:转载必须保留原出处,没有书面许可不可用于商用目的, https://blog.csdn.net/qq_43401808/article/details/85997052

Micro Fusion

微熔合将来自于同一条x86指令的多条微指令熔合成单条复杂的微指令.这条复杂的微指令可以被分发到乱序执行核任意多次,就好象没有进行过微熔合一样(即乱序执行核并不能感知到微熔合机制的存在)。

微熔合机制使得程序员可以使用“存储器到寄存器”这样的操作方式(这种操作在复杂指令集计算机中很常见),来编写程序而不需担心会损失前端译码带宽。微熔合可以整体提升指令从译码到退役的带宽,同时节省电力。

过多的使用单微指令的x86指令来编写程序会增加代码长度,降低传统译码流水线的取指带宽。

下面是一些微熔合的示例,可以被所有的译码器处理。

  • 所有的写存操作,包括写立即数到存储器。在处理器内部,写存操作是两个独立的操作:存储目标地址,和存储数据。

例如,MOV [5000H], 1234H,这条指令将立即数1234H写到存储器地址5000H中(假设基地址是0)。没有微熔合机制的情况下,这条指令会对应两条微指令,存储目标地址5000H,存储数据1234H。有了微熔合机制,这条指令译码后只对应单条的复杂微指令。TODO:这个理解是否正确。

  • 所有的读存加计算操作类型(load + op)都可以微熔合为一条微指令,例如

ADDPS XMM9, OWORD PTR [RSP+40]; todo: how long for OWORD PTR?

FADD DOUBLE PTR [RDI+RSI*8];

XOR RAX, QWORD PTR [RBP+32];

  • 所有的读存加跳转操作类型(load + jump),例如

JMP [RDI+200]

RET ; load instruction pointer and jump

 

  • CMP/TEST指令使用存储器寻址和立即数

例如,CMP [5000H], 1234H

使用RIP相对寻址的指令在如下的情况下无法进行微熔合:

  • 有一个额外的立即数,例如

CMP [RIP+400], 27

MOV [RIP+3000], 142

  • 控制流指令使用间接目标且目标是RIP相对寻址方式,例如

JMP [RIP+500000000];

对于不能实施微熔合的情况,x86指令只能由复杂译码器进行译码,生成两条微指令;这样会稍微降低译码带宽。

在64位代码中,RIP相对寻址方式经常用于寻址全局数据。由于没有微熔合机制,当移植32位程序到64位上时,频繁访问全局数据的代码性能可能会有所下降。

Macro-Fusion

宏熔合可以将两条x86指令熔合,译码后只生成单条微指令。在Intel Core微架构中,这个硬件优化机制是有较大限制的,只能针对符合特定条件的指令对进行熔合。

  • 第一条指令修改标志寄存器且满足一定条件(参下):
    • Nehalem微架构:CMP, TEST
    • Sandy Bridge微架构:CMP, TEST, ADD, SUB, AND, INC, DEC
    • 具备宏熔合条件的上述指令必须符合以下格式
      • 第一个源/目标操作数是寄存器

注:TEST指令只有两个源操作数;ADD指令第一个是目的操作数,第二个是源操作数;INC只有一个目的操作数。

      • 第二个源操作数(如果存在)是以下任一:立即数,寄存器数,非RIP相对寻址的存储器数
  • 第二条指令是条件转移指令。下表描述了每条指令可以与之熔合的分支指令。

Instructions (2nd↓ \  1st →)

TEST

AND

CMP

ADD

SUB

INC

DEC

JO/JNO

Y

Y

N

N

N

N

N

JC/JB/JAE/JNB

Y

Y

Y

Y

Y

N

N

JE/JZ/JNE/JNZ

Y

Y

Y

Y

Y

Y

Y

JNA/JBE/JA/JNBE

Y

Y

Y

Y

Y

N

N

JS/JNS/JP/JPE/JNP/JPO

Y

Y

N

N

N

N

N

JL/JNGE/JGE/JNL/JNG/JG/JNLE

Y

Y

Y

Y

Y

Y

Y

 

如果第一条指令结束于缓存行的63字节上(即缓存行行尾),第二条条件分支指令起始于下一个缓存行的0字节上(即缓存行行首),这两条指令不可以做宏熔合。

由于符合宏熔合条件的指令对在各种类型的程序中都很常见,所以即便不重新编译程序,宏熔合机制也能带来性能收益。

宏熔合后的指令都只需要一次分发即可投入执行(因为只生成一条微指令)。这样既降低了执行延迟,也节省了执行资源。同时,还可以获得更高的重命名和指令退役带宽,增加虚拟存储容量(即更高的存储密度),以及用更少的比特位表示更多的操作,从而更加节能。

猜你喜欢

转载自blog.csdn.net/qq_43401808/article/details/85997052