例如,为什么2.66 GHz双核Core i5会比2.66 GHz Core 2 Duo(也是双核)更快?
是否因为更新的指令可以在更少的时钟周期内处理信息?还涉及其他哪些体系结构更改?
这个问题经常出现,答案通常是相同的。这篇文章旨在为这个问题提供一个确定的,规范的答案。随时编辑答案以添加其他详细信息。
例如,为什么2.66 GHz双核Core i5会比2.66 GHz Core 2 Duo(也是双核)更快?
是否因为更新的指令可以在更少的时钟周期内处理信息?还涉及其他哪些体系结构更改?
这个问题经常出现,答案通常是相同的。这篇文章旨在为这个问题提供一个确定的,规范的答案。随时编辑答案以添加其他详细信息。
Answers:
通常不是因为更新了指令。仅仅是因为处理器需要更少的指令周期来执行相同的指令。原因可能有很多:
大容量缓存意味着更少的时间浪费在等待内存上。
更多的执行单元意味着更少的时间等待开始对一条指令进行操作。
更好的分支预测意味着更少的时间浪费在推测性地执行从未真正需要执行的指令上。
执行单元的改进意味着更少的时间等待指令完成。
较短的管线意味着管线填满更快。
等等。
时钟频率不能无限增加。
乍一看,似乎处理器只是简单地一个接一个地执行指令流,而通过更高的时钟速率可以获得更高的性能。但是,仅增加时钟速率是不够的。功耗和热量输出随时钟速率的增加而增加。
由于时钟速率非常高,因此有必要大幅提高CPU内核电压。由于TDP与V 核的平方成正比,因此最终我们达到了这样的地步,即功耗,热量输出和冷却要求过多,从而无法进一步提高时钟速率。在Pentium 4 Prescott时代,这一极限在2004年达到。尽管最近在功率效率方面的改进有所帮助,但时钟速率的大幅提高不再可行。请参阅:为什么CPU制造商停止增加其处理器的时钟速度?
多年来,发烧级个人电脑的股票时钟速度图。图片来源
似乎顺序指令流通常可以并行化。
流水线将指令分成较小的部分,这些部分可以并行执行。
每个指令可以分解为一系列步骤,每个步骤都由处理器的单独部分执行。指令流水线操作允许多个指令一个接一个地执行这些步骤,而不必等待每个指令完全完成。流水线化可提高时钟速率:通过在每个时钟周期中完成每一条指令的一步,与如果必须一次完成一条完整指令相比,每个周期所需的时间更少。
在经典的RISC流水线包含五个阶段:取指令,指令译码,指令执行,内存访问,和回写。现代处理器将执行分解为更多的步骤,从而产生了具有更多阶段的更深层次的流水线(并且随着每个阶段的变小和完成时间的减少,可达到的时钟速率也会提高),但是该模型应该提供对流水线工作原理的基本了解。
但是,流水线会带来危害,必须解决这些危害才能确保正确执行程序。
由于每个指令的不同部分正在同时执行,因此可能会发生冲突,从而干扰正确的执行。这些被称为危害。危险分为三种:数据,结构和控制。
当指令同时或以错误的顺序读取和修改相同的数据时,会发生数据危害,从而可能导致错误的结果。当多个指令需要同时使用处理器的特定部分时,会发生结构性危害。遇到条件转移指令时会发生控制危险。
这些危害可以通过多种方式解决。最简单的解决方案是简单地暂停流水线,暂时搁置流水线中的一条或一条指令的执行以确保正确的结果。尽可能避免这种情况,因为它会降低性能。对于数据危险,使用诸如操作数转发之类的技术来减少停顿。控制危险通过分支预测处理,需要特殊处理,下一节将进行介绍。
分支预测用于解决可能破坏整个管道的控制危害。
遇到条件分支时发生的控制危害特别严重。分支基于特定条件是对还是错,引入了执行将继续在程序中其他位置而不是仅在指令流中继续执行下一条指令的可能性。
由于在评估分支条件之前无法确定要执行的下一条指令,因此如果没有分支,则无法在分支之后将任何指令插入到管道中。因此,将管道清空(清空),这可能浪费几乎与管道中各个阶段一样多的时钟周期。分支往往在程序中经常发生,因此控制危险会严重影响处理器性能。
分支预测通过猜测是否将采用分支来解决此问题。做到这一点的最简单方法是简单地假设分支总是被采用或从未被采用。但是,现代处理器使用更为复杂的技术来获得更高的预测精度。本质上,处理器会跟踪先前的分支,并以多种方式使用此信息来预测要执行的下一条指令。然后可以根据预测从正确的位置向管道提供指令。
当然,如果预测错误,则必须删除分支之后通过管道放置的所有指令,从而刷新管道。结果,随着管线越来越长,分支预测器的准确性变得越来越关键。具体的分支预测技术超出了此答案的范围。
高速缓存用于加速内存访问。
现代处理器执行指令和处理数据的速度远快于它们在主存储器中的访问速度。当处理器必须访问RAM时,执行可能会停滞很长时间,直到数据可用为止。为了减轻这种影响,处理器中包括称为高速缓存的小型高速存储区。
由于处理器芯片上可用的空间有限,因此缓存的大小非常有限。为了充分利用这种有限的容量,缓存仅存储最近或最常访问的数据(时间局部性)。由于内存访问倾向于聚集在特定区域(空间局部性)内,因此最近访问的数据附近的数据块也存储在缓存中。请参阅:参考位置
高速缓存还按大小不同的多个级别进行组织,以优化性能,因为较大的高速缓存往往比较小的高速缓存慢。例如,处理器可能具有大小仅为32 KB的1级(L1)高速缓存,而其3级(L3)高速缓存则可能是几兆字节。缓存的大小以及缓存的关联性会影响处理器如何管理完整缓存上的数据替换,从而极大影响通过缓存获得的性能提升。
无序执行通过允许首先执行独立指令来减少由于危险而导致的停顿。
并非指令流中的每条指令都相互依赖。例如,尽管a + b = c
必须在之前执行c + d = e
,a + b = c
并且d + e = f
是独立的并且可以同时执行。
乱序执行利用了这一事实,允许在一条指令停顿时执行其他独立的指令。代替要求指令以锁步的方式逐个执行,而是添加了调度硬件以允许以任何顺序执行独立的指令。指令被分派到一个指令队列和颁发给时所需的数据变得可用的处理器的适当部分。这样,停留在等待来自较早指令的数据的指令不会阻塞独立的后续指令。
超标量体系结构允许指令流中的多个指令同时执行。
上面讨论的技术只会提高指令流水线的性能。仅这些技术就不允许每个时钟周期完成一条以上的指令。但是,通常有可能在一条指令流中并行执行各个指令,例如当它们彼此不依赖时(如上文乱序执行部分所述)。
超标量体系结构通过允许将指令一次发送到多个功能单元来利用这种指令级并行性。处理器可以具有特定类型的多个功能单元(例如整数ALU)和/或可以同时向其发送指令的不同类型的功能单元(例如浮点和整数单元)。
在超标量处理器中,指令按照无序设计进行调度,但是现在有多个发布端口,可以同时发布和执行不同的指令。扩展的指令解码电路允许处理器在每个时钟周期一次读取多个指令并确定它们之间的关系。现代的高性能处理器每个时钟周期最多可以调度8条指令,具体取决于每个指令的功能。这就是处理器在每个时钟周期完成多条指令的方式。请参阅:AnandTech上的Haswell执行引擎
添加了更高级的指令,可以在更短的时间内执行复杂的操作。
随着晶体管预算的增加,有可能实施更高级的指令,从而使复杂的操作能够在原本需要的时间的一小部分内执行。例如,矢量指令集(例如SSE和AVX)可同时对多条数据执行计算,而AES指令集可加速数据加密和解密。
为了执行这些复杂的操作,现代处理器使用微操作(μops)。复杂指令被解码为μop序列,这些序列存储在专用缓冲区内,并计划单独执行(在数据依赖性所允许的范围内)。这为处理器提供了更多利用ILP的空间。为了进一步提高性能,可以使用特殊的μop缓存来存储最近解码的μop,以便可以快速查找最近执行的指令的μop。
但是,添加这些说明不会自动提高性能。仅当编写应用程序以使用新指令时,它们才能提高性能。由于使用这些指令的应用程序无法在不支持它们的较旧处理器上运行,因此妨碍了采用这些指令。
这些年来,流水线变得越来越长,减少了完成每个阶段所需的时间,因此可以提高时钟频率。但是,尤其是较长的流水线会增加分支预测错误的代价,因此流水线不能太长。为了达到很高的时钟速度,奔腾4处理器使用了非常长的流水线,在Prescott中最多使用31级。为了减少性能缺陷,即使指令可能失败,处理器也会尝试执行指令,并且将继续尝试直到指令成功为止。这导致非常高的功耗,并降低了从超线程获得的性能。较新的处理器不再使用流水线这么长时间了,尤其是由于时钟速率缩放已经到了极限。Haswell使用的管线长度在14到19级之间变化,而低功耗的架构则使用较短的管线(Intel Atom Silvermont有12到14级)。
分支预测的准确性已通过更高级的体系结构得到了改善,从而减少了因错误预测导致的流水线刷新的频率,并允许更多指令同时执行。考虑到当今处理器中管线的长度,这对于保持高性能至关重要。
随着晶体管预算的增加,可以在处理器中嵌入更大,更有效的缓存,从而减少了由于访问存储器而造成的停顿。在现代系统上,内存访问可能需要200多个周期才能完成,因此重要的是尽可能减少对主内存的访问。
较新的处理器通过更高级的超标量执行逻辑和“更广泛”的设计(可以同时解码和执行更多指令),能够更好地利用ILP。所述的Haswell架构可以解码四条指令和每个时钟周期分派8分的微操作。晶体管预算的增加允许在处理器内核中包含更多的功能单元,例如整数ALU。乱序和超标量执行中使用的关键数据结构(如保留站,重排序缓冲区和寄存器文件)在较新的设计中得到了扩展,这使处理器可以搜索更大的指令窗口以利用其ILP。这是当今处理器性能提升的主要推动力。
较新的处理器中包含更复杂的指令,并且越来越多的应用程序使用这些指令来提高性能。编译器技术的进步,包括指令选择和自动矢量化的改进,使这些指令的使用更加有效。
除了上述内容以外,以前在CPU外部的部件(例如北桥,内存控制器和PCIe通道)的更大集成度还减少了I / O和内存延迟。通过减少由于从其他设备访问数据的延迟而导致的停顿,从而提高了吞吐量。
绝对的权威参考是《Intel 64和IA-32体系结构软件开发人员手册》。他们详细介绍了架构之间的变化,并且它们是了解x86架构的重要资源。
我建议您下载1至3C合并的卷(该页面上的第一个下载链接)。第1卷第2.2章提供了所需的信息。
从核心到Nehalem / Sandy Bridge微体系结构,我在本章中列出了一些一般差异:
完整的列表可以在上面提供的链接中找到(第1卷,第2.2章)。
前面所说的一切都是正确的,但一定程度上是正确的。我的回答很简短:新一代处理器之所以“更快”,主要是因为它们具有更大,更好的组织缓存。这是影响计算机性能的主要因素。有关更多定量方面的考虑,请参阅“ Linux杂志:驱动HPC性能的因素 ”
简而言之,对于大多数常见的应用程序(如SPEC集合),限制因素是内存。当运行真正的持续计算时,所有高速缓存都加载了数据,但是每次高速缓存未命中都会导致CPU执行管道停止并等待。问题是,无论CPU管道多么复杂或指令质量更好,指令级并行性仍然非常有限(某些特殊的高度优化的预取情况除外)。一旦发现关键的依赖关系,所有的并行处理都将以五到十个CPU时钟结束,而驱逐一只caheline并从主内存中加载新的并行时钟则需要数百个CPU时钟。因此,处理器等待什么都不做。整个概念也适用于多核。
因此,如果您想要一台“更快”的PC,请购买具有最大缓存能力的CPU。