The Execution Core
执行核的特点是1)超标量,2)乱序处理指令。通过高效处理最常用的操作,同时最小化潜在的时延,执行核优化了总体执行性能。
相比起前代微架构,Sandy Bridge的乱序执行核在如下几个方面改进了执行单元的组织结构:
- 降低了读口(即load端口)的停顿
- 降低了回写时的冲突与时延
- 节省电能
- 当非规格化输入以及下溢输出时,减少了SIMD浮点辅助(下面有解释)
(英文原文:reduction of SIMD FP assists dealing with denormal inputs and underflow outputs.)
某些高精度浮点算法需要在FTZ=0和DAZ=0设定下运行,即允许下溢的中间结果和非规格化的输入,从而获得更高的数值精度,但是代价是计算性能下降,因为在前代微架构中需要SIMD浮点辅助。在Sandy Bridge中,SIMF浮点辅助减低了,适用于如下的SSE指令(以及AVX变体):ADDPD/ADDPS,MULPD/MULPS,DIVPD/DIVPS,和CVTPD2PS。
乱序执行核有3个执行栈组成,每个栈处理一个特定的数据类型。执行栈的类型如下:
- 通用整型
- SIMD整型与浮点型
- x87
执行核具有到缓存层级结构的双向连接。要读取的数据从缓存中获得,然后写回到某个栈。
调度器每周期可以分发6条微指令,每个发射口一条。下表总结了发射口对应的操作。
表:发射口与执行栈(即对应的数据类型)
|
Port 0 |
Port 1 |
Port 2 |
Port 3 |
Port 4 |
Port 5 |
Integer |
ALU, Shift |
ALU, Fast LEA, Slow LEA, MUL |
Load_addr, Store_addr |
Load_addr, Store_addr |
Store_data |
ALU, Shift, Branch, Fast LEA |
SSE-Int, AVX-Int, MMX |
Mul, Shift, STTNI, Int-Div, 128b-mov |
ALU, Shuf, Blend, 128b-Mov |
|
|
Store_data |
ALU, Shuf, Shift, Blend, 128b-Mov |
SSE-FP, AVX-FP_Low |
Mul, Div, Blend, 256b-Mov |
Add, CVT |
|
|
Store_data |
Shuf, Blend, 256b-Mov |
x87, AVX-FP_High |
Mul, Div, Blend, 256b-Mov |
Add, CVT |
|
|
Store_data |
Shuf, Blend, 256b-Mov |
指令执行后,数据会通过回写总线将执行结果写回。回写总线的选择与发射口与执行结果的数据类型有关。通过同一发射口分发的且具有不同执行时延的多条指令可能会在某个周期同时请求回写总线回写执行结果。在这种情况下(即有冲突),其中一条微指令的执行将会被延迟,直到回写总线可用。例如,MULPS(5周期)与BLENDPS(1周期)如果都在发射口0上就绪执行,则可能发生冲突:第一个周期MULPS执行,4个周期以后BLENDPS执行。在第五个周期,两条指令都需要回写结果。
Sandy Bridge微架构消除了这种冲突,只要微指令将结果回写到不同的栈中。例如,在MULPS(5周期)指令被分发后,整型ADD(1周期)指令可以在第4个周期被分发,因为整型ADD指令使用整型栈,而MULPS指令使用浮点栈。
当某个栈中执行的指令的源操作数来自于另一个栈中的指令执行结果时,可能会需要额外的一两个周期的时延。这种时延也会发生在Intel SSE整型与Intel SSE浮点型操作之间数据传输中。某些情况下,数据传输可以使用附加在指令流中的一条微指令实现。下表描述了指令执行后回写的数据如何通过旁路网路传递给下一个周期要执行的另一条微指令。
表:执行核回写时延(周期数)
|
Integer |
SSE-Int, AVX-Int, MMX |
SSE-FP, AVX-FP_Low |
x87, AVX-FP_High |
Integer |
0 |
uop (port 0) |
uop (port 0) |
uop (port 1) + 1 cycle |
SSE-Int, AVX-Int, MMX |
uop (port 5) or uop (port 5) + 1 cycle |
0 |
1 cycle |
0 |
SSE-FP, AVX-FP_Low |
uop (port 5) or uop (port 5) + 1 cycle |
1 cycle |
0 |
uop (port 5) + 1 cycle |
x87, AVX-FP_High |
uop (port 5) + 1 cycle |
0 |
uop (port 5) + 1 cycle |
0 |
Load |
0 |
1 cycle |
1 cycle |
2 cycles |