2.5. Intel® 微架构Nehalem
Intel微架构Nehalem对IntelCore i7处理器以及IntelXeon处理器3400,5500与7500系列的许多创新性的特性提供了基础。它构建在45nm增强IntelCore微架构的成功基础上,并提供下列特性改进:
· 增强的处理器核
- 改进分支预测以及从误预测恢复。
- 增强循环流化以改进前端性能并降低功耗。
- 更深的乱序引擎缓冲以榨取并行性。
- 增强的执行单元提供CRC,字符串/文本处理以及数据混排(shuffling)加速。
· 超线程技术
- 提供每核两个硬件线程(逻辑处理器)。
- 利用宽度4的执行引擎,大的L3,以及宽大的内存带宽。
· 智能内存访问
- 集成内存控制器提供对系统内存的低时延访问以及可扩展的内存带宽。
- 带有共享、内含的L3的新缓存层次组织减少了窥探传递(snooptraffic)。
- 两层TLB以及TLB大小的增加。
- 快速的非对齐内存访问。
· 专用的电源管理革新
- 管理功耗的带有优化嵌入式固件的集成微控制器。
- 温度、电流及功率的嵌入式实时传感器。
- 开关每核能耗的集成功率门限(power gate)。
- 降低内存、link子系统能耗的多功能性。
Intel微架构Westmere是Intel微架构Nehalem的32nm版本。后者的所有特性也适用于前者。
2.5.1.微架构流水线(Microarchitecturalpipeline)
Intel微架构Nehalem继承了由IntelCore微架构引领的4宽度微架构流水线。图2-10显示了实现在IntelCore i7处理器中Intel微架构Nehalem流水线的基本组件,在图2-10流水线图示中仅绘出了4个核中的2个。
图2-10. Intel微架构Nehalem流水线功能
Intel微架构Nehalem中流水线长度,以分支误预测预测计,比它的前辈45nm的IntelCore 2处理器家族要多2个周期。每周期前端可以解码最多4条指令,通过交替地在两个逻辑处理器间解码指令流来支持两个硬件线程。前端包括了分支处理,循环检测,MSROM吞吐率等方面的增强,这些在后续章节中讨论。
通过6个发布端口(5个发布端口显示在图2-10中;写操作涉及写地址与写数据的独立端口,但在图中被画成一个),调度器(或保留站)每周期可以分发最多6个微操作。
乱序引擎具有许多被安排在图2-10的3个执行簇中的执行单元。每周期它可以回收4个微操作,与前代相同。
2.5.2.前端概览
图2-11显示了微架构前端的关键组件。指令获取单元(IFU)每周期可以从指令缓存获取最多16个对齐的指令字节到指令长度解码器(ILD)。指令队列(IQ)缓冲ILD处理的指令,每周期可以向指令解码器交付最多4条指令。
图2-11. Intel微架构Nehalem的前端
指令解码器有3个可以每周期每单元解码1条简单指令的解码器单元。其他解码器单元每周期可以解码1条指令,简单的指令或者最多由6个微操作组成的复杂指令。由多于4个微操作组成的指令从MSROM交付。每周期最多可以交付4个微操作给指令解码器队列(IDQ)。
循环流检测器位于IDQ内部以改进短序列指令循环的功耗与前端效率。
指令解码器支持微操作以改进前端的吞吐量,增加调度器与重排缓冲(ROB)里队列的实际大小。微融合的规则类似于IntelCore微架构的这些规则。
在有可能的情况下,指令队列还支持宏融合将邻近的指令合并为1个微操作。在前代IntelCore微架构中,对CMP/Jcc序列的宏融合支持仅限于CF与ZF标记,而且在64比特模式下不支持宏融合。
在Intel微架构Nehalem里,在64比特模式下支持宏融合,并支持以下指令序列:
· 在比较时(未改变)CMP或TEST可以融合:
REG-REG。例如:CMPEAX, ECX; JZ label
REG-IMM。例如:CMPEAX, 0x80; JZ label
REG-MEM。例如:CMPEXA, [ECX]; JZ label
MEM-REG。例如:CMP[EAX], ECX; JZ label
· 带有所有条件跳转(未改变)的TEST可以融合。
· 带有以下条件跳转的CMP可以融合。这些条件跳转检查进位标记(carryflag,CF)或零标记(zeroflag,ZF)。能进行宏融合的条件跳转有(未改变):
JA或JNBE
JAE或JNB或JNC
JE或JZ
JNA或JBE
JNAE或JC或JB
JNE或JNZ
· 在Intel微架构Nehalem中可以融合带有以下条件跳转的CMP(这是增强):
JL或JNEG
JGE或JNL
JLLE或JNG
JG或JNLE
硬件在几个方面改进了分支处理。增加分支目标缓冲以提高分支预测的准确性。返回栈缓冲帮助重命名减少代码中返回指令的误预测。另外,改进硬件,通过加快资源回收提高分支误预测的处理,这样在分配资源执行误预测代码路径的同时,前端将不会在一条设计代码路径(architectedcode path,将进行回收指令的代码路径)里等待解码指令。相反,只要前端解码了设计代码路径中的指令,新的微操作流可以开始前进。
2.5.3.执行引擎
IDQ(图2-11)向流水线的分配/重命名阶段(图2-10)交付微操作流。乱序引擎最多支持128个进行中的微操作。每个微操作必须分配有以下资源:重排缓冲(ROB)中的一项,保留站(RS)中的一项,如果要求内存访问,一个读/写缓冲。
分配器也重命名每个进行中微操作的寄存器文件项。与一个微操作关联的输入数据通过要么从ROB读入,要么从已回收寄存器文件读入。
RS被扩展到36项(对比前代的32项)。每周期它可以分发最多6个微操作,如果微操作就绪。RS通过一个发布端口向一个指定的执行簇交付一个微操作,每个簇可能包含一组整数/FP/SIMD执行单元。
执行单元执行一个微操作的结果被写回寄存器文件,或者通过一个旁路网络转发给一个进行在需要这个结果的微操作。Intel微架构Nehalem每周期每端口可以支持写一个寄存器文件。旁路网络包含整数/FD/SIMD三个域。在同一个旁路域内从生产者微操作转发结果到一个消费者微操作由硬件没有时延地高效完成。不同旁路域间转发结果可能遭受额外的旁路时延。除了各个执行单元的时延与吞吐率特性,旁路时延可能对软件可见。跨越不同旁路域的,生产者微操作与消费者微操作间的旁路时延显示在表2-29中。
表2-29. 生产者与消费者微操作间的旁路时延
| FP | 整数 | SIMD |
FP | 0 | 2 | 2 |
整数 | 2 | 0 | 1 |
SIMD | 2 | 1 | 0 |
2.5.3.1. 发布端口与执行单元
表2-30总结了在这个微架构中常见操作的发布端口与执行单元时延/吞吐率。
表2-30. Intel微架构Nehalem的发布端口
端口 | 可执行操作 | 时延 | 吞吐率 | 域 | 注释 |
端口0 | 整数ALU 整数Shift | 1 1 | 1 1 | 整数 |
|
端口0 | 整数SIMD ALU 整数SIMD Shuffle | 1 1 | 1 1 | SIMD |
|
端口0 | 单精度(SP)FP MUL 双精度FP MUL FP MUL(X87) FP/SIMD/SSE2 Move与Logic FP Shuffle DIV/SQRT | 4 5 5 1
1 | 1 1 1 1
1 | FP |
|
端口1 | 整数ALU 整数LEA 整数Mul | 1 1 3 | 1 1 1 | 整数 |
|
端口 | 整数SIMD MUL 整数SIMD Shift PSAD 字符串比较 | 1 1 3 | 1 1 1 | SIMD |
|
端口1 | FP ADD | 3 | 1 | FP |
|
端口2 | 整数读 | 4 | 1 | 整数 |
|
端口3 | 写地址 | 5 | 1 | 整数 |
|
端口4 | 写数据 |
|
| 整数 |
|
端口5 | 整数ALU 整数shift Jmp | 1 1 1 | 1 1 1 | 整数 |
|
端口5 | 整数SIMD ALU 整数SIMD Shuffle | 1 1 | 1 1 | SIMD |
|
端口5 | FP/SIMD/SSE2 Move与Logic | 1 | 1 | FP |
|
2.5.4.缓存与内存子系统
Intel微架构Nehalem在每个核包含1个指令缓存,1个第一级数据缓存以及1个整体式第二级缓存(图2-10)。每个物理处理器可能包含几个处理器核以及一组共享的称为“uncore”的子系统。特别在IntelCore i7处理器里,uncore提供了由物理处理器中所有核共享的一个整体式第三级缓存,IntelQuickPath Interconnect连接与相关逻辑。L1与L2缓存是写回且非包含性的(non-inclusive)。
共享的L3缓存是回写且包含性的,这样在L1数据缓存或L1指令缓存、整体式L2缓存中的一个缓存行也存在于L3中。L3被设计来使用这个包含性质来最小化处理器核间的窥探传递(snooptraffic)。表2-31列出了缓存层次的特征。L3访问的时延可能是处理器与uncore子系统间的频率比(frequencyratio)的一个函数。
表2-31. Intel Core i7处理器的缓存参数
层级 | 容量 | 关联性(路) | 行大小(字节) | 访问时延(时钟) | 访问吞吐率(时钟) | 写更新策略 |
第一级数据 | 32KB | 8 | 64 | 4 | 1 | 回写 |
指令 | 32KB | 4 | N/A | N/A | N/A | N/A |
第二级 | 256KB | 8 | 64 | 10[1] | 可变 | 回写 |
第三级(共享L3)[2] | 8MB | 16 | 64 | 35-40+21 | 可变 | 回写 |
Intel微架构Nehalem实现了两级转换旁视缓冲(TLB)。第一级包含了数据与代码独立的TLB。DTLB0处理数据访问的地址翻译,对4KB页提供64个项,对更大的页,提供32个项。ITLB对4KB页提供64个项(每线程),对更大的页提供7个项(每线程)。
第二级TLB(STLB)处理4KB页面的代码与数据访问。它支持不命中DTLB0或ITLB的4KB页翻译操作。所有的项都是4路关联。下面是每个DTLB中的项列表:
· 用于4KB页的STLB:512项(支持数据与指令查找)。
· 用于更大页的DTLB0:32项。
· 用于4KB页的DTLB0:64项。
一个DTLB0不命中而STLB命中导致一个7周期的损失。如果DTLB0被用在某些分发情形中,软件才承担这个损失。与一个STLB及PMH不命中相关的时延很大程度上是非阻塞的。