微软同步多线程技术

基于NetBurst架构的超线程:OOOE+SMT

基于安腾架构的超线程技术:IOE+CMT

基于Atom架构的超线程技术:IOE+SMT

基于Nehalem架构的超线程:OOOE+SMT SMT(同步多线程)其实是一个专有名词,是一种技术的名称,不仅Nehalem采用,奔腾4等很多商用处理器也采用。正确的情况应该是,Nehalem的HT技术和奔腾4的HT技术一样,属于SMT技术。

其实很多英特尔处理器都在使用超线程技术,除了奔腾4(NetBurst架构)和Core i7(Nehalem架构),安腾2(Mondecito)和Atom(Silverthorne),但是他们搭载的HT技术不属于SMT!

在整理英特尔的各种HT超线程技术之前,我们先来回顾一下多线程技术的分类。多线程多线程是一种在单个处理核中同时运行多个工作线程的技术,不同于CMP(芯片多处理),通过集成多个处理核来提高系统的处理能力,这是现在常见的多核技术。主流处理器都采用CMP技术。

但是CMP技术大规模增加了相应的电路,增加了成本。MT(多线程)技术不是这样的。它只需要增加几行(通常是2%左右)就可以提高处理器的整体处理能力,很容易提高相关应用的性能。

多线程起源于一个叫做ILP(指令级并行)的想法,可以追溯到20世纪90年代。这个想法产生了一个术语叫做吞吐量计算,用来提高并行计算的性能,比如在线事务。吞吐量计算的两种主要方式是多重处理和多线程。

一开始,为了开发ILP,在过去的几十年里使用了超标量(同时有多个执行器)、乱序执行(允许没有数据相关性的指令同时运行)、动态分支预测、VLIW(超长指令字)等等技术(前三种可以在经典的奔腾Pro架构上看到,最后一种是安腾Pro)。但是超标量大大增加了设计的复杂度,同时指令间的数据与控制相关,可开发的ILP有限,以及其他一些因素使得经典超标量处理器很难进一步提高处理器性能。

而且从应用的角度来看,在线事务处理OLTP、决策支持系统DSS、Web services等应用的特点是线程级并行性丰富,ILP缺乏,这就促进了多处理和多线程的出现。

多线程多线程技术的思想有点类似于早期的分时计算系统。当执行多个线程的处理器由于高速缓存未命中或分支预测失败而停止时,它可以切换到另一个线程来执行。主流多线程有三种形式,区别在于线程之间共享的资源和线程切换的机制:

其中,CMT和FMT都是单个执行单元下的技术,不同的线程在指令层面并不是真正的“并行”,而SMT有多个执行单元,可以同时执行多条指令,所以前两者有时会被归为TMT(时态多线程)以区别于SMT。

首先,介绍了CMT粗粒度多线程,因为它是最简单的多线程技术。当单个执行线程遇到长时间延迟(如缓存未命中)时,它会切换线程,直到原始线程等待的操作完成。粗糙多线程有时被称为块多线程以阻止多线程,或者被称为协作多线程以配合多线程。

因为CMT很简单,所以许多处理器都实现了它,除了下面列出的以外,许多嵌入式微控制器也实现了它:

1999 IBM RS64 III「Pulsar」(单核/双线程)

2005富士通SPARC64 VI「奥林巴斯-C-C」(双核心/四线程)

2006英特尔安腾2「Montecito」(双核/4线程)

2007英特尔安腾2「Montvale」(双核/4线程)

英特尔的安腾2在FMT令人印象深刻——细粒度多线程可以在每个时钟周期内随时切换多个线程,以追求最大的输出能力——当然,随时切换也是代价高昂的,这延长了每个执行线程的平均执行时间。细粒度多线程有时被称为交错多线程或预空多线程抢占式多线程。

与CMT相比,FMT更复杂,所以没有那么多相应的处理器,例如:

2005 sun ultrasparc t1“尼亚加拉”(8核/32线程)

2007年Sun Ultrasparc T2“尼亚加拉2”(8核/64线程)

事实上,UltraSPARC T2还使用了其他MT技术,这使得其多线程能力是T1的两倍。仔细看看上图。T2用的是什么MT技术(注意第一段CMT指的是芯片多线程,不是粗粒度多线程)?

虽然早在NV G40和ATI R520上,FMT技术在CPU上的使用还没有开始,但FMT细粒度多线程技术已经开始在GPU上应用。为了隐藏缓存未命中的高内存延迟,GPU中的执行单元不断在工作线程之间切换,以提高整体处理能力。但是,我不知道G40的FMT到底实现了多少线程。根据资料应该在100左右。

如前所述,SMT实际上不同于其他两种多线程技术——这两种技术被称为TMT时间多线程。SMT-同步多线程有多个执行单元,可以同时运行多条指令,所以被称为“同步多线程”!SMT起源于充分挖掘超标量体系结构处理器的潜力——超标量意味着可以同时执行多个不同的指令。所以SMT的灵活性和资源利用率最大,但实现起来也是最复杂的(当然和多核结构相比是小菜一碟)。

2002英特尔奔腾4至强「Prestonia」(单核/双线程)

2007年Sun Ultrasparc T2“尼亚加拉2”(8核/64线程)

2008英特尔酷睿i7“Nehalem”(4核/8线程)

这里我们又看到了UltraSPARC T2,因为它同时采用了FMT和SMT技术:因为UltraSPARC T2有两个执行单元,每个线程组一个,线程组中执行四个线程为T1。现代GPU也采用了类似的混合设计:

不同的流处理器可以同时执行不同的线程。当然,同一个流处理器也可以在不同的线程之间切换。介绍完各种MT多线程技术,我们再来看看Intel的超线程技术。如前所述,英特尔采用超线程技术的CPU包括奔腾4(NetBurst架构)、酷睿i7(Nehalem架构)、安腾2(Mondecito)和凌动(Silverthorne)。我们已经知道,采用超线程技术的奔腾4/奔腾4至强(并非所有P4都有超线程技术)采用SMT架构,而酷睿i7则是改进版本。我们来看看安腾2:安腾2 Montecito采用双核设计,每核两个线程;安腾2 Montecito的超线程技术采用CMT架构;可以看出,安腾2的超线程技术不同于奔腾4的SMT,它实际上是CMT粗粒度多线程技术。这是因为安腾2是有序架构,SMT的初衷是充分挤压OOOE(乱序执行)的能力,所以有序架构的安腾2并没有采用SMT。因为创建多线程的成本太高。

那么,有序架构的处理器不能实现SMT吗?不,英特尔的Atom就是一个典型的例子:除了Atom,IBM的monster Power6(起始频率为4.7GHz)也采用了基于有序架构的SMT技术(Power5的SMT是基于无序的):IBM Power 6处理器,双核,每核两个线程;Power6:有序+SMT,而Power5是无序+SMT。