从洗衣机的故事中理解计算机的工作原理:优化指令执行速度

2023-09-22 14:07:22 浏览数 (1)

指令流水线

洗衣机例子

我们可以并行处理进一步提高效率。

来看下面这个例子:

绿色的是洗衣机,紫色的是烘干机。

洗一套衣服然后烘干需要的时间是一小时,以此类推烘干完成在洗下一批衣服

我们换个思路和之前一样先把第一批衣服先放进洗衣机,洗完之后放到烘干机中。此时的洗衣机是空闲的,因此我们可以再放一批衣服到洗衣机中,当第一批烘干之后第二批的衣服洗完了也开始烘干了,此时第三批衣服扔到洗衣机中。通过充分利用空闲间隔并行处理可提高效率

处理器也可以按照这样的设计进行处理程序。

CPU能否像洗衣机那样并行处理

CPU执行一条指令也是类似的操作:取址-》解码-》执行,不断重复。此时一条指令需要三个时钟周期才能完成(取址,解码,执行)。

并且这三个步骤用的都是CPU的不同的部分,取址是指令地址寄存器和指令寄存器做的,解码是控制单元做的,执行是ALU做的。 和洗衣机的例子很像,洗衣机和烘干机可以充分利用间隔,CPU也同样可以利用其他部件间隔去执行操作

也即执行一个指令的时候同时去解码下一个指令操作,读取下下一个指令:

经过并行处理优化后的CPU现在一个时钟周期就可以执行一条指令了。而不是之前必须得等取址和解码完成后在进行执行操作:

指令依赖问题-乱序执行

就像洗衣机的烘干机一样,在烘干机之前必须要有洗好的衣服才能进行接下来的烘干操作,当步调不同步时就会发生错误,而且烘干机依赖洗衣机洗出的衣服这个依赖关系很明显;CPU也是一样的,比如当前正在读取某个数据(解码阶段读取内存或者寄存器的值),而此时的执行阶段却在修改这个值(ALU此时正在修改值),也就是说拿到的是旧数据。

因此流水线处理器,要先弄清楚数据依赖性,必要时停止流水线,避免出现问题。

高端的CPU处理器会更近一步,动态排序有依赖关系的指令,最小化流水线的停工时间,这叫做“乱序执行”

有条件跳转指令流-推测执行,分支预测

简单的流水线处理器看到JUMP指令会停一会儿需要等待条件值计算出来判断条件是否满足,在继续执行流水线。

推测执行

因为这部分也有等待,所以高端处理器会使用一些技巧优化:

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

如果CPU猜对了,由于流水线已经塞满了正确的指令因此可以马上运行;如果猜错了,就要清空流水线。

分支预测

CPU厂商开发了复杂的方法来尽可能减少情况流水线的次数,这叫“分支预测”,现在CPU正确率超过百分之九十。

添加相同电路让一个时钟周期可以处理多个指令

虽然流水线已经避免了某些部件空闲,但是仍有些区域可能还是空闲的,比如从内存取值这个指令的执行过程中alu就会没有事情做。所以一次性处理多条指令会更好****

随着“超标量处理器”的出现使得一个时钟周期可以完成多个指令:

  1. 一次性处理多条指令(取指令 解码)

无非就是在加几个一模一样的电路:比如两个ALU两个加法运算可以同时运行,不需要等第一个运行完了才运行第二个。这种方式简单粗暴

  1. 如果利用的是CPU不同的组件,那么可以同时执行

比如内存取指令就可以和ALU计算这两个执行阶段的操作同时运行

我们再优化一下:

在原先的电路中多加几个相同的电路执行**出现频次很高的指令,比如cpu中有四个或者八个完全相同的alu,可同时执行多个运算。如下图:

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

0 人点赞