处理器的设计和制造方式:计算机体系结构的基础

图片

我们将中央处理器视为计算机的“大脑”,但这到底意味着什么? 在使计算机工作的数十亿个晶体管内部究竟发生了什么? 在新的迷你系列的四篇文章中,我们将考虑创建计算机设备体系结构的过程,并讨论其操作原理。

在本系列中,我们将讨论计算机体系结构,处理器板设计,VLSI(超大规模集成),芯片制造以及计算机技术领域的未来趋势。 如果您有兴趣了解处理器的详细信息,那么最好从这一系列文章开始研究。

我们将从处理器的功能以及构建块如何连接到功能结构的非常高级的解释开始。 特别是,我们将考虑处理器核心,内存层次结构,分支预测等。 首先,我们需要对CPU的功能进行简单定义。 最简单的解释是:处理器遵循一组指令来对大量传入数据执行特定操作。 例如,它可以从内存中读取一个值,然后将其添加到另一个值中,最后将结果保存到其他地址的内存中。 如果先前计算的结果大于零,则可能会更复杂,例如将两个数相除。

诸如操作系统或游戏之类的程序本身就是CPU必须执行的指令序列。 这些指令从内存中加载并在一个简单的处理器中一个接一个地执行,直到程序终止。 软件开发人员使用高级语言(例如C ++或Python)编写程序,但是处理器无法理解它们。 他只了解1和0,因此我们需要以某种方式表示这种格式的代码。


程序被编译为一组称为汇编语言的低级指令,这是指令集体系结构(ISA)的一部分。 这是CPU必须理解和执行的一组指令。 一些最常见的ISA是x86,MIPS,ARM,RISC-V和PowerPC。 与用C ++编写函数的语法不同于在Python中执行相同操作的函数相同,每个ISA都有自己不同的语法。

这些ISA可以分为两个主要类别:固定长度和可变长度。 ISA RISC-V使用固定长度的指令,这意味着每个指令中的预定位数确定该指令是什么类型。 在x86中,一切都不同,它使用可变长度指令。 在x86中,指令可以用不同的方式编码,不同部分的位数不同。 由于这种复杂性,x86处理器上的指令解码器通常是整个设备中最复杂的部分。

固定长度的指令由于具有恒定的结构而提供了简单的解码,但是限制了ISA可以支持的指令总数。 尽管RISC-V架构的流行版本大约有100条指令,并且全部都是开源的,但是x86架构是专有的,没人知道其中有多少指令。 一般认为,有数千条x86指令,但没有人发布确切的数字。 尽管ISA之间存在差异,但实际上它们都具有相同的基本功能。


一些RISC-V指令的示例。 右边的操作码长7位,它确定指令的类型。 此外,每个指令都包含一些位,这些位定义了使用的寄存器和执行的功能。 因此,汇编程序指令被分解为二进制代码,以便处理器理解它。

现在,我们准备打开计算机并开始执行程序。 指令的执行有几个基本部分,分为处理器的许多阶段。

第一步是将指令从内存传输到处理器以开始执行。 在第二步中,对指令进行解码,以便CPU可以了解指令的类型。 有很多类型,包括算术指令,分支指令和存储指令。 CPU找出正在执行的指令类型后,该指令的操作数将从内存或内部CPU寄存器中获取。 如果要添加数字A和数字B,则必须先知道A和B的值,然后才能添加数字。大多数现代处理器都是64位的,即每个数据值的大小是64位。


64位是处理器寄存器,数据通道和/或存储器地址的宽度。 对于普通用户,这意味着一台计算机一次可以处理多少信息,与相对较年轻的32位处理器架构相比,这最好理解。 64位体系结构一次可以处理两倍的信息位(64位与32位)。

接收到指令的操作数后,处理器会将它们转移到执行阶段,在执行阶段对传入的数据执行操作。 这可以是添加数字,使用数字执行逻辑操作,或者只是传递数字而不更改它们。 在计算结果之后,可能需要访问内存以存储它,或者处理器可以简单地将值存储在其内部寄存器之一中。 保存结果后,CPU更新各个元素的状态,并进行下一条指令。

当然,这种解释已大大简化了,大多数现代处理器将这几个阶段分为20个甚至更多的小阶段以提高效率。 这意味着尽管处理器在每个周期中以几条指令开始和结束,但从头到尾执行一条指令可能需要20个或更多个周期。 这种模型通常称为管道(“管道”,通常翻译为俄文“输送器”),因为用液体填充管道并完成它需要时间,但是在填充后(数据输出)将保持不变。


4级传送带的示例。 多色矩形表示彼此独立的指令。

指令执行的整个周期是一个非常仔细协调的过程,但是并非所有指令都可以同时完成。 例如,加法非常快,从内存中进行划分或加载可能要花费数千个周期。 多数现代处理器不会改变整个处理器的运行速度,直到完成一条缓慢的指令,而是以顺序更改的方式执行它们。 即,它们确定当前执行哪个指令最有利,并缓冲尚未准备好的其他指令。 如果当前指令尚未准备好,则处理器可以向前跳转代码以查看是否还有其他准备好。

除了执行一系列更改外,现代处理器还使用一种称为超标量架构的技术。 这意味着在任何时候,处理器都会在流水线的每个阶段同时执行很多指令。 他还可以期望有数百个开始执行,并且为了能够在处理器内部同时执行多个指令,流水线的每个阶段都有多个副本。 如果处理器看到两条指令已准备好执行,并且它们之间没有依赖关系,则它不会等到它们分别完成后才执行。 这种体系结构的一种流行的实现称为同步多线程(SMT),也称为超线程。 英特尔和AMD处理器现在支持双面SMT,而IBM已开发了支持多达8个SMT的芯片。


为了完成这种精心协调的执行,处理器除了基本内核外,还具有许多其他元素。 处理器具有数百个独立的模块,每个模块都有特定的功能,但是我们仅考虑基础知识。 最重要和最有利可图的是缓存和转换的预测器。 我们将不考虑其他结构:重新排序缓冲区,注册重命名表和备份站。

高速缓存的需求有时会造成混乱,因为它们存储数据(例如RAM或SSD)。 但是缓存的延迟和访问速度有所不同。 尽管RAM内存非常快,但它比CPU所需的速度要慢几个数量级。 可能需要数百个周期才能响应RAM数据的传输,此时处理器将无任何事。 而且,如果RAM中没有数据,则可能要花费数万个周期才能从SSD中访问它们。 没有缓存,处理器将不断停止。

处理器通常具有组成所谓的内存层次结构的三个缓存级别。 L1高速缓存是最小和最快的,L2在中间,L3是最大和最慢的所有缓存。 层次结构中的高速缓存上方是小型寄存器,这些寄存器在计算期间仅存储数据值。 从数量上看,这些寄存器是系统中最快的存储设备。 当编译器将高级程序转换为汇编语言时,它将确定使用这些寄存器的最佳方法。

当CPU从内存请求数据时,它首先检查该数据是否已经存储在L1高速缓存中。 如果是这样,那么您可以在几个周期内访问它们。 如果它们不存在,则处理器检查L2,然后检查L3高速缓存。 高速缓存通常以对内核透明的方式实现。 内核只是在指定的内存地址请求数据,并且它所在的层次结构中的级别会对其进行响应。 当移至内存层次结构中的后续级别时,大小和延迟通常会增加几个数量级。 最后,如果CPU在任何缓存中均未找到数据,则它将访问主内存(RAM)。


在常规处理器中,每个内核都有两个L1缓存:一个用于数据,另一个用于指令。 L1高速缓存通常的总容量约为100 KB,其大小根据芯片和处理器的产生而变化很大。 此外,尽管在某些体系结构中两个内核可能通用,但是通常每个内核都有自己的二级缓存。 L2缓存的大小通常为数百千字节。 最后,所有内核共有一个L3高速缓存,大小约为数十兆字节。

处理器执行代码时,将缓存最常用的指令和数据值。 由于处理器不需要经常访问主存储器以获取必要的数据,因此可以显着加快执行速度。 在本系列的第二部分和第三部分中,我们将更多地讨论如何实现这些存储系统。

除高速缓存外,现代处理器最重要的构建模块之一是精确的过渡预测器 。 转换(分支)指令类似于处理器的if构造。 如果条件为真,则执行一组指令,否则为假。 例如,我们需要比较两个数字,如果它们相等,则执行一个功能,如果它们不相等,则执行另一个功能。 这些分支指令非常常见,并且可以构成程序中所有指令的20%。

乍一看,这些分支指令似乎不会引起问题,但是对于处理器而言,它们的正确执行可能非常困难。 在任何给定时间,处理器可能正在同时执行十个或二十个指令,因此了解要执行的指令非常重要。 可能需要5个周期来确定当前指令是转移指令,另外可能需要10个周期来确定条件是否成立。 此时,处理器可能已经开始执行许多其他指令,甚至不知道这些指令是否真的适合执行。

为了解决这个问题,所有现代高性能处理器都使用一种称为推测的技术。 这意味着处理器会跟踪分支指令,并想知道是否将执行条件分支。 如果预测正确,那么处理器已经开始执行以下指令,这可以提高性能。 如果预测不正确,则处理器将停止执行,删除开始执行的所有不正确指令,然后从正确的位置重新开始。

此类分支预测器是机器学习中最简单的类型,因为预测器研究执行期间分支的行为。 如果他经常错误地做出预测,他将开始学习正确的行为。 几十年来对过渡预测技术的研究已使现代处理器的预测精度达到90%以上。

尽管期望可以大大提高性能,但是由于处理器可以执行已经准备好的指令,而不是在队列中等待执行完成,因此还会产生安全漏洞。 著名的Spectre攻击利用了预测和预期过渡中的错误。 攻击者使用经过特殊选择的代码来强制处理器主动执行该代码,从而导致内存值泄漏。 为防止数据泄漏,有必要重新设计某些特定方面的设计,从而导致性能略有下降。

在过去的几十年中,现代处理器中使用的体系结构已经走了很长一段路。 创新和经过深思熟虑的结构的发展已提高了生产率并更优化了硬件的使用。 但是,中央处理器的开发人员会谨慎地保留其技术的秘密,因此我们无法确切了解它们内部正在发生什么。 但是,处理器的基本原理已针对所有体系结构和模型进行了标准化。 英特尔可以添加其秘密成分以增加缓存命中的份额,而AMD可以添加改进的过渡预测器,但是两家公司的处理器执行相同的任务。

在第一眼和回顾中,我们介绍了处理器如何工作的基础知识。 在下一部分中,我们将告诉您如何开发构成处理器的组件,并讨论逻辑元素,时钟频率,电源管理,电路等。

推荐读物

Source: https://habr.com/ru/post/zh-CN456922/


All Articles