同時多執行緒

**同時多執行緒**（英語：**Simultaneous multithreading**，縮寫 **SMT**）也稱**同步多執行緒**，是一種提高具有硬體多執行緒的超純量 CPU 整體效率的技術。同時多執行緒允許多個獨立的執行執行緒更好地利用現代處理器架構提供的資源。

## 細節

名稱中的「多執行緒」有些曖昧，因為它不僅可以在一個 CPU 核心上同時執行多個執行緒，也可以是多個任務（哪怕不同分頁表、不同任務狀態段、不同分級保護域、不同 I/O 權限等等）。儘管執行在同一個核心，它們彼此間完全分離。多執行緒在概念上類似搶占式多工處理，但在現代的超純量處理器中以執行緒級執行來實現。

同時多執行緒（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）同時執行多個執行緒的多個指令。有很多方法來支援晶片內的多個執行緒，即：

* 交叉多執行緒：交錯發出不同執行緒的多個指令，也稱為時間多執行緒。它可以進一步分為細粒度多執行緒與粗粒度多執行緒，這取決於交錯發出的頻率。細粒度多執行緒 —— 例如在一個桶處理器 —— 在每個周期後發出不同執行緒的指令，而粗粒度多執行緒僅在當前執行執行緒導致一些長延遲事件（如頁錯誤等）時才切換到從另一執行緒的發出指令。粗粒度多執行緒對於執行緒之間較少的上下文交換是更常見的。例如，英特爾的 Montecito 處理器使用粗粒度多執行緒，而 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 z13 在每個核心（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 知識庫（簡體中文）