- 超线程
先上定义吧,超线程是指 采用同一流水线,同一套数据寄存器,但是各个线程各自对应一套上下文状态寄存器(来对线程切换进行上下文切换),然后利用不同的交织粒度同时运行多个线程指令的设计。
因此,看起来超线程相比于传统单线程的区别:
a. 增加了一套上下文状态寄存器;
b. 在同一时刻,整个流水线上可能存在多个线程的指令任务;
c. 运行多线程的交织粒度不同,
粗粒度的就诸如基于一定时间窗或者一定指令数,或者基于某些事件,比如cache miss等进行线程切换;
细粒度就是时间窗较短,或者是在指令执行上是以单条指令为基准进行切换;
因此,超线程其实就是在分时复用流水线,来填补或者说利用cpu 流水的一些idle窗口来提升指令IPC。
这里面其实比较麻烦的地方在于交织粒度和策略的选择:
基于静态的策略,比如时间窗或者指令乒乓的方式在实现上会比较简单,但是因为静态,所以依旧存在无法完全利用流水的问题;
基于动态的策略,比如线程A因为cache miss之后去外部取值,或者是某个指令的执行时间很长,此时将流水线完全授予B线程,直到A线程完成,或者B线程也出现了类似的场景,这种动态的策略会更好的利用流水线的能力,但是实现上会更加复杂一点。
- 同时多线程(SMT)
同时多线程是指,在取指令级上进行线程切换,同时,在指令进入保留站后再发射阶段,允许同时发射多个线程的指令,而不是像传统的超线程,发射阶段只能发射某一线程的指令。
SMT实现了真正意义上的并行。
- 资源
在硬件设计中不存在完全正向受益的设计, 那么超线程上对设计上有什么effort呢?
- 寄存器资源的开销
正如前面描述的,需要一套额外的上下文状态寄存器;
- 硬件资源开销
这里的硬件资源包含了流水线各个阶段的资源,比如fetch queue,rs queue, BP queue等等,因此在多线程中,对流水线各个阶段资源的使用包含两种,一种是增加资源的数目变为两倍,一种就是分时复用,前者很容易理解,就是通过增加资源来不影响线程的执行,后者是说对于现有的资源应该采用什么样的策略和方式能达到最好的利用率,比如二分,动态调整,预测调整等等。
这些都会带来额外的资源消耗。
- 指令级并行和线程级并行
指令级并行是指,利用流水线和多发射技术实现单个线程内部多个指令可以并行执行(多发射);
线程级并行是指,利用超线程技术实现了多个线程的指令流级别的并行;
- 超线程一定是好的么?
并不是,超线程并不是任何时候都可以提升性能,比如同一个流水线上多个线程都由于访存或者RAW等引起流水stall,这种场景下就没办法获得超线程带来的受益了。