同時多線程

同時多線程（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知識庫