图形渲染处理器技术分析(下)
5.1 ARM处理器
ARM最初是Acorn计算机的处理器,因此其原名为Acorn RISC Machine,伯克利RISC论文影响了其架构。最重要的早期应用之一是16位微处理器AM 6502的仿真,该仿真旨在为Acorn计算机提供大部分软件。由于6502有一个可变长度的指令集,是字节的倍数,因此6502仿真有助于解释ARMv7指令集中对移位和屏蔽的强调。它作为一款低功耗嵌入式计算机的流行始于它被选为命运多舛的Apple Newton个人数字助理的处理器。
虽然Newton并没有苹果希望的那么受欢迎,但苹果的祝福让早期的ARM指令集变得引人注目,随后它们在包括手机在内的几个市场上流行起来。与Newton的经历不同,手机的非凡成功解释了2014年出货120亿ARM处理器的原因。ARM历史上的一个重大事件是称为版本8的64位地址扩展,ARM借此机会重新设计了指令集,使其看起来更像MIPS,而不像早期的ARM版本。
ARM处理器(通常称为ARM内核)最重要的一点是ARM设计处理器,然后将设计许可给客户。与英特尔或IBM等其他供应商不同,ARM不生产硅片。相反,德州仪器(Texas Instruments)和高通(Qualcomm)等供应商购买了使用ARM内核设计的许可证,并添加了额外的组件。然后,他们将合同交给半导体制造公司,或使用自己的制造设施在硅上制造整个SOC(片上系统)。
ARM的最新(截至2012年)ARMv8架构有三条处理器线:
- 第1系列处理器被称为ARM Cortex-M系列。这些处理器主要设计用于医疗设备、汽车和工业电子等嵌入式应用中的微控制器,其设计背后的主要关注点是功率效率和成本。本节将描述具有三阶段流水线的ARM Cortex-M3处理器。
- 第2系列处理器被称为ARM Cortex-R系列。这些处理器是为实时应用而设计的,主要重点是可靠性、高速和实时响应。它们不适用于智能手机等消费电子设备,不支持运行使用虚拟内存的操作系统。
- 第3系列处理器被称为ARM Cortex-A系列。这些处理器设计用于在智能手机、平板电脑和一系列高端嵌入式设备上运行常规用户应用程序。这些ARM内核通常具有复杂的管线,支持向量操作,并且可以运行需要虚拟内存硬件支持的复杂操作系统。
ARM Cortex-M3
让我们从主要为嵌入式处理器市场设计的ARM Cortex-M系列处理器开始。对于这样的嵌入式处理器,能效和成本比原始性能更重要。因此,ARM工程师设计了一个3执行的流水线,没有非常复杂的功能。
Cortex-M3支持ARMv7-M指令集的基本版本,通常使用ARM AMBA总线连接到其他组件,如下图所示。
连接到AMBA总线的ARM Cortex-M3以及其他组件。
ARM Cortex-M3架构图。
AMBA(高级微控制器总线体系结构)是一种由ARM设计的总线体系结构,它用于将ARM内核与基于SOC的系统中的其他组件连接。例如,智能手机和移动设备中的大多数处理器使用AMBA总线通过桥接设备连接到高速内存设备、DMA引擎和其他外部总线。一种这样的外部总线是APB总线(高级外围总线),用于连接到外围设备,例如键盘、UART控制器(通用异步收发器协议)、计时器和PIO(并行输入输出)接口。
下图显示了ARM Cortex-M3的流水线。它有三个阶段:获取(F)、解码(D)和执行(E)。提取阶段从内存中提取指令,是所有三个阶段中最小的阶段。
ARM Cortex-M3的流水线。
解码阶段(D阶段)有三个不同的子单元,如上图所示。D阶段有一个指令解码和寄存器读取单元,解码指令,并形成指令包,同时读取指令中嵌入的操作数的值,也从寄存器文件中读取值。AGU(地址生成单元)提取指令中的所有字段,并在流水线的下一阶段调度加载或存储指令的执行。它在处理ldm(加载多个)和stm(存储多个)指令时扮演着特殊的角色。这些指令可以同时读取或写入多个寄存器,AGU使用管线中的单个ldm或stm指令创建多个操作。分支单元用于分支预测,它预测分支结果和分支目标。
执行阶段在功能方面相当繁重,有些指令需要2个周期才能执行,先看看常规ALU和分支指令。ARM指令可以有一个移位器操作数,其次,从其12位编码计算32位立即数的值本质上是移位(旋转是移位的一种类型)操作,这两种操作都由具有称为桶形移位器的硬件结构的移位单元执行。一旦操作数就绪,它们就被传递给ALU和分支单元,后者计算分支结果/目标和ALU结果。
ARM有两种分支:直接分支和间接分支。对于直接分支,分支目标与当前PC的偏移量嵌入指令中,比如到标签的分支是直接分支的示例,可以在解码阶段计算直接分支的分支目标。ARM还支持间接分支,其中分支目标是ALU或内存指令的结果,例如,指令ldr-pc, [r1, #10]是间接分支的一个示例,此处的分支目标的值等于加载指令从内存加载的值,通常很难预测间接分支的目标。在Cortex-M3处理器中,每当出现分支预测失误(目标或结果)时,在分支后提取的两条指令都会被取消,处理器开始从正确的分支目标获取指令。
除了基本的ALU,Cortex-M3还有一个乘除单元,可以执行有符号和无符号、乘法和除法。Cortex-M3支持两条指令sdiv和udiv,分别用于有符号和无符号除法。除了这些指令外,它还支持乘法和乘法累加操作。
加载和存储指令通常需要两个周期,它们具有地址生成阶段和内存访问阶段。加载指令需要2个周期才能执行,注意,在第二个周期中,其他指令不可能在E阶段执行。管线因此停滞一个周期,这种特殊特性降低了管线的性能,ARM在其高性能处理器中消除了这一限制。存储指令也需要2个周期才能执行,但访问内存的第二个周期不会使管线停止。处理器将值写入存储缓冲器(类似于写入缓冲器),然后继续执行。还可以发出背靠背(连续循环)存储和加载指令,其中加载读取存储写入的值。管线不需要为加载指令暂停,因为它从存储缓冲区读取存储写入的值。
ARM Cortex-A8
与Cortex-M3(嵌入式处理器)相比,Cortex-A8被设计为可以在复杂的智能手机和平板电脑处理器上运行的全边缘处理器。A代表应用程序,ARM的意图是使用该处理器在移动设备上运行常规应用程序。其次,这些处理器被设计为支持虚拟内存,并且还包含专用浮点和SIMD单元。
Cortex-A8内核流水线的设计特点是它是一个双问题超标量处理器,但并不是一个完全乱序的处理器。问题的逻辑是无序的Cortex-A8有一个13阶段整数流水线,带有复杂的分支预测逻辑。由于它使用深度管线,因此可以以比其他具有较浅管线的ARM处理器更高的频率对其进行计时。Cortex-A8内核的时钟频率在500MHz和1GHz之间,在嵌入式领域是相当快的时钟速度。
除了整数管线,Cortex-A8还包含一个专用浮点和SIMD单元。浮点单元实现ARM的VFP(矢量浮点)ISA扩展,SIMD单元实现ARM NEON指令集。该单元也是流水线式的,有10个阶段。此外,ARM Cortex-A8处理器具有单独的指令和数据缓存,可以选择连接到大型共享二级缓存。
下图显示了ARM Cortex-A8处理器的流水线设计。提取单元在两个阶段之间进行流水线处理,主要目的是获取指令并更新PC,它还内置了指令预取器、ITLB(指令TLB)和分支预测器,指令随后传递到解码单元。
ARM Cortex-A8处理器的流水线。
ARM Cortex-A8架构图。
解码单元在5阶段之间进行流水线处理。Cortex-A8处理器中的解码单元比Cortex-M3更复杂,因为它有额外的责任检查指令之间的相关性,并一起发出两条指令。因此,转发、暂停和互锁逻辑要复杂得多。让我们对两个指令执行槽0和1进行编号,如果解码阶段找到两个不具有任何相关性的指令,那么它会用指令填充两个执行槽,并将它们发送到执行单元。否则,解码阶段只发出一个时隙。
执行单元跨6个阶段进行流水线处理,它包含4个独立的流水线,有两个ALU管道,两个指令都可以使用。它有一个乘法管线,只能由插槽0中发出的指令使用。最后,它有一个加载/存储管线,可以再次被两个发布槽中发出的指令使用。
NEON和VFP指令发送到NEON/VFP单元,NEON/VFP指令的解码和调度需要三个周期,NEON/VFP单元从包含32个64位寄存器的NEON寄存器文件中取出操作数。NEON指令还可以将寄存器文件视为十六个128位寄存器,NEON/VFP单元有六个6级流水线用于算术运算,还有一个6阶段管道用于加载/存储操作,加载矢量数据是SIMD处理器中非常关键的性能操作。因此,ARM在NEON单元中有一个专用的加载队列,用于通过从L1缓存加载数据来填充NEON寄存器文件。为了存储数据,NEON单元将数据直接写入L1缓存。
每个一级缓存(指令/数据)的块大小为64字节,关联性为4,可以是16KB或32KB。其次,每个L1缓存有两个端口,每个周期可以为NEON和浮点操作提供4个字。需要注意的是,NEON/VFP单元和整数管线共享L1数据缓存。L1缓存可选地连接到大型L2缓存,它的块大小为64字节,是8路集关联的,最大可达1MB,二级缓存分为多个存储库。可以同时查找两个标记,数据数组访问并行进行。
ARM Cortex-A8 NEON和浮点管线。
ARM Cortex-A15
ARM Cortex-A15是2013年初发布的最新ARM处理器,面向高性能应用。
Cortex-A5处理器比Cortex-M3和Cortex-A8复杂得多,功能也更强大。它没有使用乱序内核,而是使用了3执行的超标量无序内核。它还有一条更深的管线,具体来说,它有一个15阶段整数管线和一个17-25阶段浮点管线。更深的管线允许它以更高的频率(1.5-2.5GHz)运行。此外,它在内核上完全集成了VFP和NEON单元,而不是将它们作为单独的执行单元。与服务器处理器一样,它被设计为访问大量内存,可以支持40位物理地址,意味着它可以使用支持系统级一致性的最新AMBA总线协议来寻址多达1 TB的内存。Cortex-A15旨在运行现代操作系统和虚拟机,虚拟机是可以帮助在同一处理器上同时运行多个操作系统的特殊程序,用于服务器和云计算环境,以支持具有不同软件需求的用户。Cortex-A15采用了先进的电源管理技术,可在不使用处理器时动态关闭部分处理器。
Cortex-A15处理器的另一个标志性特点是它是一个多核处理器,为每个集群组织4个核心,每个芯片可以有多个集群。Snoop控制单元提供集群内的一致性,AMBA4规范定义了跨集群支持缓存和系统级一致性的协议,AMBA4总线还支持同步操作。内存系统也更快、更可靠,Cortex-A15的内存系统使用SECDED(单错误纠正,双错误检测)错误控制代码。
下图显示了Cortex-A15内核的管线概览。有5个提取阶段,fetch更复杂,因为Cortex-A15有一个复杂的分支预测器,可以处理多种类型的分支指令。解码、重命名和指令分派单元在7个阶段之间进行流水线处理。寄存器重命名单元和指令窗口对无序处理器的性能至关重要,它们的作用是在给定的周期内发出准备执行的指令集。
ARM Cortex-A15处理器的概览。
ARM Cortex-A15 MPCore芯片结构图。
Cortex-A15有几个执行管线。整数ALU和分支管线各需要3个周期,但乘法和加载/存储管线更长。与其他将NEON/VFP单元视为物理独立单元的ARM处理器不同,Cortex-A15将其集成在内核上,是乱序管线的一部分。现在更详细地看一下管线(参见下图)。
ARM Cortex-A15处理器的管线。
Cortex-A5内核(Cortex-A8的分支预测器也具有相同的功能)分支预测器包含直接分支预测器、间接分支预测器和预测返回地址的预测器。间接分支预测器尝试基于分支指令的PC来预测分支目标,有一个256个条目,由给定分支的历史及其PC索引。实际上不需要复杂的分支预测逻辑来预测返回指令的目标,一个更简单的方法是每当调用函数时记录返回地址,并将其推送到堆栈(称为返回地址堆栈,RAS)。由于函数调用表现出后进先出的行为,因此需要简单地弹出RAS并在从函数返回时获取返回地址的值。最后,为了支持更宽的问题宽度,提取单元被设计为一次从指令缓存中提取128位。
循环缓冲区(也存在于Cortex-A8中)是解码阶段的一个非常有趣的补充。假设在循环中执行一组指令,在任何其他处理器中,都需要在循环中重复获取指令,并对其进行解码,这个过程浪费了能量和内存带宽。可以通过将所有解码的指令包保存在循环缓冲区中来优化此过程,以便在执行循环时完全绕过提取和解码单元,寄存器重命名阶段因此可以从解码单元或循环缓冲器获得指令。
内核维护一个包含所有指令结果的重新排序缓冲区(ROB),ROB中的条目是按程序顺序分配的。重命名阶段将操作数映射到ROB中的条目(在ARM文档中称为结果队列),例如,如果指令3需要一个将由指令1产生的值,则相应的操作数被映射到指令1的ROB条目。所有指令随后进入指令窗口,等待其源操作数就绪。一旦准备就绪,它们就会被发送到相应的管线。Cortex-A15具有2个整数ALU、1个分支单元、1个乘法单元和2个加载/存储单元,NEON/VFP单元每个周期可接受2条指令。
加载/存储单元具有4阶段管线。为了确保精确的异常存储,只有当指令到达ROB的头部时(管线中没有更早的指令),才会向内存系统发出存储。同时,对管线中相同地址执行存储操作的任何加载操作都会通过转发路径获取其值。两个L1缓存(指令和数据)通常各为32KB。
Cortex-A15处理器支持大型二级缓存(高达4 MB),它是一个带有主动预取器的16路集合关联缓存。L1缓存和L2缓存是缓存一致性协议的一部分,Cortex-A55使用基于目录的MESI协议,二级缓存包含一个窥探标记数组,该数组维护一级所有目录的副本。如果I/O操作希望修改某一行,则二级缓存使用窥探标记数组来查找该行是否位于任何一级缓存中。如果任何一级缓存包含该行的副本,则该副本无效。同样,如果存在DMA读取操作,则L2控制器从包含其副本的L1缓存中取出该行。此外,还可以扩展此协议以支持L3缓存和一系列外围设备。
Cortex-A53是一个可配置内核,支持ARMv8指令集架构,作为IP(知识产权)核心交付。IP核心是嵌入式、个人移动设备和相关市场的主要技术交付形式,数十亿的ARM和MIPS处理器已经从这些IP核中创建出来。
注意,IP核与Intel i7多核计算机中的核不同。IP核(其本身可能是多核)被设计为与其他逻辑结合(因此它是芯片的“核心”),包括专用处理器(例如视频编码器或解码器)、I/O接口和存储器接口,然后被制造为针对特定应用优化的处理器。虽然处理器内核在逻辑上几乎相同,但最终产生的芯片有很多不同。一个参数是二级缓存的大小,它可以变化16倍。
SPEC2006整数基准的ARM Cortex-A53上的CPI。
5.2 AMD处理器
现在来研究AMD处理器的设计。AMD处理器实现x86指令集,为移动设备、上网本、笔记本电脑、台式机和服务器制造处理器。本节将研究设计频谱两端的两个处理器。AMD Bobcat处理器适用于移动设备、平板电脑和上网本,它实现了x86指令集的一个子集,其设计的主要目标是功率效率和可接受的性能水平。AMD Bulldozer处理器处于另一端,专为高端服务器设计,它针对性能和指令吞吐量进行了优化,也是AMD的第一个多线程处理器,使用了一种称为联合内核的新型内核来实现多线程。
AMD Bobcat
Bobcat处理器设计为在10-15W功率预算内运行,在这个功率预算内,Bobcat的设计者能够在处理器中实现大量复杂的架构特性,如Bobcat使用了一个相当复杂的2执行乱序管线。Bobcat的流水线使用了一个复杂的分支预测器,设计用于在同一周期内获取2条指令。它随后可以以该速率解码它们,并将它们转换为复杂的微操作(Cop)。AMD术语中的复杂微操作是一种类似CISC的指令,可以读取和写入内存,这组Cop随后被发送到指令队列、重命名引擎和调度器。
调度器按顺序选择指令,并将它们分派给ALU、内存地址生成单元和加载/存储单元。为了提高性能,加载/存储单元还无序地向内存系统发送请求。因此很容易地得出结论,Bobcat支持弱内存模型,除了复杂的微架构功能外,Bobcat还支持SIMD指令集(最高SSE 4)、自动将处理器状态保存在内存中的方法以及64位指令。为了确保处理器的功耗在限制范围内,Bobcat包含大量节能优化,其中一个突出的机制被称为时钟门控( clock gating),对于未使用的单元,时钟信号被设置为逻辑0,确保了在未使用的单元中没有信号转换,因此没有动态功率的耗散。Bobcat处理器还尽可能使用指向数据的指针,并尽量减少在处理器中不同位置复制数据。
下图显示了AMD Bobcat处理器的流水线框图。Bobcat处理器的一个显著特点是相当复杂的分支预测器,需要首先预测指令是否是分支,因为在x86 ISA中没有办法快速解决这个问题。如果一条指令被预测为分支,需要计算其结果(执行/未执行)和目标。AMD使用基于高级模式匹配的专有算法进行分支预测,在分支预测之后,提取引擎一次从I缓存中提取32个字节,并将其发送到指令缓冲区。
AMD Bobcat处理器的流水线。
解码器一次考虑22个指令字节,并试图划分指令边界。这是一个缓慢且计算密集的过程,因为x86指令长度可能具有很大的可变性。较大的处理器通常缓存该信息,以便第二次解码指令更容易。由于Bobcat的解码吞吐量仅限于2条指令,因此它没有此功能。现在,大多数x86指令对在22字节内,因此解码器可以在大多数时间提取这两个x86指令的内容。解码器通常将每个x86指令转换为1-2个Cop,对于一些不常用的指令,它用微码序列替换指令。
随后,Cop被添加到56条目重新排序缓冲区(ROB)中。Bobcat有两个调度程序,整数调度器有16个条目,浮点调度器有18个条目。整数调度器在每个周期选择两条指令执行,整数管线有两个ALU和两个地址生成单元(1个用于加载,1个用于存储),浮点管线也可以在每个周期执行两次Cop,但有一些限制。
处理器中的加载存储单元将值从存储转发到流水线中的加载指令。Bobcat拥有32KB(8路关联)的L1 D和I缓存,它们连接到512 KB的二级缓存(16路集合关联),总线接口将二级缓存连接到主内存和系统总线。
现在考虑一下管线的时间调度。Bobcat整数管道分为16个阶段,由于管线较深,可以在1-2GHz之间的频率对核心进行时钟控制。Bobcat管线有6个提取周期和3个解码周期,最后3个提取周期与解码周期重叠,重命名引擎和调度程序需要4个周期。对于大多数整数指令,需要1个周期读取寄存器文件,1个周期访问ALU,以及1个周期将结果写回寄存器文件。浮点流水线有7个附加阶段,加载存储单元需要3个附加阶段用于地址生成和数据缓存访问。
AMD Bulldozer
顾名思义,Bulldozer核心位于频谱的另一端,主要用于高端台式机、工作站和服务器。除了是一个激进的无序机器之外,它还具有多线程功能。Bulldozer实际上是多核、单粒度多线程处理器和SMT的组合,其核心实际上是一个“联合核心”,由两个共享功能单元的较小核心组成。
两个Bulldozer线程共享获取引擎(参见下图)和解码逻辑。管线的这一部分(称为前端)在两个线程之间每一个周期或几个周期切换一次,然后将整数、加载存储和分支指令分派到两个内核中的一个。每个内核包含一个指令调度器、寄存器文件、整数执行单元、L1缓存和一个加载存储单元,每个内核可被视为一个没有指令获取和解码功能的自我支持的内核。两个内核共享在SMT模式下运行的浮点单元,它有专用的调度器和执行单元Bulldozer处理器设计用于在3-4GHz下运行服务器和数字工作负载,最大功耗限制为125-140W。
Bulldozer处理器概览。
现在考虑下图中处理器的更详细视图。
Bulldozer处理器的读取宽度是Bobcat处理器的两倍。它每个周期最多可以提取和解码4条x86指令,与Bobcat类似,Bulldozer处理器具有复杂的分支预测逻辑,可以预测指令是否为分支、分支结果和分支目标。它有一个多级分支目标缓冲区,可以保存大约5500条分支指令的预测分支目标。
解码引擎将x86指令转换为Cop。AMD中的一个Cop是CISC指令,尽管有时比原始的x86指令简单,大多数x86指令只转换为一个Cop。然而,有些指令被转换为多个Cop,有时需要使用微码内存进行指令转换。解码引擎的一个有趣的方面是它可以动态地合并指令以生成更大的指令,例如,它可以将比较指令和后续分支指令合并到一个Cop中。这被称为宏指令融合。
随后,整数指令被分派到内核执行。每个内核都有一个重命名引擎、指令调度器(40个条目)、一个寄存器文件和一个128个条目的ROB。核心的执行单元由4个独立的管线组成,两个管线具有ALU,另外两个管道专用于内存地址生成。加载存储单元协调对内存的访问,将存储之间的数据转发给加载,并使用跨步预取器执行积极的预取。跨步预取器可以自动推断数组访问,并从将来最可能访问的数组索引中提取。
两个内核共享一个64KB的指令缓存,而每个内核都有一个16KB的一级写缓存,每次加载访问需要4个周期。L1缓存连接到不同大小的L2缓存,在核心之间共享,具有18个周期的延迟。
浮点单元在两个内核之间共享,不仅仅是一个功能单元,可被看作是一个SMT处理器,同时调度和执行两个线程的指令。它有自己的指令窗口、寄存器文件、重命名和唤醒选择(无序调度)逻辑。Bulldozer的浮点单元有4条处理SIMD指令(整数和浮点)和常规浮点指令的流水线。前两条管线具有128位浮点ALU,称为FMAC单元,FMAC(浮点乘法累加)单元可以执行形式(a <-- a+b*c)的运算,以及常规浮点运算。最后两条管线具有128位整数SIMD单元,另外,最后一条管线还用于将结果存储到内存中。浮点单元有一个专用的加载存储单元来访问内核中的缓存。
5.3 Intel处理器
前些年的英特尔处理器在笔记本电脑和台式机市场占据主导地位,本节将介绍两种设计非常不同的英特尔处理器的设计。第一个处理器是Intel Atom,专为手机、平板电脑和嵌入式计算机设计。另一端是Sandy Bridge多核处理器,它是Intel Core i7系列处理器的一部分,这些处理器用于高端台式机和服务器。这两个处理器都有非常不同的业务需求,导致了两种截然不同的设计。
x86的祖先是1972年开始生产的第一批微处理器。Intel 4004和8008是极其简单的4位和8位累加器式架构,Morse等人将8086从上世纪70年代末的8080演变为具有更好吞吐量的16位架构。当时几乎所有微处理器的编程都是用汇编语言完成的,内存和编译器都很短缺。英特尔希望保持8080用户的基础,因此8086被设计为与8080“兼容”。8086从来都不是与8080兼容的目标代码,但其架构足够接近,可以自动完成汇编语言程序的翻译。
1980年初,IBM选择了一个带有8位外部总线的8086版本,称为8088,用于IBM PC。他们选择了8位版本以降低体系结构的成本,这一选择,加上IBM PC的巨大成功,使得8086体系结构无处不在。IBM PC的成功部分归因于IBM开放了PC的体系结构,并使PC克隆产业蓬勃发展。80286、80386、80486、奔腾、奔腾Pro、奔腾II、奔腾III、奔腾4和AMD64扩展了体系结构并提供了一系列性能增强。
虽然68000被选择用于Macintosh,但Mac从未像PC那样普及,部分原因是苹果不允许基于68000的Mac克隆,68000也没有获得8086所享受的软件。摩托罗拉68000在技术上可能比8086更重要,但IBM的选择和开放架构策略的影响主导了68000在市场上的技术优势。
一些人认为,x86指令集的不雅是不可避免的,是任何架构取得巨大成功所必须付出的代价。我们拒绝这种观点。显然,没有一个成功的架构可以抛弃以前实现中添加的特性,随着时间的推移,一些特性可能会被视为不可取的。x86的尴尬始于8086指令集的核心,并因8087、80286、80386、MMX、SSE、SSE2、SSE3、SSE4、AMD64(EM64T)和AVX中发现的架构不一致扩展而加剧。
一个反例是IBM 360/370体系结构,它比x86老得多,主宰了大型机市场,就像x86主宰了PC市场一样。毫无疑问,由于有了更好的基础和更兼容的增强功能,该指令集在首次实现50年后比x86更有意义。将x86扩展到64位寻址意味着该体系结构可能会持续几十年,未来的指令集人类学家将从这样的架构中一层又一层地剥离,直到他们从第一个微处理器中发现人工制品。鉴于这样的发现,他们将如何判断当今的计算机架构?
Intel核心微架构
尽管超标量设计的概念通常与RISC架构相关联,但同样的超标量原理也可以应用于CISC机器,其中值得注意的例子是Intel x86架构。Intel系列中超标量概念的演变值得注意,386是一种传统的CISC非管线机器,486引入了第一个管线x86处理器,将整数运算的平均延迟从两到四个周期减少到一个周期,但仍限于每个周期执行一条指令,没有超标量元素。最初的奔腾有一个适度的超标量组件,由两个独立的整数执行单元组成,奔腾Pro推出了全面的超标量设计,乱序执行。随后的x86型号改进并增强了超标量设计。
下图显示了x86管线架构的版本。Intel将流水线架构称为微架构(microarchitecture),微架构是机器指令集体系结构的基础和实现,也称为Intel核心微架构。它在Intel core 2和Intel Xeon处理器系列的每个处理器核上实现,还有一个增强型Intel核心微架构。两种微架构之间的一个关键区别是,后者提供了第三级缓存。
Intel核心微架构。
Intel Core i7-990X结构图。
Intel 8085 CPU结构图。
下表显示了缓存架构的一些参数和性能特征。所有缓存都使用写回更新策略,当指令从内存位置读取数据时,处理器会按以下顺序在缓存和主内存中查找包含此数据的缓存行:
- 发起核心的L1数据缓存。
- 其他核心的L1数据缓存和L2缓存。
- 系统内存。
基于Intel Core微架构的处理器的缓存/内存参数和性能。
仅当缓存行被修改时,缓存行才会从另一个内核的一级数据缓存中取出,而忽略二级缓存中的缓存行可用性或状态。上表b显示了从内存集群中获取不同位置的前四个字节的特性,延迟列提供访问延迟的估计值,然但实际延迟可能会因缓存负载、内存组件及其参数而异。
Intel Core微架构的管线包含:
- 一种有序提交前端,从内存中获取指令流,具有四个指令解码器,将解码后的指令提供给无序执行核心。每个指令都被翻译成一个或多个固定长度的RISC指令,称为微操作(micro-operation或micro-ops)。
- 一个无序的超标量执行核心,每个周期最多可以发出6个微操作,并在源就绪且执行资源可用时重新排序微操作以执行。
- 一种有序的引退单元,确保微操作的执行结果得到处理,架构状态和处理器的寄存器集根据原始程序顺序进行更新。
实际上,Intel核心微架构在RISC微架构上实现了CISC指令集架构。内部RISC微操作通过至少14阶段的流水线,在某些情况下,微操作需要多个执行阶段,从而导致更长的管线,与早期Intel x86处理器和Pentium上使用的5阶段流水线形成了鲜明对比。
接下来阐述前端(Front End)。
先阐述分支预测单元。前端需要提供解码的指令(微操作),并将流维持到一个6阶段的无序引擎,该引擎由三个主要部件组成:分支预测单元(BPU)、指令提取和预译码单元、指令队列和译码单元。
分支预测单元此单元通过预测各种分支类型(条件、间接、直接、调用和返回),帮助指令获取单元获取最可能执行的指令,BPU为每种分支类型使用专用硬件,分支预测使处理器能够在决定分支结果之前很久就开始执行指令。
微架构使用基于最近执行分支指令的历史的动态分支预测策略。维护分支目标缓冲区(BTB),该缓冲区缓存关于最近遇到的分支指令的信息。每当在指令流中遇到分支指令时,都会检查BTB,如果BTB中已经存在条目,则指令单元在确定是否预测分支被采取时由该条目的历史信息引导。如果预测到分支,则与该条目关联的分支目标地址用于预取分支目标指令。
一旦指令被执行,相应条目的历史部分被更新以反映分支指令的结果。如果此指令未在BTB中表示,则将此指令的地址加载到BTB中的条目中,如果需要,将删除较旧的条目。
前两段的描述大体上适用于原始奔腾机型以及后来的奔腾机型(包括后续的Intel机型)上使用的分支预测策略,但在奔腾的情况下,使用了相对简单的2位历史方案。后来的型号具有更长的流水线(Intel核心微架构为14阶段,奔腾为5阶段),因此预测失误的惩罚更大。所以后面的模型使用了更复杂的分支预测方案,具有更多的历史比特,以降低预测失误率。
根据以下规则,使用静态预测算法预测在BTB中没有历史的条件分支:
- 对于与指令指针(IP)无关的分支地址,如果分支是返回,则预测执行,否则不执行。
- 对于IP相对后向条件分支,请进行预测。此规则反映了循环的典型行为。
- 对于IP相对前向条件分支,预测不执行。
再阐述指令获取和预译码单元。指令获取单元包括指令翻译后备缓冲器(ITLB)、指令预取器、指令缓存和预译码逻辑。
指令获取是从一级指令缓存执行的。当发生一级缓存未命中时,有序前端将新指令从二级缓存一次64字节送入一级缓存。默认情况下,指令是按顺序提取的,因此每个二级缓存行提取都包含下一条要提取的指令,经由分支预测单元的分支预测可以改变该顺序提取操作。ITLB将给定的线性IP地址转换为访问二级缓存所需的物理地址,前端的静态分支预测用于确定下一个要获取的指令。
预译码单元接受来自指令高速缓存或预取缓冲器的十六个字节,并执行以下任务:
- 确定指令的长度。
- 解码与指令相关的所有前缀。
- 标记解码器指令的各种属性(如“is branch”)。
预编码单元每个周期最多可将六条指令写入指令队列。如果一个提取包含六条以上的指令,则预解码器在每个周期继续解码多达六条指令,直到提取中的所有指令都写入指令队列。后续提取只能在当前提取完成后进入预编码。
最后阐述指令队列和解码单元。提取的指令被放置在指令队列中,从那里,解码单元扫描字节以确定指令边界,由于x86指令的长度可变,是一个必要的操作。解码器将每个机器指令翻译成一到四个微操作,每个微操作都是118位RISC指令。请注意,大多数纯RISC机器的指令长度仅为32位,需要更长的微操作长度来适应更复杂的x86指令。尽管如此,微操作比它们派生的原始指令更容易管理。
一些指令需要四个以上的微操作,这些指令被传送到微码ROM,其中包含与复杂机器指令相关的一系列微操作(五个或更多),例如一个字符串指令可以转换为一个非常大(甚至数百个)的重复微操作序列。因此,微码ROM是一个微程序控制单元。
生成的微操作序列被传递到重命名/分配器模块。
上面阐述完前端的三个部件,接下来阐述乱序执行逻辑。
处理器的这一部分对微操作进行重新排序,以允许它们在输入操作数就绪时尽快执行。分配阶段分配执行所需的资源,它执行以下功能:
- 如果在一个时钟周期内到达分配器的三个微操作中的一个无法使用所需的资源(如寄存器),则分配器会暂停管线。
- 分配器分配一个重新排序缓冲区(ROB)条目,该条目跟踪随时可能正在进行的126个微操作之一的完成状态。
- 分配器为微操作的结果数据值分配128个整数或浮点寄存器项中的一个,并且可能分配一个用于跟踪机器流水线中48个加载或24个存储之一的加载或存储缓冲区。
- 分配器在指令调度器前面的两个微操作队列之一中分配一个条目。
ROB是一个循环缓冲区,最多可容纳126个微操作,还包含128个硬件寄存器。每个缓冲区条目由以下字段组成:
- 状态:指示此微操作是否计划执行、是否已调度执行,或是否已完成执行并准备好退出。
- 内存地址:生成微操作的奔腾指令的地址。
- 微操作:实际操作。
- 别名寄存器:如果微操作引用了16个架构寄存器中的一个,则此条目将该引用重定向到128个硬件寄存器中的其中一个。
微操作按顺序进入ROB,然后微操作从ROB无序地发送到调度/执行单元,调度的标准是适当的执行单元和此微操作所需的所有必要数据项可用,最后微操作按顺序从ROB中退出。为了实现有序清理,在每个微操作被指定为准备清理后,微操作首先被清理。
重命名阶段将对16个架构寄存器(8个浮点寄存器,外加EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)的引用重新映射到一组128个物理寄存器中。该阶段消除了由有限数量的架构寄存器引起的错误依赖,同时保留了真实的数据依赖(写入后读取)。
在资源分配和寄存器重命名之后,微操作被放置在两个微操作队列中的一个队列中,在那里它们被保存,直到调度器中有空间为止。两个队列中的一个用于内存操作(加载和存储),另一个用于不涉及内存引用的微操作。每个队列都遵循FIFO(先进先出)规则,但队列之间不保持顺序。也就是说,相对于另一个队列中的微操作,微操作可能会被无序地从一个队列读取。此举为调度器提供了更大的灵活性。
调度器负责从微操作队列中检索微操作,并分派这些微操作以供执行。每个调度程序查找状态指示微操作具有其所有操作数的微操作,如果该微操作所需的执行单元可用,则调度器获取该微操作并将其分派给适当的执行单元。一个周期内最多可调度六个微操作,如果给定的执行单元有多个微操作可用,那么调度器会从队列中按顺序分派它们。这是一种FIFO规则,有利于按顺序执行,但此时指令流已被依赖项和分支重新排列,基本上已乱序。
四个端口将调度器连接到执行单元,端口0用于整数和浮点指令,但分配给端口1的简单整数操作和处理分支预测失误除外。此外,MMX执行单元在这两个端口之间分配,其余端口用于内存加载和存储。
接下来阐述整数和浮点执行单元。
整数和浮点寄存器文件是执行单元挂起操作的源,执行单元从寄存器文件以及L1数据缓存中检索值。单独的管道阶段用于计算标志(如零、负),通常是分支指令的输入。
随后的管线阶段执行分支检查,此函数将实际分支结果与预测结果进行比较。如果分支预测被证明是错误的,那么在处理的各个阶段都存在必须从管道中删除的微操作。然后,在驱动阶段将正确的分支目标提供给分支预测器,该阶段将从新的目标地址重新启动整个管线。
Intel Atom
Intel Atom处理器一开始就有一套独特的要求。设计者必须设计一个非常节能的内核,具有足够的功能来运行商业操作系统和web浏览器,并且完全兼容x86。一种降低功耗的粗略方法是实现x86 ISA的一个子集,这种方法将导致更简单和更节能的解码器。由于已知解码逻辑在x86处理器中是耗电的,因此降低其复杂性是降低功耗的最简单方法之一,但完全的x86兼容性排除了此选项。
因此,设计师不得不考虑非常节能且不影响性能的新颖设计,决定简化管线,只考虑两个问题。乱序管线具有复杂的结构,用于确定指令之间的依赖关系,以及无序执行指令。其中一些结构是指令窗口、重命名逻辑、调度器和唤醒选择逻辑,它们增加了处理器的复杂性,并增加了其功耗。
其次,大多数英特尔处理器通常将CISC指令转换为类似RISC的微操作,这些微操作像流水线中的普通RISC指令一样执行。指令翻译过程消耗大量的能量,Intel Atom的设计者决定放弃指令翻译,Atom管线直接处理CISC指令。对于一些非常复杂的指令,Atom处理器确实使用微码ROM将它们转换为更简单的CISC指令。然而,这更多的是一种例外,而不是一种常态。
与RISC处理器相比,CISC处理器的提取和解码阶段更加复杂,因为指令具有可变的长度,划分指令边界是一个乏味的过程。其次,解码的过程也更加复杂。Atom将其16阶段流水线中的6个阶段用于指令获取和解码,如下图所示,其余阶段执行寄存器访问、数据缓存访问和指令执行等传统功能。除了更简单的流水线之外,Intel Atom处理器的另一个显著特点是它支持双向多线程,现代移动设备通常运行多任务操作系统,用户同时运行多个程序。多线程可以支持这一需求,实现额外的并行性,并减少处理器管线中的空闲时间。管线中的最后3个阶段专门用于处理异常、处理与多线程相关的事件以及将数据写回寄存器或内存。与所有现代处理器一样,存储指令不在关键路径上。通常,不遵守顺序一致性的处理器将其存储值写入写入缓冲区并继续执行后续指令。
Intel Atom处理器的流水线。
现在更详细地描述其设计。从提取和解码阶段开始(见下图)。在提取阶段,Atom处理器预测分支的方向和目标,并将一个字节流提取到指令预取缓冲区。下一个任务是在获取的字节流中划分指令,x86指令的边界是这部分流水线执行的最复杂的任务之一,因此Atom处理器有一个2级预解码步骤,在第一次解码指令后,在指令之间添加1位标记,该步骤由ILD(指令长度解码器)单元执行,然后将指令保存在I缓存中。随后,从I缓存中提取的预解码指令可以绕过预解码步骤,并直接进入解码步骤,因为其长度是已知的。保存这些附加标记会减少I缓存的有效大小,I缓存的大小为36KB,但在添加标记之后,它实际上是32KB。解码器不会将大多数CISC指令转换为类似RISC的微操作。但对于一些复杂的x86指令,有必要通过访问微码内存将它们转换为更简单的微操作。
Intel Atom处理器内部结构图。
随后,整数指令被分派到整数执行单元,FP指令被分派给FP执行单元,Atom有两个整数ALU、两个FP ALU和两个用于内存操作的地址生成单元。为了支持多线程,需要有两个指令队列副本(每个线程1个),以及两个整数和FP寄存器文件副本。英特尔没有像指令队列那样创建硬件结构的副本,而是采用了不同的方法,例如在Atom处理器中,32个条目的指令队列被分成两个部分(每个部分有16个条目),每个线程都使用其部分的指令队列。
现在讨论一下关于多线程的一般观点。多线程通过减少芯片上的资源闲置时间来提高其利用率,因此理想情况下,多线程处理器应该具有更高的功率开销(因为活动更高),并且具有更好的指令吞吐量。需要注意的是,除非处理器设计得很明智,否则吞吐量可能无法预测地增加。多线程增加了共享资源(如缓存、TLB和指令调度/调度逻辑)中的争用,特别是,缓存在线程之间进行分区,预计未命中率会增加,TLB的情况也类似。另一方面,流水线不需要在二级未命中的阴影下或在程序的低ILP(指令级并行性)阶段保持空闲。因此,多线程有其优点和缺点,只有当好的效果(性能提高效果)大于坏的效果(争用增加效果)时,才能获得性能优势。
Intel Sandy Bridge
现在讨论一款名为Sandy Bridge处理器的高性能Intel处理器的设计,该处理器是市场上Intel Core i7处理器的一部分。设计Sandy Bridge处理器的主要目的是支持新兴的多媒体工作负载、数字密集型应用程序和多核友好并行应用程序。
Sandy Bridge处理器最显著的特点是它包含一个片上图形处理器。图形处理器装有专门的单元,用于执行图像渲染、视频编码/解码和自定义图像处理,CPU和GPU通过大型共享片上L3缓存进行通信。Sandy Bridge处理器概览如下图所示。
随着芯片上组件的增加,CPU也进行了大量修改。Sandy Bridge处理器完全支持新的AVX指令集,AVX指令集是一个256位SIMD指令集,对于每个SIMD单元,可以同时执行4个双精度操作或8个单精度操作。由于添加了这么多高性能功能,因此也有必要添加许多节能功能。对于未使用的单元,诸如DVFS(动态电压频率缩放)、时钟门控(关闭时钟)和电源门控(关闭一组功能单元的电源)等技术已然常见。此外,Sandy Bridge的设计人员修改了核心的设计,以尽可能减少单元之间的复制值(AMD Bobcat的设计人员也做出了类似的设计决策),并对一些核心结构的设计进行了基本更改,如分支预测器和分支目标缓冲器,以提高功率效率。
需要注意的是,Intel Sandy Bridge等处理器设计为支持多核(4-8),每个内核支持双向多线程,因此可以在8核机器上运行16个线程,这些线程可以在彼此、三级缓存组、GPU和片上北桥控制器之间进行主动通信。有这么多通信实体,需要设计灵活的片上网络,以促进高带宽和低延迟通信。
Sandy Bridge的设计者选择了基于环的互连,而不是传统的总线。Sandy Bridge处理器设计用于32纳米1半导体工艺,它的继任者是Intel Ivy Bridge处理器,该处理器具有相同的设计,但设计用于22纳米工艺。
现在考虑下图中Sandy Bridge核心的详细设计。它有一个32KB的指令缓存,每个周期可以提供4条x86指令。解码x86指令流的第一步是划定它们的边界(称为预译码),一旦4条指令被预先编码,它们就被发送到解码器。Sandy Bridge有4个解码器,其中三个是简单的解码器,一个解码器被称为使用微程序内存的复杂解码器,所有解码器都将CISC指令转换为类似RISC的微操作。Sandy Bridge有一个用于微操作的L0缓存,可以存储大约1500个微操作,L0微操作缓存在性能和功耗方面都具有性能优势。如果分支目标处的指令在L0缓存中可用,则可以减少分支预测失误延迟。由于程序中的大多数分支都在分支附近,因此预计L0缓存的命中率会很高,还可以节省电力。如果一条指令的微操作在L0缓存中可用,就不需要再次获取、预编码和解码该指令,从而避免了这些耗电的操作。
Sandy Bridge处理器的内部结构。
带有内存组件的Core i7管线。
一个有趣的设计决策是设计者针对分支预测器做出的,代表了计算机体系结构中的许多类似问题:应该用复杂的条目设计一个小结构,还是应该用简单的条目设计大结构?例如,应该使用4路16 KB关联缓存,还是2路32 KB关联缓存?一般来说,这种性质的问题没有明确的答案,它们高度依赖于目标工作负载的性质。对于Sandy Bridge处理器,设计者有一个选择,可以选择具有2位饱和计数器的分支预测器,或者具有更多条目的预测器和1位饱和计数器。发现后一种设计的功率和性能权衡更好,因此他们选择了1位计数器。
随后,4个微操作被发送到执行无序调度的重命名和调度单元。在早期的处理器(如Nehalem处理器)中,正在运行的指令的临时结果保存在ROB中,一旦指令完成,它们就被复制到寄存器中,该操作涉及复制数据,从功率的角度来看效率不高。Sandy Bridge避免了这一点,并将结果直接保存在物理寄存器中,类似于高性能RISC处理器。当一条指令到达重命名阶段时,检查重命名表中的映射,并查找包含源操作数值的物理寄存器的ID,或者在将来的某个时间点应该包含这些值。随后,要么读取物理寄存器文件,要么等待生成它们的值。使用物理寄存器文件是一种比使用其他方法更好的方法,这些方法将未完成指令的结果保存在ROB中,然后将结果复制回寄存器文件,使用物理寄存器是快速、简单和节能的。通过在Sandy Bridge处理器中使用这种方法,ROB得到了简化,在任何时间点都有可能有168条正在运行的指令。
Sandy Bridge处理器有3个整数ALU、1个加载单元和1个加载/存储单元,整数单元从160个入口寄存器文件读取和写入其操作数。为了支持浮点运算,它有一个FP加法单元和一个FP乘法单元,它们支持AVX SIMD指令集(对单精度和双精度数字集执行256位操作)。此外,为了支持256位操作,Intel在x86 AVX ISA中添加了新的256位矢量寄存器(YMM寄存器)。
要实现AVX指令集,必须支持来自32KB数据缓存的256位传输。Sandy Bridge处理器可以执行两个128位加载,每个周期执行一个128位存储。在加载YMM(256位)寄存器的情况下,两个128位加载操作被融合为一个(256位的)加载操作。Sandy Bridge有一个256 KB的二级缓存和一个大的(1-8 MB)三级缓存,三级缓存分为多个组,三级组、内核、GPU和北桥控制器使用基于单向环的互连进行连接。注意,单向环的直径是(N-1),因为只能在一个方向上发送消息。为了克服这个限制,每个节点实际上连接到环上的两个点,这些点彼此正好相反,因此有效直径接近N=2。
Sandy Bridge处理器有一个独特功能,称为turbo(涡轮)模式,想法如下。假设处理器有一段静止期(活动较少),所有芯的温度将保持相对较低。再假设用户决定执行计算密集型活动,需要数字密集型的计算,也需要大量的功率。每个处理器都有额定热设计功率(TDP),是处理器允许消耗的最大功率。在turbo模式下,允许处理器在短时间内(20-25秒)消耗比TDP更多的功率,亦即允许处理器以高于标称值的频率运行所有单元。一旦温度达到某个阈值,turbo模式将自动关闭,处理器将恢复正常运行。需要注意的主要点是,在短时间内消耗大量电力不是问题,但即使在短时间里也不允许出现非常高的温度,因为高温会永久损坏芯片,比如如果一根电线熔化,整个芯片就会被破坏。由于处理器需要几秒钟才能加热,因此可以利用这一效应,使用高频率和高功率的相位来快速完成零星的工作。请注意,turbo模式对于耗时数小时的长时间运行作业不适用。
Intel CPU架构
Intel架构指令扩展的软件编程接口以及未来几代Intel处理器可能包含的功能。指令集扩展涵盖了各种应用领域和编程用途。512位
SIMD矢量SIMD扩展,称为Intel Advanced
vector extensions 512(Intel AVX-512)指令,与矢量扩展(IntelAVX)和IntelAdvanced vector Extension(IntelAVX2)指令相比,可提供全面的功能和更高的性能。
512位SIMD指令扩展的基础称为Intel AVX-512 Foundation指令,包括Intel AVX和Intel AVX2系列SIMD指令的扩展,但使用新的编码方案编码,支持512位矢量寄存器、64位模式下最多32个矢量寄存器以及使用opmask寄存器的条件处理。Intel处理器相关的特性包含但不限于:高级矩阵扩展(AMX)、ENQCMD/ENWCMDS指令和虚拟化支持、TSX挂起加载地址跟踪、线性地址转换、架构最后分支记录(LBRS)、非回写锁定禁用架构、总线锁定和VM通知功能、资源管理器技术、增强型硬件反馈接口(EHFI)、线性地址屏蔽(LAM)、基于Sapphire Rapids微架构的处理器的机器错误代码、IPI虚拟化等等。关于它们的具体描述可参阅Intel的说明文档:Intel Architecture Instruction Set Extensions and Future Feature。
Xeon E5-2600/4600的芯片架构如下:
2021年的Intel架构支持标量、向量、矩阵和空间的混合计算:
单个包中集成了混合计算集群:
新架构的基础组件如下,包含了各类高性能且节能的核心:
对于高效的x86核心而言,其具备高度可扩展的体系结构,以满足下一个计算十年的吞吐量效率需求:
专为吞吐量而设计,为现代多任务实现可伸缩的多线程性能。针对功率和密度高效吞吐量进行了优化,具有:
- 深度前端,按需长度解码。
- 具有许多执行端口的宽带后端。
- 针对最新晶体管技术的优化设计。
对于指令控制,带有按需指令长度解码器的大型指令缓存(64KB)加快了现代工作负载的速度,占用了大量代码。通过深度的分支历史和大结构尺寸精确预测分支。
双三宽乱序解码器,每个周期最多可解码6条指令,同时保持功率和延迟:
对于数据执行,五宽分配,八宽回收,256项乱序窗口发现数据并行性,17个执行端口执行数据并行。
数据执行涉及的硬件部件、数量和布局如下:
在内存子系统方面:
- 双重加载+双重存储。
- 高达4MB的L2缓存:四个核心之间共享L2,在17个延迟周期内具有64字节/周期带宽。
- 高级预取器:在所有缓存级别检测各种流。
- 深度缓冲(Deep buffering,注意不是Depth Buffer):支持64次未命中。
- 英特尔资源管理器(Resource Director)技术:使软件能够控制内核之间以及不同软件线程之间的公平性。
具备现代的指令级:
- 安全。
- 浮点乘法累加(FMA)指令,吞吐量为2倍。
- 添加关键指令以实现整数AI吞吐量(VNNI)。
- 宽矢量。指令集架构。
- 支持Intel VT-rp(虚拟化技术重定向保护)。
- 高级推测执行验证方法。
- Intel Control flow Enforcement Technology旨在提高防御深度。
- 支持具有AI扩展的高级矢量指令。
每个晶体管的功率和性能效率:
- 高度关注功能选择和设计实现成本,以最大限度地提高面积效率,从而实现核心数量的扩展。
- 每个指令的低切换能量可最大化受功率限制的吞吐量,是当今吞吐量驱动工作负载的关键。
- 在扩展性能范围的同时,降低了所有频率传输功率所需的工作电压。
处理器功率计算公式。
在延迟性能方面,ISO功率下提升40%以上的性能,在ISO性能下降低功率40%以上。
在吞吐量性能方面,提升80%的性能,降低80%的功率。
专为吞吐量而设计,为现代多任务实现可伸缩的多线程性能。针对功率和密度高效吞吐量进行了优化,具有:
- 深度前端,按需长度解码。
- 宽后端,具有许多执行端口。
- 针对最新晶体管技术的优化设计。
接下来阐述x86核心的性能。架构的目标是:
- 提供通用CPU性能的步进函数。
- 使用新功能改进Arch/uArch,以适应不断变化的工作负载模式的趋势。
- 在人工智能性能加速方面实现创新。
新的x86架构专为速度而设计,通过以下方式突破低延迟和单线程应用程序性能的限制:
- 更宽。
- 更深。
- 更智能。
使用大代码占用和大数据集加速工作负载,通过协处理器实现矩阵乘法的新型AI加速技术,用于细粒度电力预算管理的新型智能PM控制器。
前端获取指令并将其解码到μ级别的操作:
- 更大的代码:从128提升到256个4K iTLB,从16提升到32个2M/4M iTLB。
- 更宽:解码长度从16B提升到32B。
- 更智能:提高分支预测精度,更智能的代码预取机制。
- μ队列:每线程条目从70提升到72,单个线程从70提升到144。
- μ操作:2.25K提升到4K,提升命中率,提升前端带宽。
乱序引擎跟踪μ操作依赖性并将准备好的μ操作分派给执行单元:
- 更宽:分配宽度从5提到到6,执行端口从10提升到12。
- 更深:512项重新排序缓冲区和更大的调度器大小。
- 更智能:在重命名/分配阶段“执行”更多指令。
整数执行单元添加了第5代整数执行端口/ALU,所有5个端口上的1周期LEA也用于算术计算:
向量运算单元具有新的快速加法器(FADD):节能、低延迟,以及FMA单元支持FP16数据类型:FP16添加到Intel AVX512,包括复数支持。
L1缓存和内存子系统的特性有:
- 更宽:加载端口从2提升到3:3x256 bit的加载,2x512 bit的加载。
- 更深:更深入的加载缓冲区和存储缓冲区暴露了更多的内存并行性。
- 更智能:降低有效负载延迟,更快的内存消除分支。
- 更大数据:DTLB(数据快表)从64提升到96,L1数据缓存从12提升到16且具有增强型预取器,页面遍历器(page walker)从2提升到4。
L2缓存和内存子系统的特性有:
- 更大:1.25M(客户端)或2M(数据中心)。
- 更快:最大需求未命中从32提升到48。
- 更智能:基于L2缓存模式的多路径预取器,基于反馈的预取限制(throttling),全线写入预测带宽优化以减少DRAM读取。
通用性能与第11代Intel Core,ISO频率下性能提高19%:
英特尔高级矩阵扩展(英特尔AMX),分块矩阵乘法加速器——数据中心,VNNI从256 int8提升至AMX的2048 int8,提升了8倍的操作、时钟周期、核心。
AMX架构有两个组件:
- 分块(Tile):
- 新的可扩展2D寄存器文件——8个新寄存器,每个1Kb:T0-T7。
- 寄存器文件支持基本数据运算符——加载/存储、清除、设置为常量等。
- 分块声明状态并由XSAVE体系结构管理操作系统。
- TMUL:
- 矩阵乘法指令集,TILE上的第一个运算符。
- MAC计算网格计算数据的“分块”。
- TMUL使用三个分块寄存器(T2=+T1*T0)执行矩阵加法乘法(C=+A*C)。
- TMUL要求分块已被呈现。
英特尔高级矩阵扩展(英特尔AMX)架构如下:
x86核心是下一个计算十年CPU架构性能的阶梯函数,在高功率效率下显著提高IPC,具备更宽、更深、更智能的特点。更好地支持大型数据集和大型代码占用应用程序,机器学习技术:Intel AMX的分块乘法,增强的电源管理可提高频率和功率。所有这些都采用量身定制的可扩展架构,可为从笔记本电脑到台式机再到数据中心的全系列产品提供服务。
Intel标量架构的路线图如下:
单线程/延迟和多线程性能/吞吐量的二维关系如下:
Intel线程管理器(Thread Director):
- 调度的目标是:软件透明、实时自适应、从移动端到桌面的可扩展性。
- 直接内置于核心的智能,基于热设计点、运行条件和功率设置动态调整指导,无需任何用户输入。
- 向操作系统提供运行时反馈,以便为任何工作负载或工作流做出最佳调度决策。
- 以纳秒级精度监控每个线程的运行时指令组合以及每个内核的状态。
Thread Director调度案例如下:
1:在P核上调度的优先任务。
2:在E核上调度的后台任务。
3:新的AI线程就绪。
4:AI线程优先调度于P核。
5-7:自旋等待从P核移动到E核。
接下来介绍多核架构Alder Lake。Alder Lake的特点是:
- 单一可扩展SoC架构。所有客户端段,从9W至125W,基于Intel 7进程构建。
- 全新核心设计。与Intel线程控制器的性能混合。
- 业界领先的内存和I/O。支持DDR5、PCIe Gen5、Thunderbolt 4、Wi-Fi 6E等。
可扩展的客户端架构:
架构积木:
Alder Lake的核心和缓存数据如下:
- 高达16核,8性能核,8效率核。
- 高达24线程,每个P核2个线程,每个E核1个线程。
- 高达30M缓存,非包容性,LL缓存。
Alder Lake的内存引领行业向DDR5过渡,支持所有四种主要内存技术,动态电压频率缩放,增强的超频支持。
PCIe引领行业向PCIe Gen5过渡,与Gen4相比,带宽高达2倍,最高64GB/s,x16通道。
内部连线(Interconnect)的特点:
- 计算结构:高达1000 GB/s,动态延迟优化。
- I/O结构:高达64GB/s,实时、基于需求的带宽控制。
- 内存结构:高达204 GB/s,动态总线宽度和频率。
Intel的集成图形芯片Xe HPG的Render Slice架构如下图,包含核心、采样器、光线追踪单元各4个,几何处理、光栅化、HiZ等各1个,像素后端2个:
Xe HPG具有可扩展的图形引擎,包含8个Render Slice,其性能和功率关系如下:
基于Xe HPC的GPU的计算构建块:
向量引擎和矩阵引擎的参数及所处的位置如下:
单个切片结构如下:
多个切片组成的栈(stack)如下:
当然多个栈还可以组成更大的结构。连接具有高度伸缩性,支持2点互联、4点互联、6点互联甚至8点和互联:
Sapphire Rappids是下一代Intel Xeon可扩展处理器,数据中心体系结构的新标准,专为微服务和AI工作负载设计,开创性的高级内存和IO转换。Intel Xeon的节点性能表现在标量性能、数据并行性能、缓存和内存子系统架构,以及套接字内/套接字间缩放等方面:
Intel Xeon的数据中心性能表现在整合和业务流程、性能一致性、弹性和高效的数据中心利用率、基础设施和框架开销等方面:
通过模块化架构,利用单片CPU的现有软件范例(如Ice Lake),提供可扩展、平衡的架构(如Sapphire Rapids):
Sapphire Rapids是多片、单CPU架构,每个线程都可以完全访问所有分块的缓存、内存、IO…在整个SoC中提供一致的低延迟和高横截面的带宽。Sapphire Rapids的SoC的物理架构如下:
Sapphire Rapids的关键构建块如下:
为数据中心构建的性能核心,主要微架构和IPC改进,改进了对大代码/数据占用的支持,高频自动/快速PM。
性能核心,DC工作负载和使用的架构改进:
- AI:英特尔高级矩阵扩展-AMX,用于推理和训练加速的平铺矩阵运算。
- 连接设备:加速器接口架构-AiA,用户级的高效调度、信令和同步。
- FP16:半精度,支持更高的吞吐量和更低的精度。
- 缓存管理:CLDEMOTE,主动放置缓存内容。
Sapphire Rapids加速引擎,通过无缝集成的加速引擎实现共模任务的卸载以提高核心的效率,原生调度、来自用户空间的信令和同步、加速器接口架构,核心与加速引擎之间的相干共享存储空间,可并发共享的进程、容器和VM。
Intel Data Streaming加速引擎优化流数据移动和转换操作,每个套接字最多4个实例,低延迟调用,无内存固定开销,DSA卸载后获得额外39%的CPU核心周期。
Intel Quick Assist Technology加速引擎加快加密和数据消除/压缩,高达400Gb/s对称加密,高达160Gb/s压缩+160Gb/s解压缩,融合操作,QAT卸载后增加98%的工作负载容量。
Sapphire Rapids的I/O高级特性:
- Compute ePressLink(CXL)1.1简介,数据中心中的加速器和内存扩展。
- 通过PCIe 5.0和连接扩展设备性能,通过Intel®Ultra Path Interconnect(UPI)2.0改进多插槽扩展。
- 最多4 x24 UPI链路以16 GT/s的速度运行,新的8S-4UPI性能优化拓扑,改进的DDIO和QoS功能。
Sapphire Rapids的内存和最后一级缓存:
- 增加的共享最后一级缓存(LLC),在所有核心中共享的最大容量超过100 MB LLC。
- 通过DDR 5内存提高带宽、安全性和可靠性,4个内存控制器,支持8个通道。
- Intel Optane永久内存300系列。
Sapphire Rapids具有高带宽内存:
- 与8通道DDR 5的基线Xeon SP相比,内存带宽显著提高。
- 增加容量和带宽,某些用途可以完全消除对DDR的需求。
- 2种模式:
- HBM扁平模式。带HBM和DRAM的扁平内存区域。
- HBM缓存模式。DRAM备份缓存。
Sapphire Rapids为弹性计算模型构建微服务,80%以上的新云原生和SaaS应用程序预计将作为微服务构建。其目标是:实现更高的吞吐量,同时满足延迟要求,并减少执行、监控和协调数千个微服务的基础架构开销;提高性能和服务质量,减少基础设施开销,更好的分布式通信。微服务性能的对比如下:
Ponte Vecchio具有:
- 新的验证方法。
- 新的SOC架构。
- 新的IP架构。
- 新内存体系结构。
- 新的I/O体系结构。
- 新的包装技术。
- 新的电力输送技术。
- 新的互连。
- 新的信号完整性技术。
- 新的可靠性方法。
- 新的软件。
Ponte Vecchio SoC拥有1000亿以上晶体管,47活动分块,5个进程节点。其内部结构图如下:
具有不同加速比的加速计算系统:
克服分离的CPU和GPU软件堆栈,囊括了CPU优化堆栈和GPU优化堆栈: