美文网首页
9 | 高级CPU 设计

9 | 高级CPU 设计

作者: 遗忘的残酷 | 来源:发表于2020-05-21 02:11 被阅读0次

早期计算机提速的方式是 减少晶体管的切换时间。

晶体管组成了逻辑门,ALU 以及前几篇的其他组件,但这种提速方法最终会碰到瓶颈。

所以芯片厂商发明各种新技术来提升性能,不但让简单的指令运行的更快,也让它能进行更复杂的运算。

上次设计了除法程序,如16 /4 实际 16 -4 -4 -4 -4 直到遇到0 或负数才停下。

但这种方法要多个时钟周期,很低效。

所以现代 CPU 直接在硬件层面设计了除法,可以直接给ALU 除法指令。

这让ALU 更大也更复杂一些,但也更厉害。

复杂度 vs 速度 的平衡在计算机发展史上经常出现。

现代处理有专门电路来处理,图形操作、解码压缩视频、加密文档等等
要用标准操作来实现,要很多个时钟周期。

可能听过处理器有 MMX 3DNOW SSE ,他们有额外电路做更复杂的操作。

用于游戏和加密等场景。

指令不断增加,人们一旦习惯了它的便利就很难删掉,为了兼容旧的指令集,指令数数量越来越多。

Intel 4004 第一个集成CPU 有 46 条指令,足够做一台能用的计算机,现代计算机有上千条指令,有各种各样巧妙复杂的电路。

超高的时钟速度带来另一个问题

如何 快速传递数据给CPU ,就像有强大的蒸汽机,但无法快速加煤。

RAM 成了瓶颈 。

RAM 是CPU 之外的独立组件。

意味着数据要用线来传递,叫 “总线”。

image.png

总线可能只有几厘米。

电信号的传输接近光速,但CPU每秒可以处理上亿条指令,很小的延迟也会造成问题。

RAM 需要时间找地址,取数据,配置,输出数据。

一条 “从内存读数据” 的指令可能要多个时钟周期。

CPU 空等数据。

缓存

解决延迟的方法是 给CPU 加一点RAM - 叫 “缓存”。

image.png

处理器空间不大,所以缓存一般只有kb MB ,而RAM 都是GB 起步。

CPU 从RAM 拿数据时 RAM 不用传一个,可以传 一批。当处理器需要下一个交易额时候就直接从缓存取数

如计算餐馆每日应收,从地址100 取数,可以取一批,存在cache中


image.png

虽然花的时间久一点,但数据可以存在缓存里面。

这很实用,因为数据常常是一个个按顺序处理。

因为缓存里CPU 近 ,一个时钟周期就能给数据,CPU 不用空等。

比反复去RAM 拿数据块的多。

如果想要的数据已经存在缓存,叫 缓存命中。不在 叫 缓存未命中。

缓存也可以当临时空间,存一些中间值,适合长/复杂的运算。

继续餐馆的例子,假如计算完所有数据,想把结果存到地址150 ,数据不是直接存RAM 而是存入缓存,这样不但存起来快,如果接着计算取值叶快一些。

这样带来了一个有趣的问题,缓存和RAM 不一致了。

这种不一致要记录,之后要同步。

因此缓存的每个空间有个特殊标记-叫“脏 位(dirty bit)”

同步一般发生在当缓存满了 而CPU 又要缓存时候。

在清理缓存腾出空间之前,会先检查 “脏位”

如果是“脏 ” 的 在加载新的内容之前汇编数据写回 RAM 。

image.png
image.png

指令流水线

另一种提升性能的方法叫 指令流水线。

想象下你要洗整个酒店的床单,但只有一个洗衣机 一个 干燥机。
选择1 : 按顺序来,放洗衣机 等30 分钟洗完,再放进干燥机 30分钟烘干。 一
小时洗一批

选择2 :并行处理 进一步提高效率
在洗衣机洗完的同时,放入烘干机,再放一批到洗衣机同时洗。


image.png

处理器也可以这样设计。

之前演示了CPU 按序处理: fetch - decode - execute

取址- 解码- 执行 不断重复。

image.png

这种设计三个时钟周期执行一条指令,每个阶段用的CPU的不同部分,意味着可以并行处理。

“执行” 一个指令时,同时解码下一个指令。“读取” 下下个指令。

不同任务重叠进行,同时用上CPU 里所有的部分。

image.png

这样的流水线 每个时钟周期执行一个指令,吞吐量 x 3

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

  • 指令直接的 依赖关系
    你在读取某个数据,而正在执行的指令会改这个数据,也就是拿了的旧的数据了。

因此流水线处理器,要先弄清数据依赖性。

必要时停止流水线,避免出问题。

高端CPU 笔记本或手机,会更近一步 动态排序 有依赖关系的指令,最小化流水线的停工时间--叫 “ 乱序执行” 。

这种电路非常复杂。因为非常高效,几乎所有现代处理器都有流水线操作。

  • 条件跳转
    如之前的 jump negative ,这些会改变程序的执行流,简单的流水线处理器,看到jump 指令会停一会,等待条件值确定下来。一旦jump的结果出了 处理器就继续流水线。

一位空等,会造成延迟,所以高度处理器会用一些技巧,
可以吧jump 想成岔路口, 高度CPU 会猜那条路可能性大一些。然后提前把指令放进流水线,这个叫--“推测执行”
当JUMP 的结果出了,如果CPU 猜对了,流水线已经塞满正确的指令,可以马上运行。

如果猜错,就要清空流水线。就像走错路掉头。

为了尽可能减少清空流水线的次数,CPU 厂商开发了复杂的方法。

来猜测那条分支更有可能,叫分支预测

现代计算机正确率超过90%

理想情况下 流水线一个时钟周期完成一个指令。

然后“超标量处理器” 出现了,一个时钟周期,完成多个指令

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

所以,一次性处理多条指令,(取指令+解码) 会更好。

如果 多条指令 要CPU 的不同部分,就多条同时执行。

可以在进一步,加多个相同的电路,执行出行频次很高的指令,

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

image.png

以上的方法,都是优化1个指令流的吞吐量。

多核处理器

同时运行多个指令流--多核处理器。

双核 四核处理器。

image.png

一个CPU 芯片里面有多个独立处理单元。
很像有多个独立CPU ,但因为他们整合紧密 可以共享一些资源。
比如 缓存,使得多核可以合作运算。

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

高端计算机,比如现在的YouTube 服务器,需要更多马力,让上百人能同时流畅的观看。2个或者4个CPU 是常见的。

但有时候人们又更高的性能要求。所以造了超级计算机。

比如需要模拟宇宙的形成 需要强大的计算能力。

给普通台式机加几个CPU 没什么用。
需要很多处理器。

截止现在世界上对快的计算机在,中国无锡国家超算中心。

神威 太湖 有40960 个cpu 每个cpu 有256 核心。
总超过 1千万核心,每个核心频率 1.45Ghz

每秒可以进行 9.3亿次的浮点数运算。

每秒浮点数运算次数 flops,速度很可怕。

处理器速度更快,也变得更复杂,用各种技巧。

榨干 每个时钟周期 ,做更可能多运算。

我们的任务是利用这些运算能力,做有酷又使用的事。

编程就是为了这个,下次说。

相关文章

网友评论

      本文标题:9 | 高级CPU 设计

      本文链接:https://www.haomeiwen.com/subject/sllaohtx.html