同时多线程

同时多线程（Simultaneous multithreading，缩写SMT）也称同步多线程，是一种提高具有硬件多线程的超纯量CPU整体效率的技术。同时多线程允许多个独立的执行线程更好地利用现代处理器架构提供的资源。

## 细节

名称中的“多线程”有些暧昧，因为它不仅可以在一个CPU核心上同时执行多个线程，也可以是多个任务（哪怕不同分页表、不同任务状态段、不同分级保护域、不同等等）。尽管运行在同一个核心，它们彼此间完全分离。多线程在概念上类似抢占式多任务处理，但在现代的超标量处理器中以线程级执行来实现。

同时多线程（SMT）是多线程的两个主要实现之一，另一个是时间多线程（也称超线程）。在时间多线程中，同一时间只有一个线程的指令可以在任何指定流水线阶段中执行。在同时多线程中，多于一个线程的指令可以在任何指定的流水线阶段中同时执行。完成它在基本的处理器架构上没有太多改变：所需的主要添加是在一个周期中从多个线程获取指令的能力，以及一个更大的寄存器文件来保存来自多个线程的数据。并发线程的数量可以由芯片设计者决定。常见模式是每个CPU核心有两个并发线程，但一些处理器的每个核心支持最多八个并发线程。

因为该技术实则是一种效率解决方案，并且不可避免地增加了共享资源的冲突，所以测量或认同该解决方案的有效性可能有困难。但是，使用并行的本机和受管理的工作负载在传统130 nm到32 nm的Intel SMT（超执行绪）实现上测量SMT的能效发现，在45 nm和32 nm实现中，SMT极为节能，即使使用了inorder Atom处理器ASPLOS'11。在现代系统中，SMT有效使用非常少的额外动态功率达成并发。也就是说，即使在性能增益最小时，功率的节省也是可观的。

一些研究人员已经表明，额外的线程可用来主动为高速缓存等提供共享资源，从而提高另一个单线程的性能，并称这表明SMT不只是一个效率解决方案。SMT的其他用法还有提供冗余计算，以用于某种程度的错误检测和恢复。

但在大多数情况下，SMT是有关隐藏内存延迟、提高效率，以及增加每个所用硬件的计算吞吐量。

## 分类

在处理器设计中，有两种方法以较少的资源需求来增加芯片并行性：一种是尝试利用指令级并行性（ILP）的超标量技术；另一种是利用线程级并行性（TLP）的多线程方式。

超标量意味着在一个处理器芯片内以线程级并行性（TLP）同时执行多个线程的多个指令。有很多方法来支持芯片内的多个线程，即：

- 交叉多线程：交错发出不同线程的多个指令，也称为时间多线程。它可以进一步分为细粒度多线程与粗粒度多线程，这取决于交错发出的频率。细粒度多线程——例如在一个桶处理器——在每个周期后发出不同线程的指令，而粗粒度多线程仅在当前执行线程导致一些长延迟事件（如页错误等）时才切换到从另一线程的发出指令。粗粒度多线程对于线程之间较少的上下文切换是更常见的。例如，英特尔的处理器使用粗粒度多线程，而Sun的UltraSPARC T1使用细粒度多线程。对于每个内核只有一个流水线的处理器，交叉多线程是唯一可能的方法，因为它在每个周期最多发出一条指令。
- 同时多线程（SMT）：在一个周期中发出多个线程的多个指令。处理器必须为超标量。
- 芯片上多处理器（CMP或多核心处理器）：将两个或多个处理器集成到一个芯片，每个处理器独立地执行线程。
- 任何多线程/SMT/CMP的组合。

区分它们的关键因素是查看处理器在一个周期中可以发出多少条指令以及指令来自哪些线程。例如，Sun Microsystems的UltraSPARC T1（2005年11月14日发布之前称为“Niagara”）是一个多核处理器，它结合了细粒度多线程技术而不是同时多线程，因为每个核心一次只能发出一条指令。

## 历史上的实现

虽然多线程CPU自1950年代以来一直存在，但是同时多线程在1968年才首次由IBM作为ACS-360项目的一部分进行了研究。第一个采用SMT开发的主要商用微处理器是Alpha 21464（EV8）。该微处理器由DEC与加利福尼亚大学圣地亚哥分校的Dean Tullsen和华盛顿大学的Susan Eggers和Henry Levy合作开发。微处理器从未发布，因为微处理器的Alpha系列在HP收购Compaq前不久就已停产，Compaq又收购了DEC。Dean Tullsen的成果也被用于开发英特尔奔腾4微处理器的超线程技术（Hyper-threading，或称HTT）的版本，例如“Northwood”和“Prescott”。

## 现代的商用实现

英特尔奔腾4 HT是首个实现同时多线程的桌面处理器。英特尔将其称之为超线程（Hyper-threading），并提供了一个基本的双线程SMT引擎。英特尔宣称这比其他参数完全相同但非SMT的奔腾4速度提高30％。可观察到的性能改进非常取决于应用；但是，当超线程打开并同时运行两个需要处理器全力关注的程序时，它实际上似乎会稍慢一些。这是由于奔腾4的重放系统占用了宝贵的执行资源，增加了对资源（例如带宽、缓存、TLB、重排序缓冲区项）的争用，均衡两个程序之间的处理器资源增加了耗费的执行时间。奔腾4 Prescott核心获得了一个重放队列，减少了重放系统所需的执行时间。这足以完全克服性能下降。

最新的MIPS架构设计包括一个称为“MIPS MT”的SMT系统。MIPS MT提供重量级虚拟处理元件和轻量级的硬件微线程。RMI公司是一家基于Cupertino的初创公司，它是第一家提供八核心处理器SOC的MIPS供应商，其中每个核心运行四个线程。线程可以以细粒度模式运行，其中每个周期可以执行不同的线程。线程也可以分配优先级。Imagination Technologies的MIPS CPU的每个核心有两个SMT线程。

IBM的Blue Gene/Q有四路SMT。

2004年5月宣布的IBM POWER5为双核双芯片模块（DCM），或者说四核或者八核多芯片模块（MCM），其每个核心包含一个双线程SMT引擎。IBM的实现比以前更复杂，因为它可以为不同的线程分配不同的优先级，这更加细粒度，并且SMT引擎可以动态地开启和关闭，从而更好地执行那些SMT处理器不能提高性能的工作负载。这是IBM通用可用硬件多线程的第二个实现。2010年，IBM发布了基于八核心的POWER7处理器的系统，每个核心具有四个智能并发线程。这切换线程模式为一个线程、两个线程或四个线程，取决于当时调度的线程数量。这可以优化内核对最小响应时间或最大吞吐量的使用。IBM POWER8的每个核心（SMT8）有8个智能并发线程。

IBM 在每个核心（SMT-2）有两个线程。

尽管许多人报告，太阳微系统的UltraSPARC T1（在其于2005年11月14日发布前，它被称为“Niagara”）和现在已经停用的代号“Rock”（最早于2005年宣布，但在许多延误后于2009年取消）的处理器是着眼于几乎完全利用SMT和CMP技术的SPARC的实现，Niagara实际并不使用SMT。Sun将这些组合方法称为“CMT”，并将整体概念称为“吞吐量计算。Niagara有八个核心，但每个核心只有一个管道，因此实际上它使用细粒度多线程。不同于SMT，它的来自多个线程的指令在每个周期共享问题窗口`{{fact}}`，处理器使用循环策略在每个周期发出下一个活动线程的指令。这使它更类似一个桶式处理器。Sun Microsystems的Rock处理器则不同，它有有多个管道的更复杂的内核。

甲骨文公司Sparc T3的每个核心有8个细粒度线程；Sparc T4、Sparc T5及Sparc M5、M6和M7的每个核心有8个细粒度线程，其中两个可以同时执行。

富士通Sparc64 VI有粗粒度的垂直多线程（VMT），Sparc VII和更新版有双向SMT。

英特尔安腾（Itanium）Montecito使用粗粒度多线程，Tukwila和更新版使用双路SMT（双域多线程）。

英特尔至强融核（Xeon Phi）有四路SMT（时间复用多线程），基于硬件的线程不能像常规超线程一样被禁用。

发布于2008年的英特尔Atom是英特尔首个实现双路SMT特性（市场名“超线程”）而不支持指令重排序、推测执行和寄存器重命名的产品。

英特尔酷睿2处理器不支援超线程，英特尔酷睿i3/i5/i7/i9部分型号支援超线程。

AMD Bulldozer微架构FlexFPU和共享二级高速缓存为多线程，但模块中的整数核心为单线程，因此它是一个SMT的部分实现。

AMD Ryzen有两路SMT。

VISC架构使用虚拟软件层（翻译层）以向全局前端分发单个指令线程，该全局前端将指令分割成虚拟硬件线程，然后将虚拟硬件线程分派到单独的虚拟核心。这些虚拟核心可以将它们发送到任何物理核心上的可用资源。多个虚拟核心可以将线程推入单个物理核心的重排序缓冲器中，其可以同时通过执行端口从多个线程拆分部分指令和数据。每个虚拟核心保持跟踪相对输出的位置。这种形式的多线程可以借允许单个线程使用CPU的所有资源来增加单线程性能。资源的分配在接近单个周期的延迟级别上是动态的（1-4个周期取决于分配的变化，这取决于各个应用的需要）。因此，如果两个虚拟核心竞争资源，则有适当的算法来确定在哪里分配什么资源。

## 缺点

根据处理器的设计和架构，如果任何共享资源是性能的瓶颈，同时多线程可能会降低性能。批评者认为这让软件开发人员承担很大的负担，他们必须测试同时多线程是否适合其应用程序的各种情况，并插入额外的逻辑以在性能降低时将其关闭。目前的操作系统缺乏适合此目的的API调用，并会防止不同优先级的进程获取彼此的资源。

某些同时多线程的实现还存有安全问题。英特尔的超线程实现就有一个漏洞，通过该漏洞，一个应用程序可能通过监视其高速缓存的使用窃取在同一处理器中运行的另一应用程序的加密密钥。

## 参考资料

- LE Shar and ES Davidson, "A Multiminiprocessor System Implemented through Pipelining", Computer Feb 1974
- D.M. Tullsen, S.J. Eggers, and H.M. Levy, "Simultaneous Multithreading: Maximizing On-Chip Parallelism," In 22nd Annual International Symposium on Computer Architecture, June, 1995
- D.M. Tullsen, S.J. Eggers, J.S. Emer, H.M. Levy, J.L. Lo, and R.L. Stamm, "Exploiting Choice: Instruction Fetch and Issue on an Implementable Simultaneous Multithreading Processor," In 23rd Annual International Symposium on Computer Architecture, May, 1996
- H. Esmaeilzadeh, T. Cao, X. Yang, S.M. Blackburn, and K.S. McKinley, "Looking Back on the Language and Hardware Revolutions: Measured Power, Performance, and Scaling," In the ACM International Conference on Architectural Support for Programming Languages and Operating Systems, March 2011.

## 外部链接

- SMT news articles and academic papers
- SMT research at the University of Washington
- Timeline of multithreading technologies
- AIX > AIX 6.1 > AIX 的编程 > 一般编程概念 > 同步多线程技术，IBM知识库