CPU的价值

转载请联系授权

01

指令流水线

一种提升性能的方法叫 "指令流水线",想象下你要洗一整个酒店的床单,但只有 1 个洗衣机, 1 个干燥机。

选择1:按顺序来,放洗衣机等 30 分钟洗完。然后拿出湿床单,放进干燥机等 30 分钟烘干,这样1小时洗一批,另外一说:如果你有 30 分钟就能烘干的干燥机,请留言告诉我是什么牌子,我的至少要 90 分钟。

选择2:即使有这样的神奇干燥机, 我们可以用"并行处理"进一步提高效率,就像之前,先放一批床单到洗衣机,等 30 分钟洗完,然后把湿床单放进干燥机。但这次,与其干等 30 分钟烘干,可以放另一批进洗衣机,让两台机器同时工作。30 分钟后,一批床单完成, 另一批完成一半,另一批准备开始,效率x2!

处理器也可以这样设计,前面,我们演示了 CPU 按序处理,取指 → 解码 → 执行, 不断重复,这种设计,三个时钟周期执行 1 条指令。但因为每个阶段用的是 CPU 的不同部分,意味着可以并行处理!

"执行"一个指令时,同时"解码"下一个指令,"读取"下下个指令,不同任务重叠进行,同时用上 CPU 里所有部分。这样的流水线 每个时钟周期执行1个指令吞吐量 x 3。

和缓存一样,这也会带来一些问题。

第一个问题是 指令之间的依赖关系

举个例子,你在读某个数据而正在执行的指令会改这个数据,也就是说拿的是旧数据。因此流水线处理器,要先弄清数据依赖性,必要时停止流水线,避免出问题。

高端 CPU,比如笔记本和手机里那种,会更进一步,动态排序 有依赖关系的指令。最小化流水线的停工时间,这叫 "乱序执行"。

和你猜的一样,这种电路非常复杂,但因为非常高效,几乎所有现代处理器都有流水线。

第二个问题是 "条件跳转"。

比如上节的 JUMP NEGATIVE。这些指令会改变程序的执行流。简单的流水线处理器,看到 JUMP 指令会停一会儿等待条件值确定下来。一旦 JUMP 的结果出了,处理器就继续流水线。因为空等会造成延迟,所以高端处理器会用一些技巧。

可以把 JUMP 想成是 "岔路口",高端 CPU 会猜哪条路的可能性大一些,然后提前把指令放进流水线,这叫 "推测执行"。

当 JUMP 的结果出了,如果 CPU 猜对了,流水线已经塞满正确指令,可以马上运行。如果 CPU 猜错了,就要清空流水线,就像走错路掉头。

为了尽可能减少清空流水线的次数,CPU 厂商开发了复杂的方法,来猜测哪条分支更有可能,叫"分支预测"

现代 CPU 的正确率超过 90%,理想情况下,流水线一个时钟周期完成 1 个指令。然后"超标量处理器"出现了,一个时钟周期完成多个指令。

即便有流水线设计,在指令执行阶段,处理器里有些区域还是可能会空闲。比如,执行一个 "从内存取值" 指令期间,ALU 会闲置。

所以一次性处理多条指令(取指令+解码) 会更好。如果多条指令要 ALU 的不同部分,就多条同时执行,我们可以再进一步,加多几个相同的电路执行出现频次很高的指令。

举例,很多 CPU 有四个, 八个甚至更多 完全相同的ALU,可以同时执行多个数学运算。

好了,目前说过的方法,都是优化 1 个指令流的吞吐量。

02

多核处理器

另一个提升性能的方法是 同时运行多个指令流,用多核处理器。

你应该听过双核或四核处理器,意思是一个 CPU 芯片里,有多个独立处理单元,很像是有多个独立 CPU。但因为它们整合紧密,可以共享一些资源。比如缓存,使得多核可以合作运算。

但多核不够时,可以用多个 CPU。

高端计算机,比如现在给你传视频的 Youtube 服务器,需要更多马力,让上百人能同时流畅观看。2个或4个CPU是最常见的,但有时人们有更高的性能要求,所以造了超级计算机

如果要做怪兽级运算,比如模拟宇宙形成,你需要强大的计算能力,给普通台式机加几个 CPU 没什么用,你需要很多处理器!不…不…还要更多,更多。截止至这篇文章发布,世上最快的计算机在中国无锡的国家超算中心,神威·太湖之光有 40960 个CPU,每个 CPU 有 256 个核心,总共超过1千万个核心,每个核心的频率是 1.45GHz,每秒可以进行 9.3 亿亿次浮点数运算,也叫每秒浮点运算次数 (FLOPS)。

相信我 这个速度很可怕,这些年处理器不但大大提高了速度,而且也变得更复杂,用各种技巧,榨干每个时钟周期做尽可能多运算。我们的任务是利用这些运算能力,做又酷又实用的事。

原文发布于微信公众号 - 程序员成长充电站(qianpangzi8)

原文发表时间:2019-05-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券