本文已参与「新人创作礼」活动,一起开启掘金创作之路。
提升CPU性能的黑科技
多发射与超标量
现在我们的CPU仍然只能在一个时钟周期内执行一条指令。如下图
如何让CPU一个时钟周期内执行多条指令?(如何让上图变成下图)
其实我们可以模仿乱序执行,将取指令和指令译码的电路增加,这样我们可以一次性从内存里取出多条指令,分发给多个指令译码器,然后交给不同的ALU去处理,这样在同一时钟周期里,就可以实现多条指令并行。这样的设计就是多发射和超标量。
多发射:同一时间会把多条指令发射到后序的处理流水线中
超标量:有很多条流水线,而不是一条流水线
超线程
之前我们为了提升CPU的性能,都是想着在同一个时钟周期内,增加执行指令的数量来达到目的。本质上都是一种指令级并行(IPL)的技术方案。
我们可以再往宏观了看,是否可以通过控制线程来提升CPU的性能?就是我们要说的超线程技术。
首先我们要区别的是,多个物理CPU核心运行不同的程序或者单个CPU核心切换运行不同的程序,它们本质上,在同一时间点,一个CPU核心只能运行一个线程的指令。所以它们并没有做到真正的指令并行。
与上述不同的是,超线程,是线程A的指令,在流水线里“停顿”的时候,把资源给到线程B,去执行线程B。(线程A和B里边的指令没有相互依赖)这样就实现了线程A和B同时运行!(这里虽然线程A停顿了,但它本质上是在运行着的!)
不过要实现超线程,我们要在CPU核心增加很多电路,会有双份的PC寄存器、指令寄存器、条件码寄存器。但是,无论是指令译码器还是ALU一个CPU核心仍然只有一个。
单指令多数据流SIMD
如果我们想让一个数组里的值,分别都加一。我们可以通过循环来一个一个的加一。
这种通过循环来一个一个的处理,就是单指令多数据。如果有一个多核CPU,他同时处理多个指令,就是多指令多数据。
而单指令多数据流,是一个指令执行,从内存读取数据时,一次性读取多个数据。多个数据同时进行计算。(这些数据没有相互依赖)对于存在大量的数据并行的计算,我们用单指令多数据就可以大大增加CPU运算能力,通常用在图片、视频、音频的处理。