agz*_*agz 38 cpu performance clockspeed cpu-architecture community-faq
例如,为什么 2.66 GHz 双核 Core i5 比同样是双核的 2.66 GHz Core 2 Duo 快?
这是因为更新的指令可以在更少的时钟周期内处理信息吗?还涉及哪些其他架构更改?
这个问题经常出现,答案通常是一样的。这篇文章旨在为这个问题提供一个明确的、规范的答案。随意编辑答案以添加其他详细信息。
bwD*_*aco 40
时钟速率不能无限增加。
乍一看,处理器似乎只是一个接一个地执行指令流,通过更高的时钟频率来提高性能。然而,仅仅提高时钟频率是不够的。随着时钟速率的提高,功耗和热量输出也会增加。
在非常高的时钟频率下,CPU 内核电压的显着增加变得必要。由于 TDP 随 V内核的平方而增加,因此我们最终会达到一个点,即过多的功耗、热量输出和冷却要求会阻止时钟速率的进一步增加。这个限制是在 2004 年的 Pentium 4 Prescott时代达到的。虽然最近电源效率的改进有所帮助,但时钟频率的显着提高已不再可行。请参阅:为什么 CPU 制造商停止提高其处理器的时钟速度?
多年来尖端发烧级 PC 的库存时钟速度图表。图片来源
看似顺序的指令流通常可以并行化。
流水线将指令分解成可以并行执行的更小的部分。
每条指令都可以分解为一系列步骤,每个步骤都由处理器的一个单独部分执行。指令流水线允许多条指令一个接一个地执行这些步骤,而不必等待每条指令完全完成。流水线可实现更高的时钟速率:通过在每个时钟周期内完成每条指令的一个步骤,每个周期所需的时间比一次完成一条指令所需的时间更少。
在经典的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)。复杂的指令被解码为 FLOP 序列,这些序列存储在专用缓冲区内,并安排单独执行(在数据相关性允许的范围内)。这为处理器提供了更多的空间来利用 ILP。为了进一步提高性能,可以使用一个特殊的触发器缓存来存储最近解码的触发器,以便可以快速查找最近执行的指令的触发器。
但是,添加这些指令不会自动提高性能。新指令只有在编写应用程序以使用它们时才能提高性能。这些指令的采用受到以下事实的阻碍:使用它们的应用程序将无法在不支持它们的旧处理器上运行。
多年来,流水线变得越来越长,减少了完成每个阶段所需的时间,从而实现更高的时钟速率。然而,除其他外,更长的管道会增加错误分支预测的惩罚,因此管道不能太长。为了达到非常高的时钟速度,奔腾 4 处理器使用了非常长的流水线,在Prescott 中高达 31 级。为了减少性能缺陷,处理器会尝试执行指令,即使它们可能会失败,并会继续尝试直到它们成功。这导致了非常高的功耗并降低了从超线程中获得的性能。较新的处理器不再使用这么长的流水线,特别是因为时钟速率缩放已经达到极限;Haswell使用的流水线长度在 14 到 19 级之间变化,而低功耗架构使用较短的流水线(英特尔凌动Silvermont有 12 到 14 级)。
更先进的架构提高了分支预测的准确性,减少了错误预测导致的流水线刷新频率,并允许并发执行更多指令。考虑到当今处理器中流水线的长度,这对于保持高性能至关重要。
随着晶体管预算的增加,可以在处理器中嵌入更大、更有效的缓存,从而减少由于内存访问而导致的停顿。在现代系统上,内存访问可能需要 200 多个周期才能完成,因此尽可能减少访问主内存的需要非常重要。
通过更先进的超标量执行逻辑和允许同时解码和执行更多指令的“更广泛”的设计,较新的处理器能够更好地利用 ILP。所述的Haswell架构可以解码四条指令和每个时钟周期分派8分的微操作。增加晶体管预算允许在处理器内核中包含更多功能单元,例如整数 ALU。乱序和超标量执行中使用的关键数据结构,例如保留站、重新排序缓冲区和寄存器文件,在较新的设计中得到了扩展,这允许处理器搜索更宽的指令窗口以利用其 ILP。这是当今处理器性能提升的主要推动力。
较新的处理器中包含更复杂的指令,并且越来越多的应用程序使用这些指令来提高性能。编译器技术的进步,包括指令选择和自动向量化的改进,可以更有效地使用这些指令。
除上述之外,以前在 CPU 外部的部件(如北桥、内存控制器和 PCIe 通道)的更大集成减少了 I/O 和内存延迟。这通过减少从其他设备访问数据的延迟引起的停顿来增加吞吐量。
Dav*_*rtz 32
这通常不是因为更新的说明。这只是因为处理器需要更少的指令周期来执行相同的指令。这可能有很多原因:
大缓存意味着等待内存浪费的时间更少。
更多的执行单元意味着等待开始操作一条指令的时间更少。
更好的分支预测意味着更少的时间浪费在推测性执行实际上不需要执行的指令上。
执行单元的改进意味着等待指令完成的时间更少。
更短的管道意味着管道填充得更快。
等等。
Bre*_*ugh 18
绝对权威的参考是Intel 64 and IA-32 Architectures Software Developer Manuals。它们详细介绍了体系结构之间的变化,是了解 x86 体系结构的重要资源。
我建议您下载合并的第 1 卷到第 3C 卷(该页面上的第一个下载链接)。第 1 卷第 2.2 章有您想要的信息。
我在该章节中看到的一些一般差异,从核心到 Nehalem/Sandy Bridge 微架构是:
完整列表可以在上面提供的链接中找到(第 1 卷,第 2.2 章)。
归档时间: |
|
查看次数: |
13773 次 |
最近记录: |