1. 超线程
流水线、分支预测以及乱序执行,以及超标量和超长指令字,本质上都是通过同一时间执行两条指令来提升 CPU 的吞吐率。
然而,更深的流水线意味着同时在流水线里面的指令就多,相互的依赖关系就多。
超线程(Hyper-Threading)一般称为同时多线程(Simultaneous Multi-Threading)。超线程的 CPU 是把一个物理层面的 CPU 核心,“伪装”成两个逻辑层面的 CPU 核心。。这个 CPU,会在硬件层面增加很多电路,使得我们可以在一个 CPU 核心内部,维护两个不同线程的指令的状态信息。
在一个物理 CPU 核心内部,会有双份的 PC 寄存器、指令寄存器乃至条件码寄存器。这样,这个 CPU 核心就可以维护两条并行的指令的状态。在外面看起来,似乎有两个逻辑层面的 CPU 在同时运行。
对于指令译码器、ALU,超线程 CPU 只有一份。超线程并不是真的同时运行两条指令,否则就成了物理多核了。
超线程的目的:当一个线程 A 的指令在流水线里停顿的时候,让另外一个线程去执行指令。因为这个时候,CPU 的译码器和 ALU 就空出来了,另外一个线程 B 就可以做自己需要的事情。这个线程 B 和 A 指令之间没有依赖关系。
超线程的使用场景:由于并没有增加真的功能单元,超线程只在特定的应用场景下效果较好。一般是在那些各个线程“等待”时间比较长的应用场景下。比如,我们需要应对很多请求的数据库应用,就很适合使用超线程。各个指令都要等待访问内存数据,但是并不需要做太多计算。
2. SIMD
SIMD(Single Instruction Multiple Data)在获取数据和执行指令的时候,都做到了并行。
在从内存里面读取数据的时候,SIMD 是一次性读取多个数据。比如 Intel 的 SSE 指令集,在 CPU 里面添上了 8 个 128 bits 的寄存器。一个寄存器可以一次性加载 4 个整数。
在指令执行的层面,SIMD 也可以是并行。4 个整数相加 1,彼此之间没有依赖,也就没有冒险问题需要处理。只要 CPU 里有足够多的功能单元,能够同时进行这些计算,这个加法就是 4 路同时并行的,自然也省下了时间。
此文章为 2 月 day1学习笔记,内容来源于 极客时间《深入浅出计算机组成原理》。