【知乎】电脑硬件入门——基础之CPU架构解读

电脑硬件入门——基础之CPU架构解读

木头龙

中央处理器 (CPU)等 3 个话题下的优秀答主
关注他
577 人赞同了该文章
前言
上一篇文章我们从整体上介绍了电脑的各个部件以及功能,CPU可以说是整台电脑中最核心的部件。这篇文章里面,给大家介绍一下CPU里面都有什么。
我们家里用的电脑,CPU只有两家厂商在生产:Intel和AMD。每家厂商都提供很多型号的CPU,这篇文章以Intel生产的,主流市场上的旗舰型号:Core i9-9900K为例子来介绍。
1、9900K整体架构
还是先看图[1]:
9900K大概可以分为5个部分:
CPU核心:图中红框部分为一个核心,9900K一共有8个核心。早期的CPU其实就只有这么一个东西,但现在的CPU逐步发展,把一些周边的部件也集成在同一块半导体晶片上,因此传统的CPU就变成了现代CPU上的核心。此外,为了提高CPU的计算能力,单块CPU中的核心数量越来越多,就消费级市场来说,从2005第一款双核心CPU奔腾D发布到今天的单块CPU晶片有8个核心的i9-9900K。
三级缓存(Level 3 Cache,简写为L3、L3$、L3C、L3 Cache):图中中间8个粉色块组成的三级缓存,用于临时存放内存中的一小部分数据。这里分成8小块,对应8个CPU核心。有时候L3也叫末级缓存(Last Level Cache,LLC),当然,对9900K这样具有三级缓存的CPU,L3才等同于LLC。有的老式CPU有的只有二级缓存,LLC就是L2;某些服务器使用的CPU有四级缓存,LLC则是指L4。
核心显卡:图中左边紫框部分,这个以后的文章中我们再介绍。
系统代理:图中右边绿色部分,这是负责连接CPU与其它部件的多个模块的集合。从上到下分别是:
显示控制器:负责核心显卡输出;
PCI-e控制器:负责CPU与外部IO设备连接,以后的文章我们会另外介绍;
eDRAM控制器:这个其实9900K是没有的,某些定制型号会集成有特殊的内存,称为嵌入式动态随机访问存储(Embedded Dynamic Random-Access Memory, eDRAM)。一般来说eDRAM是作为核心显卡的专用显存使用,这个控制器就是负责从eDRAM读写数据的。
内存控制器:负责CPU与内存连接,从内存中读写数据。
环形总线(RingBus):把上面这些模块连接起来的,上图中标记着Ring的蓝色圈。
2、核心架构图
这张图看起来很复杂是不是?不用担心,我们一个一个说。当然,我们这是入门知识,不会介绍的太细。
我们上一篇文章提到,现代CPU都是改进型哈弗架构;并且举了一个会计做财务报告的例子。这里我们继续使用这个例子来介绍。但之前,我们稍微改一下做财务报告的方式,不是一个人全部做完,我们是一个团队。有的同事根据制作指南列计算步骤,有的同事根据计算步骤在小纸条上列公式,有的同事负责从账本上把数据抄到写好公式的小纸条上,有的同事对着小纸条用计算器算数并且算完了写回小纸条上,有的同事把小纸条上的数抄到最终的财务报表上。CPU里面,小纸条有一个专门的名称,叫寄存器(Register)。
2.1 缓存子系统(Memory Subsystem)
一家规模比较大点的企业,完整的账本很厚。我们做整年的财务报告,通常只需要每个科目的汇总数就可以了,为了方便,我们把每个科目汇总的那几页复印出来放在一起。
完整的财务报告制作指南也很厚,但一个企业可能只有其中很少一部业务。例如一家软件公司,就不涉及原材料进货、仓库存储之类的业务;很多公司也没有贷款、投资之类的业务。所以我们也只把跟公司有相关业务的部分复印出来。
同样的,内存中的数据很多,CPU只需要把计算用到的指令、数据放到缓存中——也就是图中的紫色块的缓存子系统。
2.2 前端(Front End)
CPU的前端其实就是我们上篇文章中的控制单元,负责对指令进行预处理。指令预处理大体上分为取指、预解码、融合、解码、分支预测、重排等操作。
取指(Fetch)
我们制作财务报表,第一步就是把制作指南拿出来。CPU也一样,先把指令载入进来。
预解码(PreDecode)
制作指南是一整页的,我们要分解出第一步算哪个数据,第二步又是算哪个数据,在小纸条上把公式列出来,一张小纸条一个公式。CPU也一样,要把程序中一整批的指令数据,拆分出来第一条是什么指令,第二条是什么指令;可能还需要对指令进行分类标志。预解码后的指令放在指令队列(Instruction Queue)里面。
解码(Decode),又称为译码
小纸条上的公式写着:利润=收入-支出,查帐本的同事就需要先把收入和支出数据从账本中找出来,抄到小纸条上。同样的,CPU碰到类似把内存中两个数加起来这样的指令,需要分解成:
从内存载入第一个数字;
从内存载入第二个数字;
两个数字相加
这样三个指令。一般来说,我们把原始的指令称为宏操作(Macro-Operations),分解后的指令称为微操作(Micro-Operations, μops)。
指令融合(Micro-Fusion/Macro-Fusion)
假设指南中有一个数据是算平均数的,某个按计算器的同事手上整好有一个可以直接算平均数的统计用计算器。那么,当我们在指南中看到一条类似 (A1+A2+A3+...+An)÷N 这样的公式的时候,我们可以直接列算这几个数的平均数公式,注明给这位同事算。CPU也一样,某些指令是可以融合起来执行的,例如:
比较A和B的大小;
如果A不等于B,跳转到标志X的指令。
可以用一条指令JNE A,B,X来代替,这样的处理称之为指令融合。指令解码前的宏操作融合,称为Macro-Fusion,解码后的微操作融合,称为Micro-Fusion。
分支预测(Branch Prediction)
理论上,制作指南中列出的所有步骤,我们都要完成上面的这些处理。但假设制作指南中说,盈利的话要算某几个数据,亏损的话这几个数不用算,要另外算其它几个数据。当我们计算过第一季度的数据知道企业第一季度是盈利的,我们算第二季度的数据时,想偷懒就直接跳过亏损要算的那几个数据的处理了。CPU处理指令也是一样的,负责预测的模块叫分支预测器(Branch Predictor)
当然,如果算下来我们发现第二季度亏损了,还是要重新处理指南上的这些计算步骤。CPU也一样。
指令重排,或者叫乱序执行(Out-Of-Order,OOO),或者动态执行(Dynamic Execution)
事实上,我们不一定要完全按照指南上的步骤第一步算什么,第二步算什么这样算。只要公式列出来,数据抄出来了,就可以直接交给按计算器的同事去算。所以可能第一步要用的数据不太好找,按计算器的同事就先把第二步算出来了。
当然,这里有一个前提,就是算第二步的时候,不需要用到第一步的计算结果。
2.3 执行单元(Execution Engine)
执行单元也就是上一篇文章提到的运算单元了。也就是我们这个团队里抄数据、按计算器的各位同事了。其中,按计算器的同事中,有的用的计算器简单点,只能做四则计算,还只能算整数;有的用高级点的计算器,可以算小数;有的用统计专用的计算器;有的用更高级的可以算很多函数的计算器。当然,有这么多不同的计算器,什么样的小纸条给哪位同事用,我们也需要有一个人来做分配小纸条这件事情。
数据存取单元(Load Data/Store Data)
CPU里面也一样,有负责从缓存子系统中载入数据的Load Data单元;有把计算结果写回去缓存子系统的Store Data单元。
计算单元
CPU里面负责具体计算的,根据计算类型、计算的数据不同,有多种计算单元:
整数算术逻辑单元(Integer Arithmetic Logic Unit,Int ALU),算整数加减法/二进制运算;需要说明一下的,电脑里面很多小数计算也是通过移位操作处理后,用整数单元计算后再数小数位这样的方式来处理的。
整数乘法器(Integer Multiplier,Int MUL),专门负责整数乘法的;
整数除法器(Integer Divider,Int DIV),专门负责整数除法的;
分支处理(Branch),负责各种跳转指令的;
地址生成器(Address Generation Unit,AGU),这个稍微解释一下,例如制作指南中说,总收入要和上一年度的总收入对比算增长率,那么就需要翻译成“现在做2018年的年报,上一年度就是2017年度总收入”。CPU也是一样,有的指令是把内存地址A1的数和A1后面第五个地址的数相加,那么要先算出来A1后面五个地址A2到底是哪个地址。
整数向量ALU(Int Vect ALU),向量是指类似空间坐标+值(x,y,z, value)这样的一组数据,其中x、y、z和value都是整数。类似整数,除了算加减法/二进制的整数向量ALU,还有整数向量乘法器、除法器(Int Vect MUL,Int Vect DIV)。
浮点向量加乘融合单元(Fused multiply–add,FP FMA),这个也要解释一下。我们知道,105可以写成 1.05×102 这样的形式,这种形式在计算机中称为浮点数。上面提到向量中,如果(x,y,z,value)中的一个或者多个都是浮点,就是浮点向量。而加乘融合,是指 A+B×C 这样的计算,当然,可以算加乘融合的,自然也可以用来算加减法和乘法:A=0就是乘法,C=1就是加减法。
浮点除法单元(FP DIV):算浮点除法的,也可以算一些常用函数例如开方、对数等。
其它:例如加密用的AES,字符串处理的Vect String,位查找的bit Scan(对一个二进制数据按照多种方法数0)
调度器(Scheduler)
有这么多不同的计算单元,CPU需要一个把不同的计算指令分配给对应计算单元的调度器。
不过呢,我们这个财务部比较特殊,分了几个小办公室,某几个同事在一个办公室里面,另外几个同事又在另一个办公室里面,而每次我们只能传一张小纸条到一个办公室。
在9900K里面,从图中可以看到,不同的计算单元在不同的端口(Port)下,就是类似的情况。
寄存器文件(Register File)
计算财务数据的时候,很多数据的计算是需要多步计算的,具体到每一步的计算,可能要分给不同的同事来算。如果每一步列一张小纸条,等某位同事算完第一个数,再抄到第二张小纸条给另外一位同事,这显然很慢很麻烦——直接列在一张小纸条上就好了嘛。
另外,我们有这么多同事,分配小纸条的同事每次传小纸条可以一次分配好多张——当然,前提是分给不同的同事。
因为可能一张纸条要算好几次,又有这么多纸条传来传去,因此为了不出错,我们需要标明这张小纸条给谁算,算完了,负责分配小纸条的同事根据下一步要算的,把标注的名字改一下给另外一位同事去算。
CPU中的寄存器也一样,一个数据可能需要不同的计算单元多次处理,又有那么多的计算单元分成了好几组。所以我们需要多个寄存器,这些寄存器的组合称之为寄存器文件。每个计算单元只能处理特定名称的寄存器里面的数据,因此调度器经常需要对寄存器进行分配、重命名、退出等操作。
更细节的电脑知识,我会在后续的文章中介绍,请保持关注。
如果你觉得这篇文章对你有帮助,请点赞支持让更多人看到。
如果看完觉得有问题的话,请评论留言指正。
参考
^Coffee Lake - Microarchitectures - Intel - WikiChip https://en.wikichip.org/wiki/intel/microarchitectures/coffee_lake
发布于 2019-05-15 20:11
计算机
中央处理器 (CPU)
电脑硬件

评论千万条,友善第一条
55 条评论
默认
最新

浮梁卖茶人
我挺好奇你以前是干啥的

对CPU研究这么透彻
2019-05-15
回复15

木头龙
作者

纯爱好……
2019-05-15
回复6

烟花易冷
木头龙
膜拜大佬

2022-01-17
回复赞

JZWSVIC
这要说的有点多,你这样会漏掉很多部分的
2019-05-15
回复3

木头龙
作者

科普文么,太长太原理性的估计也没几个人看……以后提及到再补充了……
2019-05-16
回复3

一世小雄
真是曲高和寡,那么好的文章就这么一点人看。。。
2020-08-13
回复1

凡性的提醒

挺硬核的,没兴趣爱好的人看着头大

2022-03-07
回复2

Richard Han
指令融合那里的示例有点问题:「比较a和b,不相等则跳转到x」,未进行macro-fusion前的汇编代码应该是「cmp a,b
; jne x;」进行macro-fusion后变为「cmpjne a,b,x;」,而不是「jne a,b,x;」
2019-12-14
回复1
木头龙
作者
谢指正
2019-12-14
回复赞
盛世行
这是一副要跟狼哥抢生意的样子啊
2019-05-16
回复1
盛世行
木头龙
文科生 一篇老狼一杯茶 边查边看 一个下午就过去了
2019-05-16
回复2
木头龙
作者
rouwanzi
@老狼
2019-09-18
回复1
展开其他 2 条回复
瞎扯家
新入行pc、服务器生产制造业,答主的回答全是专业硬货,让我一顿猛补,认真从头到尾看完了,非常好评
05-17
回复赞
kkkk
请教大佬个无关紧要的问题

,看到好多微架构图的配色都和文中的一样,这个是大家约定俗成的吗?
01-22
回复赞

木头龙
作者

不是,是因为大家都从相同的来源找图片。
01-22
回复赞

意想不到
大佬 我想问下,Invalidate Queues这个在cpu是否存在呢?还是说这个目前只是理论并没有实现这种东西
2021-08-09
回复赞

木头龙
作者

意想不到
这个是微结构层面的实现,一般来说没有具体公开的资料,某些论文会有提及和解释。
2021-08-09
回复赞

意想不到
木头龙
懂了 谢谢。。让我一顿好找
2021-08-09
回复赞
展开其他 2 条回复

执念
请教一下,AMD的CPU和酷睿比,单核性能和多核性能到底怎么看的呀
2020-07-22
回复赞

张云舞
一通会计操作下来我晕了
2019-12-15
回复赞

知乎用户9xGK50
评论里想从简单的部分开始了解可以去读下tomasulo相关的内容。ReOrder Buffer(ROB),Register Renaming(和RAT),Common Data Bus(CDB)是tomasulo算法的重要特征嘛~
要考期末的我太难了...
2019-12-14
回复赞

Dawei112
大佬快更新!
2019-10-04
回复赞

知乎用户mdWSLL
写得太好了,期待下一篇
2019-08-29
回复赞

lin
催更
2019-05-31
回复赞

李姚

支持答主。再长也看。
2019-05-31
回复赞

浪月
好复杂,这属于专于知识了。
2019-05-27
回复赞

杨广
还是不太理解pcie控制器直接集成到处理器片内是怎么个结构?处理器可以直接对话非内存设备吗?这些控制器上的设备不通过内存直接跟处理器通讯?感觉微机原理白学了
2019-05-17
回复赞

木头龙
作者

把CPU内核,和集成了PCIe控制器的物理CPU分开看待就是了。这些理论/原理文章中所说的CPU仅仅是指代内核。。
2020-04-20
回复赞

木头龙
作者
小老虎
并没有扔给pch,全在CPU里面了。
PCIe控制器在CPU内部,pch的只不过是个switch。
2020-04-20
回复赞
展开其他 1 条回复
番茄炖牛肉
Haswell之前的架构吧 ring bus 已经进化到mesh了
2019-05-16
回复赞
木头龙
作者
HEDT和至强才是Mesh,主流还是Ring
2019-05-16
回复1
yun瓜
奥利给
2019-05-16
回复赞
PC小白
接下来讲操作控制器,时序发生器,流水和指令集?
2019-05-15
回复赞
木头龙
作者
Akmak
item.m.jd.com/product/1
2019-05-16
回复5
PC小白
木头龙
总要讲的吧……不然不完整
2019-05-15
Pentium II & Pentium III架构/微架构/流水线 (7) - 微架构框图
一凡stkeke
于 2018-12-28 08:47:58 发布
306
收藏
分类专栏: Intel微架构 文章标签: Pentium II Pentium III 性能优化 微架构 MMX
版权

Intel微架构专栏收录该内容
101 篇文章27 订阅
订阅专栏
Pentium II的微架构
下面这幅图来自于CSE 3322-001 (Fall 1999),在Mindshare的Pentium Pro体系结构一书中也有类似的图。
注意:Pentium II处理器中应该已经全系标配MMX技术了,但是在下面这幅图中并没有体现;在Pentium III的微架构中可以看到MMX指令的执行单元。

PentiumIII的微架构
下面这幅图来自于Google “Pentium III diagram”关键字搜索结果。
