操作

“中央处理器”的版本间差异

来自pcdiy_dev

(创建页面,内容为“中央处理器(英文全称Central Processing Unit,简称CPU,中文也称之为处理器)作为计算机系统的运算和控制核心,是信息处理、…”)
 
 
第1行: 第1行:
 
中央处理器(英文全称Central Processing Unit,简称CPU,中文也称之为处理器)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。CPU自产生以来,在逻辑结构、运行效率以及功能外延上取得了巨大发展。
 
中央处理器(英文全称Central Processing Unit,简称CPU,中文也称之为处理器)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。CPU自产生以来,在逻辑结构、运行效率以及功能外延上取得了巨大发展。
  
早期的CPU是定制设计的,是大型计算机的一部分,有时是独一无二的。然而,这种为特定应用设计定制CPU的成本高昂的方法在很大程度上让位于为一个或多个目的而大量生产的处理器的开发。这种标准化趋势通常始于离散时代晶体管、大型机和小型计算机随着集成电路(IC)。集成电路最终导致了微处理器成为现代CPU设计的基础。这使得越来越复杂的CPU可以按照纳米级的公差进行设计和制造。CPU的小型化和标准化使这些数字设备在现代生活中的存在大大超出了专用计算机的有限应用范围。现代CPU出现在从汽车到手机到儿童玩具的所有产品中。
+
早期的CPU是定制设计的,是大型计算机的一部分,有时是独一无二的(即专用处理器)。然而,这种为特定应用设计定制CPU的成本高昂的方法在很大程度上让位于为一个或多个目的而大量生产的处理器的开发。这种标准化趋势一般始于分立晶体管主机和微型计算机时代,并随着集成电路(IC)的普及而迅速加快。集成电路最终导致了微处理器的发明,成为现代CPU设计的基础。这使得越来越复杂的CPU的设计和制造公差可以达到纳米级。CPU的微型化和标准化使这些数字设备在现代生活中的应用越来越广泛,远远超出了专用计算机的有限应用范围。从汽车、手机到儿童玩具,现代微处理器无所不在。
  
 
至今,CPU的形式、设计和实现发生了巨大变化,但其基本原理基本保持不变。
 
至今,CPU的形式、设计和实现发生了巨大变化,但其基本原理基本保持不变。
  
 
== 历史 ==
 
== 历史 ==
注:详见 通用CPU的历史
 
 
 
在类似于今天的CPU的机器出现之前,像ENIAC这样的计算机必须在物理上重新布线,以执行不同的任务。这些机器通常被称为 "固定程序计算机",因为它们必须进行物理上的重新配置,以运行不同的程序。由于 "CPU "一词通常被定义为一种软件(计算机程序)执行设备,最早的设备可以正确地称为CPU,是随着存储程序计算机的出现而出现的。
 
在类似于今天的CPU的机器出现之前,像ENIAC这样的计算机必须在物理上重新布线,以执行不同的任务。这些机器通常被称为 "固定程序计算机",因为它们必须进行物理上的重新配置,以运行不同的程序。由于 "CPU "一词通常被定义为一种软件(计算机程序)执行设备,最早的设备可以正确地称为CPU,是随着存储程序计算机的出现而出现的。
  

2023年7月12日 (三) 16:24的最新版本

中央处理器(英文全称Central Processing Unit,简称CPU,中文也称之为处理器)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。CPU自产生以来,在逻辑结构、运行效率以及功能外延上取得了巨大发展。

早期的CPU是定制设计的,是大型计算机的一部分,有时是独一无二的(即专用处理器)。然而,这种为特定应用设计定制CPU的成本高昂的方法在很大程度上让位于为一个或多个目的而大量生产的处理器的开发。这种标准化趋势一般始于分立晶体管主机和微型计算机时代,并随着集成电路(IC)的普及而迅速加快。集成电路最终导致了微处理器的发明,成为现代CPU设计的基础。这使得越来越复杂的CPU的设计和制造公差可以达到纳米级。CPU的微型化和标准化使这些数字设备在现代生活中的应用越来越广泛,远远超出了专用计算机的有限应用范围。从汽车、手机到儿童玩具,现代微处理器无所不在。

至今,CPU的形式、设计和实现发生了巨大变化,但其基本原理基本保持不变。

历史

在类似于今天的CPU的机器出现之前,像ENIAC这样的计算机必须在物理上重新布线,以执行不同的任务。这些机器通常被称为 "固定程序计算机",因为它们必须进行物理上的重新配置,以运行不同的程序。由于 "CPU "一词通常被定义为一种软件(计算机程序)执行设备,最早的设备可以正确地称为CPU,是随着存储程序计算机的出现而出现的。

存储程序计算机的想法在ENIAC的设计中已经存在,但最初被省略了,以便机器能够更快完成。一台存储程序计算机最终将在1949年8月完成。EDVAC被设计用来执行一定数量的各种类型的指令(或操作)。这些指令可以被组合起来以创建有用的程序供EDVAC运行。重要的是,为EDVAC编写的程序被存储在高速计算机存储器中,而不是由计算机的物理线路指定。这克服了ENIAC的一个严重限制,即重新配置计算机以执行一项新任务需要大量的时间和精力。EDVAC运行的程序或软件,可以通过改变计算机内存的内容而改变。

作为数字设备,所有CPU都处理离散状态,因此需要某种开关元件来区分和改变这些状态。在晶体管被商业化接受之前,电气继电器和真空管(热离子阀)通常被用作开关元件。尽管与早期的纯机械设计相比,这些元件具有明显的速度优势,但由于各种原因,它们是不可靠的。例如,用继电器构建直流顺序逻辑电路需要额外的硬件来应对接触反弹的问题。虽然真空管不存在接触反弹的问题,但它们必须在完全运作之前加热,并最终完全停止运作。通常,当真空管发生故障时,必须对CPU进行诊断,以确定故障部件的位置,从而将其更换。因此,早期的电子(基于真空管)计算机通常更快,但不如机电(基于继电器)计算机可靠。

像EDVAC这样的电子管计算机往往在两次故障之间平均间隔8小时,而像哈佛Mark I这样的继电器计算机(更慢,但更早)很少发生故障。最后,基于电子管的CPU成为主导,因为它所提供的显著的速度优势通常超过了可靠性问题。与现代微电子设计相比,这些早期的同步CPU大多以较低的时钟频率运行(关于时钟频率的讨论见下文)。时钟信号频率从100千赫兹到4兆赫兹在这一时期非常普遍,主要受限于它们所使用的开关设备的速度。

分立晶体管和集成电路CPU

随着各种技术促进了制造更小、更可靠的电子设备,CPU的设计复杂性也在增加。第一个这样的改进是随着晶体管的出现。

ETL Mark III于1954年开始开发,由1956年完成,是第一台能够存储程序的晶体管计算机。它是由日本的电子技术实验室创造的。

20世纪50年代和60年代的晶体管CPU不再需要用笨重的、不可靠的和脆弱的开关元件(如真空管和电气继电器)制造。随着这一改进,更加复杂和可靠的CPU被建在一块或几块包含分立(独立)元件的印刷电路板上。

在这一时期,一种在紧凑空间内制造许多晶体管的方法得到普及。集成电路(IC)允许在一个基于半导体的芯片上制造大量的晶体管,或称 "芯片"。起初,只有非常基本的非专业数字电路,如NOR门被小型化为集成电路。基于这些 "积木式 "集成电路的CPU通常被称为 "小规模集成"(SSI)器件。SSI集成电路,如阿波罗导航计算机中使用的那些,通常包含晶体管数量为10的倍数。用SSI集成电路构建整个CPU需要数以千计的独立芯片,但与早期的分立晶体管设计相比,消耗的空间和功率仍然小得多。随着微电子技术的发展,越来越多的晶体管被放置在集成电路上,从而减少了一个完整的CPU所需的单个集成电路的数量。MSI和LSI(中型和大型集成)集成电路将晶体管数量增加到数百个,然后是数千个。

1964年,IBM推出了它的System/360计算机架构,该架构被用于一系列计算机,可以以不同的速度和性能运行相同的程序。这在当时意义重大,因为当时大多数电子计算机都是互不兼容的,即使是由同一制造商制造的计算机也是如此。为了促进这种改进,IBM利用了微程序(通常称为 "微代码")的概念,这种概念在现代CPU中仍被广泛使用(Amdahl1964 & Amdahl et al. 1964 a)。System/360架构是如此受欢迎,以至于它在大型计算机市场上统治了几十年,并留下了一个遗产,类似的现代计算机,如IBM z系列,仍然在继续。在同一年(1964年),数字设备公司(DEC)推出了另一个有影响力的计算机,旨在科学和研究市场,即PDP-8。DEC后来又推出了极为流行的PDP-11系列,该系列最初是用SSI集成电路制造的,但在LSI元件变得实用后,最终用LSI元件实现。与SSI和MSI的前身形成鲜明对比的是,第一个LSI实现的PDP-11包含一个仅由四个LSI集成电路组成的CPU。

基于晶体管的计算机与它们的前辈相比有几个明显的优势。除了有利于提高可靠性和降低功耗外,晶体管还允许CPU以更高的速度运行,因为与电子管或继电器相比,晶体管的开关时间短。由于可靠性的提高以及开关元件(此时几乎完全是晶体管)速度的大幅提高,在此期间,CPU的时钟速率达到了几十兆赫兹。此外,当分立晶体管和集成电路CPU被大量使用时,新的高性能设计如SIMD(单指令多数据)矢量处理器开始出现。这些早期的实验性设计后来催生了专门的超级计算机时代,如Cray公司制造的CPU。

微处理器

20世纪70年代,微处理器的引入极大地影响了CPU的设计和实现。自从1970年第一款商业化的微处理器英特尔4004和1974年第一款广泛使用的微处理器英特尔8080问世以来,这一类CPU几乎完全超越了所有其他中央处理器的实现方法。4004起源于 "Busicom项目",该项目可追溯到1968年,4004诞生的关键人物包括Busicom的Masatoshi Shima,夏普的Tadashi Sasaki,以及英特尔的Marcian Hoff和Federico Faggin。

当时的大型机和微型计算机制造商启动了专有的集成电路开发计划,以升级他们的旧计算机架构,并最终生产出与他们的旧硬件和软件向后兼容的指令集兼容微处理器。再加上现在无处不在的个人电脑的出现和最终的巨大成功,"CPU "这个词现在几乎只适用于微处理器。

前几代的CPU是作为分立元件和众多小型集成电路(IC)在一块或多块电路板上实现的。另一方面,微处理器是以非常少的集成电路制造的CPU;通常只有一个。由于在单个芯片上实现,CPU的总体尺寸较小,这意味着由于栅极寄生电容减少等物理因素,开关时间更快。这使得同步微处理器的时钟速率从几十兆赫兹到几千兆赫兹不等。此外,随着在集成电路上构建超小型晶体管的能力的提高,单个CPU的复杂性和晶体管数量也急剧增加。摩尔定律描述了这一被广泛观察到的趋势,该定律被证明是迄今为止对CPU(和其他IC)复杂性增长的一个相当准确的预测方法。

虽然在过去60年里,CPU的复杂性、尺寸、结构和一般形式都发生了巨大的变化,但值得注意的是,基本设计和功能根本没有什么变化。今天几乎所有的普通CPU都可以非常准确地描述为冯-诺依曼存储程序机。随着前面提到的摩尔定律继续得到验证,人们对集成电路晶体管技术的极限产生了担忧。电子门的极端微型化导致电迁移和阈下漏电等现象的影响变得更加显著。这些新的担忧是导致研究人员研究新的计算方法(如量子计算机),以及扩大并行性和其他方法的使用的许多因素之一,这些方法扩展了经典冯-诺依曼模型的效用。

CPU的运行

大多数CPU的基本操作,无论它们采取何种物理形式,都是执行一串被称为程序的存储指令。该程序由一系列数字表示,保存在某种计算机存储器中。几乎所有的CPU在运行中都有四个步骤:取数、解码、执行和回写。

第一步,取,包括从程序存储器中取回一条指令(由一个数字或数字序列表示)。程序存储器中的位置由程序计数器(PC)决定,它存储了一个数字,用于识别程序中的当前位置。换句话说,程序计数器记录了CPU在当前程序中的位置。当一条指令被取走后,PC会根据指令字的长度(以内存单位计算)进行递增。通常,要取走的指令必须从相对较慢的内存中取回,导致CPU在等待指令返回时停顿。这个问题在现代处理器中主要由缓存和流水线架构解决(见下文)。

CPU从内存中获取的指令被用来决定CPU要做什么。在解码步骤中,指令被分解成对CPU的其他部分有意义的部分。数字指令值的解释方式由CPU的指令集架构(ISA)定义。通常,指令中的一组数字,称为操作码,表示要执行的操作。数字的其余部分通常提供该指令所需的信息,如加法运算的操作数。这些操作数可以作为一个常量值(称为即时值),或作为一个定位值的位置:一个寄存器或一个内存地址,由一些寻址模式决定。在较早的设计中,CPU中负责指令解码的部分是不可改变的硬件设备。然而,在更抽象、更复杂的CPU和ISA中,通常使用一个微程序来协助将指令翻译成CPU的各种配置信号。这个微程序有时是可重写的,因此即使在制造出来之后,也可以修改它以改变CPU解码指令的方式。

在获取和解码步骤之后,执行步骤被执行。在这个步骤中,CPU的各个部分被连接起来,以便它们能够执行所需的操作。例如,如果要求进行加法运算,一个算术逻辑单元(ALU)将被连接到一组输入和一组输出。输入端提供要加的数字,而输出端将包含最后的总和。ALU包含对输入进行简单算术和逻辑运算的电路(如加法和位运算)。如果加法运算产生的结果太大,CPU无法处理,也可以在标志寄存器中设置一个算术溢出标志。

最后一步,回写,只是将执行步骤的结果 "回写 "到某种形式的存储器中。很多时候,结果会被写到CPU内部的某个寄存器中,以便被后续指令快速访问。在其他情况下,结果可能被写入速度较慢,但更便宜和更大的主存储器。有些类型的指令是操纵程序计数器而不是直接产生结果数据。这些通常被称为 "跳转",促进了程序中的循环、条件性程序执行(通过使用条件性跳转)和函数等行为。这些标志可以用来影响程序的行为方式,因为它们经常表明各种操作的结果。例如,一种类型的 "比较 "指令考虑两个数值,并根据哪个数值更大而在标志寄存器中设置一个数字。这个标志可以被后来的跳转指令使用,以确定程序流程。

在执行指令和回写结果数据后,整个过程会重复进行,下一个指令周期通常会因为程序计数器中的数值增加而获取下一个顺序指令。如果完成的指令是一个跳转,程序计数器将被修改为包含跳转到的指令的地址,程序的执行继续正常进行。在比这里描述的更复杂的CPU中,多条指令可以同时被获取、解码和执行。本节描述的是通常所说的 "经典RISC流水线",事实上,这种流水线在许多电子设备中使用的简单CPU(通常称为微控制器)中相当普遍。它在很大程度上忽略了CPU缓存的重要作用,因此也忽略了流水线的访问阶段。

设计与执行

整数范围

CPU表示数字的方式是一种设计选择,它影响到设备功能的最基本方式。一些早期的数字计算机使用常见的十进制数字系统的电子模型来在内部表示数字。还有一些计算机使用了更奇特的数字系统,如三元(基数三)。几乎所有的现代CPU都以二进制形式表示数字,每个数字都由一些双值的物理量表示,如 "高 "或 "低 "电压。

与数字表示有关的是CPU可以表示的数字的大小和精度。在二进制CPU的情况下,一个比特指的是CPU处理的数字中的一个重要位置。CPU用来表示数字的位数(或数字位)通常被称为 "字大小"、"位宽度"、"数据路径宽度",或者在处理严格的整数(相对于浮点)时称为 "整数精度"。这个数字在不同的架构中是不同的,而且往往是在同一个CPU的不同部分。例如,8位CPU处理的数字范围可由8个二进制数字表示(每个数字有两个可能的值),也就是28或256个离散数字。实际上,整数大小对CPU运行的软件可以利用的整数范围设定了一个硬件限制。

整数范围也会影响到CPU可以寻址(定位)的内存位置的数量。例如,如果一个二进制CPU使用32位来表示内存地址,每个内存地址代表一个八位数(8位),那么CPU可以寻址的最大内存数量是232个八位数,或4GB。这是一个非常简单的CPU地址空间的观点,许多设计使用更复杂的寻址方法,如分页,以定位更多的内存,而不是其整数范围允许的平面地址空间。

更高层次的整数范围需要更多的结构来处理额外的数字,因此需要更多的复杂性、尺寸、功率使用和一般费用。因此,在现代应用中使用4位或8位的微控制器并不罕见,即使有更高范围的CPU(如16、32、64,甚至128位)。较简单的微控制器通常更便宜,耗电更少,因此散热更少,所有这些都可以成为电子设备的主要设计考虑因素。然而,在更高端的应用中,额外的范围(最常见的是额外的地址空间)所带来的好处更加显著,并经常影响设计选择。为了获得更低和更高的位长所带来的一些优势,许多CPU在设计时对设备的不同部分采用不同的位宽。例如,IBM System/370使用的CPU主要是32位,但它的浮点单元内使用了128位精度,以促进浮点数字的更大精度和范围。许多后来的CPU设计使用类似的混合位宽,特别是当处理器用于通用用途时,需要合理平衡整数和浮点能力。

时钟频率

大多数CPU,乃至大多数顺序逻辑设备,在本质上都是同步的。[14]也就是说,它们的设计和运行是基于对同步信号的假设。这个信号被称为时钟信号,通常采用周期性方波的形式。通过计算电信号在CPU众多电路的各个分支中可以移动的最大时间,设计者可以为时钟信号选择一个合适的周期。

这个周期必须长于信号在最坏情况下移动或传播的时间。在将时钟周期设置为远高于最坏情况下的传播延迟的数值时,就有可能设计整个CPU及其围绕上升和下降时钟信号的 "边缘 "移动数据的方式。这样做的好处是大大简化了CPU,无论是从设计角度还是从元件数量的角度。然而,它也有一个缺点,即整个CPU必须等待其最慢的元素,即使它的某些部分要快得多。这一限制在很大程度上已经被各种增加CPU并行性的方法所弥补。(见下文)

然而,仅靠架构上的改进并不能解决全局同步CPU的所有缺点。例如,时钟信号会受到任何其他电信号的延迟影响。在越来越复杂的CPU中,更高的时钟速率使得在整个单元中保持时钟信号的相位(同步)更加困难。这导致许多现代CPU需要提供多个相同的时钟信号,以避免单一信号的延迟严重到导致CPU故障。随着时钟速率的急剧增加,另一个主要问题是CPU的耗散热量。不断变化的时钟导致许多组件切换,而不管它们当时是否正在使用。一般来说,正在切换的元件比处于静态状态的元件消耗更多的能量。因此,随着时钟频率的增加,散热也随之增加,导致CPU需要更有效的冷却解决方案。

处理不需要的元件切换的一种方法被称为时钟门控,它涉及关闭不需要的元件的时钟信号(有效地禁用它们)。然而,这通常被认为是难以实现的,因此在非常低的功率设计之外没有得到普遍使用。[15] 解决全局时钟信号的一些问题的另一种方法是完全去除时钟信号。虽然去除全局时钟信号使设计过程在许多方面变得更加复杂,但与类似的同步设计相比,异步(或无时钟)设计在功耗和散热方面有明显的优势。虽然有些不常见,但整个异步CPU已经在不使用全局时钟信号的情况下被制造出来。这方面的两个明显例子是符合ARM的AMULET和兼容MIPS R3000的MiniMIPS。一些CPU设计并没有完全删除时钟信号,而是允许设备的某些部分是异步的,例如将异步ALU与超标量流水线结合使用,以实现一些算术性能的提高。虽然目前还不完全清楚完全异步设计是否能达到与同步设计相当或更好的水平,但很明显,它们至少在较简单的数学运算中表现出色。这一点,再加上它们出色的功耗和散热性能,使它们非常适用于嵌入式计算机。

并行计算

上一节提供的关于CPU基本操作的描述,描述了CPU可以采取的最简单的形式。这种类型的CPU,通常被称为次标量,一次对一个或两个数据进行操作并执行一条指令。

这个过程在次标量CPU中产生了一个固有的低效率。由于每次只执行一条指令,整个CPU必须等待该指令完成后才能进行下一条指令。因此,子标度CPU会被那些需要一个以上时钟周期才能完成的指令 "挂起"。即使增加第二个执行单元(见下文)也不能改善性能;不是一个通路被挂起,而是现在有两个通路被挂起,未使用的晶体管数量增加。这种设计,即CPU的执行资源一次只能对一条指令进行操作,只可能达到标量性能(每时钟一条指令)。然而,其性能几乎总是次标量的(每周期少于一条指令)。

试图实现标量和更好的性能,导致了各种设计方法,使CPU的行为不那么线性,而更多地是并行的。在提到CPU的并行性时,一般用两个术语来对这些设计技术进行分类。指令级并行(ILP)旨在提高指令在CPU中的执行速度(即提高片上执行资源的利用率),而线程级并行(TLP)旨在增加CPU可以同时执行的线程(实际上是单个程序)的数量。每种方法在实施的方式上都有所不同,而且它们在提高CPU的应用性能方面的相对有效性也不同。

指令级并行

用于提高并行性的最简单的方法之一是在前一条指令执行完毕之前开始指令获取和解码的第一个步骤。这是一种被称为指令流水线的技术的最简单形式,几乎在所有的现代通用CPU中都得到了应用。流水线技术通过将执行路径分解为不连续的阶段,允许在任何时间执行一条以上的指令。这种分离可与装配线相提并论,在装配线上,一条指令在每个阶段都变得更加完整,直到它退出执行管道并被报废。

然而,流水线确实带来了一种可能性,即需要前一个操作的结果来完成下一个操作;这种情况通常称为数据依赖性冲突。为了应对这种情况,必须采取额外的措施来检查这类情况,并在发生这种情况时延迟部分指令流水线。当然,要做到这一点需要额外的电路,所以流水线处理器比子标量处理器更复杂(尽管不是非常明显)。一个流水线处理器可以变得非常接近标量,只被流水线停滞(一条指令在一个阶段花费超过一个时钟周期)所抑制。

对指令流水线想法的进一步改进导致了一种方法的发展,这种方法甚至进一步减少了CPU组件的空闲时间。据说超标量的设计包括一个长的指令流水线和多个相同的执行单元。在超标量流水线中,多条指令被读取并传递给一个调度器,调度器决定这些指令是否可以被并行(同时)执行。如果可以的话,它们就被分配到可用的执行单元,从而使几条指令能够同时执行。一般来说,超标量CPU能够同时将更多的指令分配给等待的执行单元,在一个给定的周期内完成的指令就越多。

设计超标量CPU架构的大部分困难在于创建一个有效的调度器。调度器需要能够快速、正确地确定指令是否可以并行执行,并以尽可能多的执行单元保持忙碌的方式来调度它们。这就要求尽可能频繁地填充指令流水线,并在超标量架构中产生对大量CPU缓存的需求。这也使得诸如分支预测、推测执行和失序执行等避险技术对保持高水平的性能至关重要。通过尝试预测一个条件指令将采取的分支(或路径),CPU可以最大限度地减少整个流水线必须等待条件指令完成的次数。推测性执行经常提供适度的性能提升,在条件性操作完成后执行可能需要或不需要的部分代码。失序执行在一定程度上重新安排了指令的执行顺序,以减少由于数据依赖性造成的延迟。

在部分CPU是超标量而部分不是的情况下,非超标量的部分由于调度停滞而遭受性能损失。最初的英特尔奔腾(P5)有两个超标量ALU,每个ALU可以在每个时钟上接受一条指令,但其FPU不能在每个时钟上接受一条指令。因此,P5是整数超标的,但不是浮点超标的。英特尔奔腾架构的后继者P6在其浮点功能的基础上增加了超标量功能,因此在浮点指令性能上有了显著的提高。

简单的流水线和超标量设计都增加了CPU的ILP,允许单个处理器以超过每周期一条指令(IPC)的速度完成指令的执行。大多数现代CPU设计至少在某种程度上是超标量的,几乎所有在过去十年设计的通用CPU都是超标量的。近年来,设计高ILP计算机的一些重点已经从CPU的硬件转移到了它的软件接口,即ISA。超长指令字(VLIW)的策略使一些ILP直接被软件所隐含,减少了CPU为提高ILP而必须执行的工作量,从而降低了设计的复杂性。

线程级并行

另一种实现性能的策略是并行执行多个程序或线程。这一领域的研究被称为并行计算。在弗林的分类法中,这种策略被称为多指令-多数据或MIMD。用于这一目的的一项技术是多处理(MP)。这种技术的最初味道被称为对称多处理(SMP),其中少数CPU共享其内存系统的一致视图。在这个方案中,每个CPU都有额外的硬件来维持一个不断更新的内存视图。通过避免陈旧的内存视图,CPU可以在同一个程序上合作,程序可以从一个CPU迁移到另一个CPU。为了将合作的CPU数量增加到少数以外,在20世纪90年代引入了非统一内存访问(NUMA)和基于目录的一致性协议等方案。SMP系统仅限于少量的CPU,而NUMA系统已经建立了成千上万的处理器。最初,多处理是使用多个分立的CPU和板卡来实现处理器之间的互连。当处理器及其互连都在一个硅芯片上实现时,该技术被称为多核微处理器。

后来人们认识到,单个程序存在着更细粒度的并行性。一个程序可能有几个线程(或功能),可以单独或并行执行。这种技术的一些最早的例子实现了输入/输出处理,如直接内存访问,作为计算线程的一个独立线程。这种技术的一个更普遍的方法是在20世纪70年代引入的,当时系统被设计为并行运行多个计算线程。这种技术被称为多线程(MT)。这种方法被认为比多处理更具成本效益,因为为了支持MT,CPU内只有少数组件被复制,而不是MP情况下的整个CPU。在MT中,执行单元和内存系统(包括缓存)由多个线程共享。MT的缺点是,与MP相比,多线程的硬件支持对软件来说更加明显,因此像操作系统这样的主管软件必须进行更大的改变以支持MT。实现的一种MT被称为块多线程,其中一个线程被执行,直到它停滞不前,等待数据从外部存储器返回。在这种方案中,CPU会迅速切换到另一个准备运行的线程,这种切换通常在一个CPU时钟周期内完成,如UltraSPARC技术。另一种类型的MT被称为同步多线程,即在一个CPU时钟周期内平行执行多个线程的指令。

从20世纪70年代到21世纪初的几十年间,设计高性能通用CPU的重点主要是通过流水线、缓存、超标量执行、失序执行等技术实现高ILP。这一趋势最终导致了大型、高能耗的CPU,如英特尔奔腾4。到21世纪初,由于CPU工作频率和主内存工作频率之间的差距越来越大,以及由于更深奥的ILP技术导致CPU功率耗散不断增加,CPU设计者无法从ILP技术中实现更高的性能。

随后,CPU设计者从交易处理等商业计算市场上借鉴了一些想法,在这些市场上,多个程序的总体性能,也就是所谓的吞吐量计算,比单个线程或程序的性能更重要。

双核和多核CMP(芯片级多处理)设计的激增,特别是英特尔较新的设计,类似于其较少的超标量P6架构,就是这种重点逆转的证明。几个处理器系列的后期设计显示了CMP,包括x86-64皓龙和速龙64 X2,SPARC UltraSPARC T1,IBM POWER4和POWER5,以及几个视频游戏机CPU,如Xbox 360的三核PowerPC设计,和PS3的8核Cell微处理器。

数据并行

CPU(实际上是一般的计算)的一个不太常见但越来越重要的范式是处理数据并行性。前面讨论的处理器都被称为某种类型的标量设备。顾名思义,矢量处理器在一条指令中处理多条数据。这与标量处理器形成对比,后者在每条指令中处理一个数据。使用Flynn的分类法,这两种处理数据的方案通常被分别称为SISD(单指令,单数据)和SIMD(单指令,多数据)。创建处理数据矢量的CPU的巨大效用在于优化那些倾向于要求对大量数据集进行相同操作(例如,和或点乘)的任务。这些类型的任务的一些典型例子是多媒体应用(图像、视频和声音),以及许多类型的科学和工程任务。标量CPU必须完成获取、解码和执行一组数据中的每条指令和数值的整个过程,而矢量CPU可以用一条指令对一个相对较大的数据集进行单一操作。当然,这只有在应用倾向于需要许多步骤时才有可能,这些步骤将一个操作应用于一个大的数据集。

大多数早期的矢量CPU,如Cray-1,几乎只与科学研究和密码学应用有关。然而,随着多媒体在很大程度上转向数字媒体,通用CPU对某种形式的SIMD的需求已经变得很重要。在浮点执行单元开始在通用处理器中普及后不久,SIMD执行单元的规范和实现也开始出现在通用CPU上。其中一些早期的SIMD规格,如惠普的多媒体加速扩展(MAX)和英特尔的MMX都是只用整数。这被证明是一些软件开发者的重大障碍,因为许多受益于SIMD的应用主要是处理浮点数字的。渐渐地,这些早期的设计被改进和改造成一些常见的、现代的SIMD规格,它们通常与一种ISA相关。一些著名的现代例子是英特尔的SSE和与PowerPC相关的AltiVec(也被称为VMX)。


翻译自https://computer.fandom.com/wiki/Central_Processing_Unit