64-ia-32架构优化手册(5)

来源:互联网 发布:网络部咨询员提成方案 编辑:程序博客网 时间:2024/06/05 17:04

2.4. Intel® CORETM微架构与增强的Intel® CORETM微架构

Intel Core微架构引入以下特性,使得单线程以及多线程工作负荷都具有高性能与高电源效率:

·        Intel® Wide Dynamic Execution使得每个处理器核能够每周期以高带宽获取、分发、执行并回收最多4条指令。这些特性包括:

-  14级高效流水线。

-  3个算术逻辑单元。

-  4个解码器,每周期最多解码5条指令。

-  提升前端吞吐率的宏融合与微融合。

-  每周期最多分发6个微操作的峰值发布速率。

-  每周期最多回收4个微操作的峰值回收带宽。

-  先进的分支预测。

-  提高函数/过程进入与退出执行效率的栈指针追踪器。

·        Intel® Advanced Smart Cache从第二级缓存向内核交付更高的带宽,对单线程与多线程应用交付最优的性能与灵活性。这些特性包括:

-  为多核与单线程执行环境优化。

-  256比特内部数据通路,提升L2到第一级数据缓存的带宽。

-  整体式,4M字节,16路(或2M字节,8路)的共享第二级缓存。

·        Intel® Smart Memory Access根据数据访问模式从内存预取数据,并降低乱序执行的缓存不命中率。这些特性包括:

-  降低第二级缓存不命中实际时延的硬件预取器。

-  降低第一级缓存不命中实际时延的硬件预取器。

-  提高推测性执行引擎效率的内存歧义消除。

·        Intel® Advanced Digital Media Boost就单周期吞吐率与浮点操作而言,改进了大多数128比特SIMD指令。这些特性包括:

-  大多数128比特SIMD指令的单周期吞吐率(除了128比特混排,pack,unpack操作)

-  每周期最多8个浮点操作

-  3个分发SIMD指令执行的发布端口。

增强的Intel Core微架构支持IntelCore微架构的所有特性,并提供一组全面的增强。

·        Intel® Wide Dynamic Execution包括几个改进:

-  底数为16的除法器替换了之前的底数为4的除法器,以加速长时延操作,比如除法与平方根。

-  改进系统原语(primitive)以加速长时延操作,比如RDTSC,STI,CLI以及VM退出转换。

·        Intel® Advanced Smart Cache在两个处理器核之间提供了最多6M字节共享的第二级缓存(四核处理器最多12M字节L2);最多24路/组关联性。

·        Intel® Smart Memory Access支持高达1600MHz的高速系统总线,并提供内存操作更高效的处理,比如分割缓存行负载以及写到读转发情形。

·        Intel® Advanced Digital Media Boost提供128比特混排单元来加速混排,pack,unpack操作;添加了对47条SSE4.1指令的支持。

在子章节2.1.x中,IntelCore微架构的大多数描述也适用于增强IntelCore微架构。它们之间的差异被显式指出。

2.4.1.Intel® Core微架构流水线概览

Intel Core微架构流水线包含:

·        一个从内存获取指令流的顺序发布前端,连同4个指令解码器向乱序执行核提供解码后指令(微操作)。

·        一个每周期可以发布最多6个微操作,并且重排微操作一旦源操作数就绪且执行资源可用就尽快执行的乱序超标量执行核(参考表2-26)。

·        一个顺序回收单元,它确保根据程序原始次序处理微操作的执行结果并更新系统状态(architectural states)。

Intel Core 2 Extreme处理器X6800。IntelCore 2 Duo处理器以及Intel Xeon处理器3000,5100系列在Intel Core微架构基础上实现了两个处理器核。Intel Core 2 Extreme双核处理器,Intel 2 Quad处理器与Intel Xeon处理器3200系列,5300系列实现了4个处理器核。这些4核处理器的每个物理封装包含两个处理器芯片(die),每个芯片包含两个处理器核。每个核上子系统的功能显示在图2-6中。


2-6. Intel Core微架构流水线功能

2.4.2.前端

前端需要支持已解码指令(微操作)并维持到一个6发布乱序引擎的微操作流。前端的组件,它们的功能,以及微架构设计的性能挑战描述在表2-25中。

表2-25. 前端的组件

组件

功能

性能挑战

分支预测单元(BPU)

·         通过预测各种分支类型:条件、间接、直接、调用及返回,辅助指令获取单元获取最有可能执行的指令。对每个类型使用专用硬件。

·         使推测性执行成为可能。

·         通过减少“非设计路径(non-architect path)”[1]中要被获取到流水线的代码数量 ,改进推测性执行的效率。

指令获取单元

·         预取要被执行的指令

·         缓存经常使用的指令

·         预解码并缓冲指令,尽管指令流的不规则性,维护一个稳定的带宽

·         可变长指令格式导致解码带宽的不均匀(空泡)。

·         已采用分支与未对齐目标导致对获取单元交付的总体带宽的干扰

指令队列与解码单元

·         最多解码4条指令,使用宏融合最多5条

·         用于函数高效进入与退出的栈指针追踪者算法

·         实现宏融合特性,提供更高的性能与效率

·         指令队列也用作一个循环缓存,使得某些循环可以更高的带宽以及更低的功耗执行

 

·         每条指令不同的工作量要求展开为不同数量的微操作

·         前缀增加了一个解码复杂度维度

·         长度改变前缀(LCP)会导致前端空泡

2.4.2.1. 分支预测单元

分支预测使得处理器可以早在分支结果被确定前开始执行指令。所有分支都使用BPU进行预测。BPU包含以下特性:

·        16项返回栈缓冲(Return Stack Buffer,RSB)。它使得BPU可以准确地预测RET指令。

·        前端对BPU查找的排队。BPU一次对32个字节进行分支预测,这是取指引擎宽度的两倍。这使得分支可以被无代价(nopenality)地预测

即使BPU机制通常消除了已采用分支的代价,软件仍然应该视已采用分支比未采用分支消耗更多资源。

BPU进行以下类型的预测:

·        直接调用与跳转。目标被读作应该目标数组,不考虑已采用或未采用预测。

·        间接调用与跳转。这些可能被预测为具有一个无变化的目标,或具有根据最近程序行为而变的目标。

·        条件分支。预测分支目标,以及该分支将被采用或不采用。

关于对BPU优化代码的信息,参考3.4节,“优化前端”。

2.4.2.2. 指令获取单元

指令获取单元由指令转换旁视缓冲(instructiontranslation lookaside buffer,ITBL),一个指令提取器,指令缓存以及指令队列的预解码逻辑。

指令缓存与ITBL

指令提取是通过ITBL在指令缓存以及指令预取缓冲中的一个16字节对齐的查找。指令缓存的一个命中使得16个字节被提交到指令预解码器。依赖于要执行的代码,典型的程序平均每条指令略小于4个字节。因为大多数指令可以由所有的解码器解码,一次完整的提取通常可以在一个周期内被解码器解码完毕。

一个未对齐的目标减少了,在16字节提取字节内的偏移量那么多的,指令字节数。一个已采用分支减少了提交给解码器的指令字节数,因为这个已采用分支后的字节没有解码。在典型的整数代码中,大约每10条指令出现一次分支,这等价为每3或4个周期一次“部分”指令提取。

因为机器余下部分的暂停,前端等待(starvation)通常不会造成性能下降。对于使用更大指令的极快代码(比如SSE2整数多媒体内核),使用目标导向的对齐以避免指令等待(starvation)是有好处的。

指令预解码

预解码单元接受来自指令缓存或预取缓冲的16个字节,并执行以下任务:

·        确定指令的长度。

·        解码与指令相关的所有前缀。

·        为解码器标记指令的各种属性(例如,“是分支”)。

预解码单元可以每周期向指令队列写入6条指令。如果一个预取包含超过6条指令,预解码器继续每周期解码最多6条指令,直到所有预取的指令被写入指令队列。仅在当前预取完成后,后续的提取才可以进入预解码。

对于一个7条指令的提取,预解码器在一个周期里解码前6条指令,在下一个周期仅解码1条指令。这个过程每周期支持解码3.5条指令。即使每周期指令(Instructionper cycle,IPC)速率没有完全优化,它比大多数应用中看到的性能都要高。总之,软件通常无需采用额外的措施来防止指令等待(instructionstarvation)。

在长度解码期间,以下指令前缀会导致问题。这些前缀可以动态地改变指令的长度,被称为长度改变前缀(lengthchanging prefix,LCP):

·        在一条带有字立即数指令前的操作数大小改写(Operand SizeOverride,66H)。

·        在实模式,16比特保护或32比特保护模式里,在一条带有一个modR/M指令前的地址大小改写(AddressSize Overri,67H)。

当预解码器在提取行中遭遇一个LCP时,它必须使用一个更慢的长度解码算法。使用这个更慢的长度解码算法,预解码器在6个周期中解码提取的指令,而不是通常的1个周期。

在处理器流水线内正常的排队通常不能隐藏LCP的代价。

在Intel 64架构指令集中的REX前缀(4xh)可以改变两类指令的大小:MOV偏移与MOV立即数。不过,它不会导致LCP代价,因此不被视为LCP。



[1] 处理器认为它应该执行的代码路径,但随后发现应该到另一条路径,并因此从其最初的意图恢复。

2.4.2.3. 指令队列(IQ)

指令队列的深度是18条指令。它位于指令预解码单元与指令解码器之间。每周期它最多发送5条指令,并且每周期支持一个宏融合。它也用作一个小于18条指令循环的循环缓存。循环缓存依以下描述运行。

循环流检测器(Loop Stream Detector,LSD)位于BPU内。LSD尝试检测作为从指令队列(IQ)流出(streaming)候选的循环。当检测到这样的一个循环时,指令字节被锁定,允许循环从IQ流出,直到发生一个误预测。当该循环从IQ再现时,它以更低的功耗提供更高的带宽(因为前端流水线余下的大部分被关闭了)。

LSD提供以下的好处:

·        不会因为已采用分支而损失带宽。

·        不会因为未对齐指令而损失带宽。

·        没有LCP代价(penalty),因为已经通过了预解码阶段。

·        降低了前端功耗,因为指令缓存,BPU与预解码单元可以不活动。

软件应该机会主义地使用循环缓存功能。循环展开以及其他代码优化可能使得循环太大,无法放入LSD。对于高性能代码,循环展开性能上通常更可取,即使在它超出了循环缓存的能力时。

2.4.2.4. 指令解码

Intel Core微架构包含4个指令解码器。第一个,解码器0,可以解码大小最多为4个微操作的Intel64与IA-32指令。其他3个解码器处理单微操作指令。微定序器(sequencer)每周期最多可以提供3个微操作,辅助超过4个微操作指令的解码。

所有解码器都支持单微操作流(micro-op flow)的常见情形,包括:微融合,栈指针追踪与宏融合。因此,3个简单的解码器并不仅限于解码单微操作指令。将指令封装进一个4-1-1-1模板是必要也不建议的。

宏融合将两条指令合并为单个微操作。Intel Core微架构以32比特运行(包括Intel64架构兼容的子模式),每周期能进行一次宏融合,但不是在64比特模式下,因为使用更长指令的代码通常更不可能利用好硬件对宏融合的支持。

2.4.2.5. 栈指针追踪器

对于参数传递以及函数进入与退出,Intel 64与IA-32架构有几个常用的指令:PUSH,POP,CALL,LEAVE与RET。这些指令隐含地更新栈指针寄存器(RSP),无需软件干预维护一个混合的控制域参数栈。在之前的微架构中,这些指令通常由几个微操作实现。

栈指针追踪器将这些隐含的RSP更新移到包含在解码器本身的逻辑里。这个特性提供以下好处:

·        提高了解码带宽,因为在Intel Core微架构中PUSH,POP以及RET都是单微操作指令。

·        保留了执行带宽,因为RSP更新不竞争执行资源。

·        提高了乱序执行引擎的并行度,因为微操作间隐含的串行依赖被移除了。

·        提高了电源效率,因为RSP更新在小的,专用硬件上执行。

2.4.2.6. 微融合

微融合将来自同一条指令的多个微操作融合为单个复杂的微操作。这个复杂的微操作被交付给乱序核。微融合提供了以下的性能优势:

·        提高了从解码到回收所提供的指令带宽。

·        减少了功耗,因为复杂微操作在一个更小的格式中表示了更多的工作(就比特密度而言),对给定的工作量,降低了机器整体的“比特反转(bit-toggling)”,实际上增加了乱序执行引擎中的储存数量。

许多指令提供了寄存器类型(register flavors)与内存类型(memoryflavors)。涉及一个内存操作数的类型将解码为一个比寄存器版本更长的微操作流。微融合使软件能够使用内存到寄存器操作来表示程序实际行为,而无需担心损失解码带宽。