例如,为什么 2.66 GHz 双核 Core i5 比同样是双核的 2.66 GHz Core 2 Duo 更快?
这是因为新指令可以在更少的时钟周期内处理信息吗?还涉及哪些架构变化?
这个问题经常出现,答案通常都一样。这篇文章旨在为这个问题提供一个明确的、规范的答案。您可以随意编辑答案以添加更多详细信息。
答案1
这通常不是因为有较新的指令。这只是因为处理器执行相同指令所需的指令周期更少。这可能有很多原因:
缓存越大意味着等待内存所浪费的时间越少。
执行单元越多,意味着等待开始执行指令的时间越少。
更好的分支预测意味着更少的时间浪费在推测执行那些实际上不需要执行的指令上。
执行单元的改进意味着等待指令完成的时间更少。
管道越短,意味着管道填满得越快。
等等。
答案2
设计高性能处理器远不止提高时钟频率那么简单。还有许多其他方法可以提高性能,这些方法可以通过摩尔定律实现,并且对现代处理器的设计至关重要。
时钟频率不能无限增加。
乍一看,处理器似乎只是逐条执行指令流,通过提高时钟频率来提高性能。然而,仅提高时钟频率是不够的。随着时钟频率的提高,功耗和热量输出也会增加。
由于时钟频率非常高,CPU核心电压成为必要。由于 TDP 随着 V核心的平方而增加,我们最终会达到一个点,即过多的功耗、热量输出和冷却要求会阻止时钟频率进一步增加。这个限制在 2004 年达到,当时是 Pentium 4 时代普雷斯科特. 尽管最近在电源效率方面的改进有所帮助,但时钟频率的大幅提高已不再可行。看:为什么 CPU 制造商停止提高其处理器的时钟速度?
多年来尖端发烧友级 PC 的库存时钟速度图表。图片来源
- 通过摩尔定律,观察结果表明,集成电路上的晶体管数量每 18 到 24 个月就会翻一番,这主要是由于芯片缩小,已经实施了各种提高性能的技术。这些技术多年来得到了改进和完善,使得在给定的时间段内能够执行更多指令。下面将讨论这些技术。
看似连续的指令流通常可以并行化。
- 尽管程序可能只是由一系列依次执行的指令组成,但这些指令或其中的一部分通常可以同时执行。这称为指令级并行 (ILP)。利用 ILP 对于获得高性能至关重要,现代处理器使用多种技术来实现这一点。
流水线将指令分解成可以并行执行的较小片段。
每条指令可以分解为一系列步骤,每个步骤由处理器的单独部分执行。指令流水线允许多条指令依次执行这些步骤,而无需等待每条指令完全完成。流水线技术可以实现更高的时钟速率:通过在每个时钟周期内完成每条指令的一个步骤,每个周期所需的时间比一次完成所有指令所需的时间要少。
这经典 RISC 流水线包含五个阶段:指令提取、指令解码、指令执行、内存访问和写回。现代处理器将执行分解为更多步骤,从而产生具有更多阶段的更深管道(并且随着每个阶段更小且完成所需的时间更少,可实现的时钟速率也更高),但此模型应该能让您基本了解管道的工作原理。
然而,流水线可能会引入危险,必须解决这些危险才能确保程序正确执行。
由于每条指令的不同部分同时执行,因此可能会发生冲突,从而干扰正确执行。这些冲突称为危害.危险有三种类型:数据危险,结构危险,控制危险。
数据危害当指令同时或以错误的顺序读取和修改相同数据时,可能会导致不正确的结果。结构性危险当多条指令需要同时使用处理器的特定部分时就会发生这种情况。控制危害当遇到条件分支指令时发生。
这些风险可以用各种方法解决。最简单的解决方案是简单地停止流水线,暂时停止执行流水线中的一条或多条指令以确保正确的结果。尽可能避免这种情况,因为它会降低性能。对于数据风险,可以使用以下技术操作数转发用于减少失速。控制危险通过以下方式处理分支预测,这需要特殊处理,将在下一节中介绍。
分支预测用于解决可能破坏整个管道的控制危险。
控制危害,发生在条件分支遇到分支时,情况会特别严重。分支引入了这样一种可能性,即根据特定条件是真还是假,执行将继续在程序的其他地方进行,而不仅仅是简单地执行指令流中的下一条指令。
由于在评估分支条件之前无法确定要执行的下一条指令,因此在分支条件不存在的情况下无法在分支之后将任何指令插入到流水线中。因此流水线是空的(酡) 会浪费几乎与流水线中的阶段数一样多的时钟周期。程序中分支往往出现得非常频繁,因此控制冒险会严重影响处理器性能。
分支预测通过猜测分支是否被执行来解决这个问题。最简单的方法是假设分支总是被执行或从不被执行。然而,现代处理器使用更复杂的技术来提高预测精度。本质上,处理器会跟踪先前的分支,并以多种方式使用这些信息来预测下一个要执行的指令。然后可以根据预测从正确的位置向流水线提供指令。
当然,如果预测错误,那么分支之后通过流水线的任何指令都必须被丢弃,从而刷新流水线,并且这些指令所做的任何更改都必须恢复。因此,随着流水线越来越长,分支预测器的准确性变得越来越重要。具体的分支预测技术超出了本答案的范围。
缓存用于加快内存访问速度。
现代处理器执行指令和处理数据的速度远快于在主内存中访问数据的速度。当处理器必须访问 RAM 时,执行可能会停滞很长时间,直到数据可用。为了减轻这种影响,称为缓存包含在处理器中。
由于处理器芯片上可用的空间有限,缓存的大小也非常有限。为了充分利用这种有限的容量,缓存只存储最近或最常访问的数据(时间局部性)。由于内存访问往往集中在特定区域内(空间局部性),最近访问的数据附近的数据块也会存储在缓存中。看:参考地点
缓存也分为大小各异的多个级别,以优化性能,因为较大的缓存往往比较小的缓存慢。例如,处理器可能有一个 1 级 (L1) 缓存,其大小只有 32 KB,而其 3 级 (L3) 缓存可能大几兆字节。缓存的大小以及结合性缓存会影响处理器如何管理完整缓存上的数据替换,从而显著影响通过缓存获得的性能提升。
无序执行允许独立指令首先执行,从而减少由于危险而导致的停顿。
指令流中的每条指令并非都相互依赖。例如,虽然
a + b = c
必须在之前执行c + d = e
,a + b = c
但和d + e = f
是独立的并且可以同时执行。此外,当正在执行的指令正在等待内存访问或其他延迟时,后续指令不一定依赖于该延迟操作。无序执行利用这一事实,在一条指令停滞时允许其他独立指令执行。无需要求指令以步调一致的方式一条接一条地执行,调度添加硬件以允许以任何顺序执行独立指令。指令派遣到指令队列和发布当所需数据可用时,处理器会将所需数据发送到相应的部分。这样,那些因等待内存数据或较早指令而停滞的指令就不会影响后面的独立指令。
- 要实现乱序执行,需要几个新的和扩展的数据结构。前面提到的指令队列预订站,用于保存指令,直到执行所需的数据可用为止。重新排序缓冲区 (ROB)用于跟踪正在执行的指令的状态,按照接收的顺序,以便指令能够按照正确的顺序完成。注册文件超出了架构本身提供的寄存器数量註冊更名,这有助于防止原本独立的指令由于需要共享架构提供的有限的寄存器集而变得依赖。
超标量架构允许指令流内的多条指令同时执行。
上面讨论的技术只能提高指令流水线的性能。仅凭这些技术无法在每个时钟周期内完成多条指令。但是,通常可以并行执行指令流中的各条指令,例如当它们不相互依赖时(如上文无序执行部分所述)。
超标量架构通过允许将指令同时发送到多个功能单元,充分利用这种指令级并行性。处理器可能具有多个特定类型的功能单元(例如整数 ALU)和/或不同类型的功能单元(例如浮点和整数单元),指令可以同时发送到这些功能单元。
在超标量处理器中,指令的调度方式与无序设计相同,但现在有多个问题端口,允许同时发出和执行不同的指令。扩展的指令解码电路允许处理器在每个时钟周期内一次读取多条指令并确定它们之间的关系。现代高性能处理器可以根据每条指令的作用在每个时钟周期内调度最多八条指令。这就是处理器如何在每个时钟周期内完成多条指令的方式。看:哈斯韦尔AnandTech 上的执行引擎
- 然而,超标量架构的设计和优化非常困难。检查指令之间的依赖关系需要非常复杂的逻辑,其规模会随着同时执行的指令数量的增加而呈指数级增长。此外,根据应用程序的不同,每个指令流中可同时执行的指令数量有限,因此充分利用 ILP 的努力会遭遇收益递减。
添加了更多高级指令,可以在更短的时间内执行复杂的操作。
随着晶体管预算的增加,实现更高级的指令成为可能,这些指令允许在原本所需时间的一小部分内执行复杂的操作。示例包括矢量指令集例如上交所和AVX同时对多条数据进行计算,并且AES指令集从而加速数据加密和解密。
为了执行这些复杂的操作,现代处理器使用微操作(μops)。复杂指令被解码为 μop 序列,存储在专用缓冲区内,并单独调度执行(在数据依赖性允许的范围内)。这为处理器提供了更多空间来利用 ILP。为了进一步提高性能,一个特殊的μop缓存可用于存储最近解码的μops,以便可以快速查找最近执行的指令的μops。
然而,添加这些指令并不会自动提升性能。只有编写应用程序来使用新指令时,新指令才能提高性能。这些指令的采用受到以下事实的阻碍:使用这些指令的应用程序无法在不支持这些指令的旧处理器上运行。
那么这些技术如何随着时间的推移提高处理器性能?
多年来,流水线变得越来越长,减少了完成每个阶段所需的时间,从而实现了更高的时钟速率。但是,除其他因素外,较长的流水线会增加错误分支预测的惩罚,因此流水线不能太长。为了达到非常高的时钟速度,奔腾 4 处理器使用了非常长的流水线,最多可达 31 个阶段普雷斯科特. 为了减少绩效缺陷,处理器会尝试执行指令,即使它们可能失败,并且会不断尝试,直到成功。这导致非常高的功耗,并降低了从超线程较新的处理器不再使用这么长的管道,特别是自从时钟速率缩放已达到极限以来;哈斯韦尔使用长度在 14 到 19 个阶段之间的流水线,而低功耗架构使用较短的流水线(英特尔凌动西尔弗蒙特有12至14个阶段)。
随着更先进的架构的发展,分支预测的准确性得到了提高,从而减少了由于预测错误而导致的流水线刷新频率,并允许同时执行更多指令。考虑到当今处理器的流水线长度,这对于保持高性能至关重要。
随着晶体管预算的增加,处理器中可以嵌入更大、更有效的缓存,从而减少因内存访问而导致的停顿。在现代系统中,内存访问可能需要 200 多个周期才能完成,因此尽可能减少对主内存的访问非常重要。
较新的处理器能够通过更先进的超标量执行逻辑和“更宽”的设计更好地利用 ILP,从而允许同时解码和执行更多指令。哈斯韦尔架构可以解码四条指令并在每个时钟周期内分派 8 个微操作。增加晶体管预算允许在处理器核心中包含更多功能单元,例如整数 ALU。在较新的设计中,无序执行和超标量执行中使用的关键数据结构(例如保留站、重新排序缓冲区和寄存器文件)得到了扩展,这使得处理器可以搜索更广泛的指令窗口以利用其 ILP。这是当今处理器性能提升的主要驱动力。
较新的处理器包含更复杂的指令,越来越多的应用程序使用这些指令来提高性能。编译器技术的进步,包括以下方面的改进:指令选择和自动矢量化,使这些指令能够更有效地使用。
除上述之外,以前位于 CPU 外部的部件(如北桥、内存控制器和 PCIe 通道)的集成度提高,可以减少 I/O 和内存延迟。这可以减少因访问其他设备的数据延迟而导致的停顿,从而提高吞吐量。
答案3
绝对权威的参考是Intel 64 和 IA-32 架构软件开发人员手册。它们详细描述了架构之间的变化,是了解 x86 架构的重要资源。
我建议您下载合并的 1 至 3C 卷(该页面上的第一个下载链接)。第 1 卷第 2.2 章包含您想要的信息。
我在该章中列出的一些一般差异,从核心到 Nehalem/Sandy Bridge 微架构如下:
- 改进分支预测,更快地从错误预测中恢复
- 超线程技术
- 集成内存控制器,新缓存层次结构
- 更快的浮点异常处理(仅限 Sandy Bridge)
- LEA 带宽改进(仅限 Sandy Bridge)
- AVX 指令扩展(仅限 Sandy Bridge)
完整列表可以在上面提供的链接中找到(第 1 卷,第 2.2 章)。
答案4
因为它们通过添加更高的执行单元(计算单元)来改善 CPU 在每个周期(时钟)内可以执行的指令数量,从而增强 IPC,此外,它们还减少了缓存、RAM、解码、获取延迟,改进了乱序操作和分支预测,然后在降低延迟的同时添加更多缓存。更高带宽的缓存。不时添加新指令。减少每条指令所需的周期(CPI)
时钟速度只是 CPU 性能的一部分,是一个至关重要的组件,但不幸的是,在过去十年左右的时间里,方法节点遇到了瓶颈,尽管采用了优质的水冷,但在不使用干冰或液氮的情况下,任何东西都无法超越 5.0-5.2Ghz。