Files
book/docs/cs/09/index.md
2023-11-14 00:04:01 +08:00

92 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 高级 CPU 设计
<author name="虞嘉乐" title="21 计算机 4 班 "/>
:::tip
[前去观看第九集](https://bilibili.com/BV1EW411u7th?p=9)
:::
## 最初的提速方式
随着时代的发展,人类对计算机速度的要求越来越高,这个时候我们就需要给 CPU 提提速。
在早期,人们并没有如今这么好用的提速方法,他们选择减少晶体管的切换时间(**晶体管组成了逻辑门、ALU 以及前几章提到的其他组件**)。
当然,绝大多数的情况下,越新的东西越好,让 CPU 提速的方法也是一样的。如今使用的新技术,不仅能让简单的指令更快速的执行,也能让它进行更复杂的计算。
## 如何高效的实施指令
如果我们用自己搭建的那个 CPU 来算一道 16/4会占用大量的时钟周期十分的低效。因为我们搭建的 CPU 并没有除法相关的指令,它计算 16/4会用 16 一直减 4直至 0 或负数。所以现代 CPU 直接在硬件上设计了除法,可以直接给 ALU 除法指令。
再比如,现代的 CPU 会有专门的电路来处理图形操作、解码压缩视频、加密文档等等,如果这些也用标准操作来实现,那会用非常多的时钟周期。
(小科普:某些 CPU 有 MMX、3DNOW、SSE它们有额外的电路能够做更加复杂的操作用于游戏和加密等场景
随着指令的不断增加,人们也越来越习惯了这些方便的指令,这也让 CPU 中的指令越来越多。从最初的 46 条到如今的上千条指令CPU 也越来越复杂,越来越厉害了。
## 为何要快速的把数据传递给 CPU
就像你再怎么能吃一张嘴的容量也限制了每次吃下的量。RAM 就是这张嘴,它是 CPU 之外的独立组件 (_当然你的嘴是你身上的_) ,这也就意味着数据要通过一根线互相传递。这根线叫总线,它可能只有几厘米长,而且电信号传输速度接近光速,但是 CPU 每秒可以处理上亿条指令,而 RAM 要需要时间找地址、取数据、配置、输出数据,这就导致了 CPU 必须等待 RAM 处理完后将数据输出,而这可能会是多个时钟周期的时间。
## 如何将数据快速传到 CPU
### 只要多存点数据在自己这里,不就比之前快了吗 —— 缓存
解决这种延迟的方法之一是给 CPU 加点 RAM——叫"**缓存**"。
因为 CPU 里空间不大,所以缓存一般只有 KB 或者 MB而 RAM 都是 GB 起步。自此CPU 从 RAM 拿数据时,RAN 可以不用只传一个,可以传一批了,虽然花的时间久了点,但数据可以存在缓存。
因为数据是一个接着一个处理的,这就导致数据存在缓存里十分好用,不用再去 RAM 里拿数据。打个比方,就好像是两个人进行大胃王比赛,有缓存的就像有人直接拿一大堆的菜依次的摆在你的桌前,吃完直接换下一道菜,不用让服务员去拿,而没有缓存的需要在吃完后等待服务员拿出下一道菜。
说完了处理方式,那就得提一嘴这种方式的速度。因为缓存里 CPU 很近,所以只要用一个时钟周期 CPU 就可以拿到数据,咱们的孤寡老 CPU 终于不用空等。
(小贴士:如果想要的数据已经在缓存里了,那么这部分的数据叫"**缓存命中**",不在就叫"**缓存未命中**")
#### 脏位
缓存除了可以让数据更快的被 CPU 使用外,还可以当一个临时空间。举个栗子,就像你设定了今年想要达成的目标并写在了记事本上。
与之前的相同,数据不是直接存在 RAM 中,而是在缓存里,这样不仅存起来快,而且改起来也快(就好像你改了又改的择偶标准 —— 从找个漂亮贤惠的老婆,到是个女的都行,再到是个人就行(欸嘿))
由于缓存和 RAM 内的数据不一样了,这种不一致必须记录下来,之后需要同步,因此缓存内的每块空间都有一个特殊标记,那就是这一段的绝对主角 —— 脏位。一般来讲,计算机同步数据是在 CPU 内缓存的数据满了,而 CPU 有需要空间来储存,这个时候就需要清理缓存内的空间了。在清理缓存的时候,会先检查脏位,如果是"脏"的,那会在加载新数据之前把数据写回 RAM。
### 左右互博之术 —— 指令流水线
第 7 章中讲到CPU 按"取址 —— 解码 —— 执行"的顺序处理,这种设计使 CPU 需要三个时钟周期才能执行一条指令,但是每一个步骤都是用到 CPU 不同的位置,那我们不选择让 CPU 学学"左右互搏之术"呢?
在 CPU 执行指令时,同时开始解码下一条指令,并且取下下条指令的地址,这样的流水线,可以每个时钟周期执行一个指令,这样,效率就是之前的三倍啦!
![](%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20221018213210.png)
#### 问题之一:指令之间的依赖关系
什么指令之间的依赖性呢?举个栗子,你正在执行的指令会改变你正在读取的那个指令的数据。
所以,流水线处理器必须先弄清楚指令之间的依赖性,必要时停止流水线,以防出现问题。而高端的 CPU 会动态的排序有依赖关系的指令,最小化的停止时间,这叫"**乱序执行**"。这种电路非常复杂,但它实在是太高效了,几乎所有现代处理器都有流水线。
#### 问题之二:条件跳转
跳转类型的指令会改变程序的执行流,低级的流水线处理器,看到 jump 指令会停一会等待条件值定下,但这会造成一定的延迟。
而高端的流水线处理器就不一样了,它们会猜,对了就直接使用,错了就当场清空,这种方法叫"**分支预测**"。当让,不必因为"猜"这个字而感到不信任,因为高端的流水线处理器的成功率超过了 90%,除非你是那种喝凉水都能塞牙的倒霉孩子,不然几乎不会出问题。
#### 超标量处理器
它的存在会让流水线彻底进入 007 的时代,它不会给流水线的任意一个工作区域一点休息的时间,这使流水线的工作效率大大提升,一个时钟周期可以完成多个指令了。
### 三个臭皮匠,抵个诸葛亮 —— 多核处理器
多核处理器,意思是一个 CPU 芯片里,有多个独立处理单元,像多个独立 CPU但可以共享一些资源合作运算。
![](%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20221018221548.png)
## 中国的超级计算机 —— 神威·太湖之光
如果多核处理器无法满足的时候,就可以加几个 CPU。而为了满足一些怪物级的运算就需要超级计算机它们需要更多的 CPU。神威·太湖之光就是一台这样的超级计算机它有 40960 个 CPU每个 CPU 高达 256 个核心,每秒可以进行 9.3 亿亿次浮点数运算,是当之无愧的怪物级的超级计算机,在世界超级计算机排行榜上也有其大名。
![](%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20221018221445.png)
## 接下来
下一章,我们会讲到编程。