1.往复执行与流水线

通过将单个指令分割,指令的吞吐量不变,然而时钟周期可以大大缩小,名称来源于汽车工厂,本质思想是别让他们闲着。

risc架构的cpu相对而言更容易实现流水线,因为他们的指令很少很精简,这使得流水线的硬件设计很简单,也能降低功耗和体积

Untitled

Untitled

为了对抗流水线带来的各种依赖冲突,除了分支预测,乱序执行以外,硬件上还添加了旁路写回方案

Untitled

图 5 – 更详细的流水线微体系结构。

2超级流水线

无脑堆流水线深度,更精细的分割指令,来达到更高的时钟频率,Alpha架构师很喜欢这个想法,这也是为什么早期的Alpha能够拥有如此高的频率

Untitled

图 6 – 超流水线处理器的指令流。

x86的cpu能够拥有比risc架构的cpu更深的流水线,因为它们的指令较为繁杂,相对来说能够分割的更加精细

3多任务超标量

在一个cpu中添加多个指令执行单元,每个时钟周期执行数个指令以增加指令吞吐量,与多核不同,这本质上仍然是单核的处理器,

Untitled

图 7 – 超标量微架构。

这张简略的图省略了很多旁路写回,主要强调超标量的实现方式,每个功能单元(比如整形计算,浮点计算,内存取值等)都可以拥有独立的管道和流水线深度,通过添加修改功能管道,我们可以让cpu拥有不同方面的高性能,比如我们可以添加很多个整形管道,来让这个cpu拥有出色的整数处理能力(当然我也知道处理能力不仅取决于这方面,但是你应该能懂我意思的对吧?)

Untitled

图 8 – 超标量处理器的指令流。

人们总希望多榨出一点性能来,所以超标量和超流水线的结合是自然而当然的

Untitled

图 9 – 超流水线超标量处理器的指令流。

4.单指令并行-VLIW

当我们使用超标量技术的时候,如果不考虑向后兼容的问题,把多个指令合并成一个指令解码并超标量运行能够减小指令依赖关系逻辑设计的需求,来使cpu更小,功耗更低,这种设计的指令实质上是一系列的小指令,因此通常会很长,有时会有128位甚至更多,因此得名VLIW-very long instruction word,即非常长的指令字

Untitled

图 10 – VLIW 处理器的指令流。

除了简化了调度逻辑之外,VLIW处理器很像超标量处理器,不过随之而来的问题就是,并且VLIW一般不检查指令之间的依赖关系,指令一旦发出就需要过很久才能停止,这在某种程度上加重了冲突和冒险带来的损失,也给编译器加重了一点负担

5.指令调度,寄存器重命名和乱序执行

指令调度指的是在执行之前,编译器和硬件静态的调整指令的顺序来得到最好的并行性从而提高性能的方式,寄存器重命名也是静态的提高性能的方式,具体来说就是暂时不管固定的寄存器定义,如果此时寄存器空闲,则直接使用,这样就不需要重复进行内存读取,乱序执行和指令调度的区别就是,乱序执行是硬件在程序执行的过程中动态进行的,通过判断当前指令依赖关系动态调整指令的运行顺序,来获得更好的性能

不过和OOO(乱序执行)逻辑带来的性能提升相比,随之而来的功耗提升在一些功耗敏感的设备上不太能令人接受,因此今天几乎所有的高性能处理器都是无序设计,而很多低功耗低性能的处理器例如ARM-Cortex-A7等都是顺序设计的

6.brain glaxy头脑风暴还是无脑提频率?

相信都能看出,乱序执行的方式(Brainiac)比起顺序执行的方式实现起来要麻烦不少,而且听起来也很聪明,而且功耗也不低,那么人们自然而然就开始了这样的争论,花费这么大的力气实现聪明的乱序执行到底有没有必要?作为这种聪明方式的反面,无脑叠时钟频率的方式(被称为speed-demons)的思路逐渐被许多处理器供应商所青睐,

Untitled

图 11 – Brainiac vs Spped-Demons

顺带一提,由于x86本身设计问题,实际上英特尔和amd的cpu也没法完全偏向Speed-Demons,怎么样都得上点Brainiac

7.功耗墙和并行墙

时代逐渐发展,处理器性能逐渐提高,摩尔定律开始逐渐失效,处理器供应商在提高处理器性能的路上碰到了两堵墙(实际上不止两堵),第一是功耗墙(The Power Wall):

沉迷于Speed-Demons的处理器供应商逐渐发现,功耗的上升似乎比处理器主频上升的速度高出两个次方,因为主频提升不仅意味着开关频率的增加,还意味着电压的增加(为了更强劲快速的驱动信号通过电路和元器件充电),这额外的电压提升就带来了两个次方的功耗提升,除此之外,温度的逐渐上升还会导致漏电流的上升,于是情况进一步恶化,随着现代处理器主频达到了瓶颈,这种限制死死卡住了处理器在这方面的发展

Untitled

图12 –卸下前风扇的现代台式机处理器的散热器

因此,纯粹追求时钟速度不是最好的策略,对于功耗敏感性设备来说更是如此,那么纯粹的Brainiac就是更好的选择吗?

可悲的是没有,供应商在这方面碰到了第二堵墙——并行墙(THE ILP Wall)

简单的来说就是供应商发现为了帮助处理器展现更好的并行性所消耗的算力基本上已经快赶上做这些事情为cpu节省的算力了,而且这种复杂的设计还使得芯片无法做的很小,功耗发热也随之提升,并且更新迭代和提高时钟主频也更加的困难,于是扑街了。

8.线程-SMT、超线程和多核

超标量加乱序执行并没有带来预期中那么高的性能提升,于是人们不得不想其他方法来提高程序的并行性,幸运的是,现代的程序基本上会有多线程,并且同时会有多个程序在运行,因此在流水线卡住的情况下将其他线程或者程序的指令转移来执行似乎在整体上能很好地提高系统的性能,这种技术叫做SMT,

Untitled

图 14 – SMT 处理器的指令流。

看起来是否很美妙?但是还是不够,因为这没有解决之前发现的本质问题:冲突和冒险

实际生产环境中程序的运行状况是复杂而难以预测和适应的,强行适配只会像乱序执行一样得不偿失,而且还会损失很多工程师宝贵的秀发,而且简单分析一下就不难看出,虽然这种技术使得单核的SMTCPU能像多核处理器一样工作,但他实际上还是单核的,这个事实无法改变,这种事实就使得SMT处理器的性能十分玄学,有时候它简直像一个真正的多核处理器一样快,有的时候却比单核的还要糟糕。

P.S.还有很多没有详细说明的,看原文

Modern Microprocessors - A 90-Minute Guide!