超純量

**超純量**（superscalar）CPU 架構是指在一顆處理器核心中實行了指令級並行的一類並行運算。這種技術能夠在相同的 CPU 主頻下實現更高的 CPU 流量（throughput）。處理器的核心中一般有多個執行單元（或稱功能單元），如算術邏輯單元、位移單元、乘法器等等。未實現超純量體系結構時，CPU 在每個時鐘周期僅執行單條指令，因此僅有一個執行單元在工作，其它執行單元空閒。超純量體系結構的 CPU 在一個時鐘周期可以同時分派（dispatching）多條指令在不同的執行單元中被執行，這就實現了指令級的並列。超純量體系結構可以視作多指令流多數據流。

超純量體系結構的 CPU 一般也都實現了指令流水化。但是一般認為這二者是增強 CPU 效能的不同的技術。

## 歷史

第一個超純量的設計是在 1965 年西摩・克雷開發的 CDC 6600。1984 年的 Intel i960CA 與 1987 的 AMD 29050 處理器是第一個量產的單晶粒超純量處理器。這些 RISC 系統的 CPU 使用超純量架構，是由於當時 RISC 的設計的核心較簡單，能夠直接發送指令與調度多種功能性的單位（像是 ALU）。這也是在八、九十年代 RISC 處理器比 CISC 處理器的運算速度更快的主要原因。

除了那些低功率 CPU、嵌入式 CPU、以及使用電池電源的 CPU，1998 年以後開發的 CPU 設計都已經是超純量體繫結構。第一種採用超純量技術的 x86 處理器是 Pentium。第一批採用了把 CISC 指令異步解碼為微指令序列技術的處理器是 Nx586、P6 架構的 Pentium Pro 以及 AMD K5。這使得被快取的微指令可以動態調度（dynamic scheduling）執行，使得 P6 架構的並行性更優於 P5 架構的 Pentium; 這也使得預測執行（投機執行）更易實現，CPU 的時脈也可以更高。

## 從純量到超純量

最簡單的處理器是純量處理器。該處理器執行每個指令通常會在一個時間內操作一個或兩個資料項目。但相較之下，向量處理器執行每個指令能夠同時間運作很多資料項目。而超純量處理器則是將純量與向量處理器混合起來。每個指令處理一個資料項目，但是有多個多餘的處理器內的功能單位能同時處理額外獨立的資料項目。

超純量處理器設計強調增強指令發送的準確度，而且能夠加強很多功能單位的利用度。這樣當單位增加時效能增進就能很明顯。當早期的超純量 CPU 有兩組 ALU 與一組 FPU 的時候，像 PowerPC 970 較先進的設計就內含四組 ALU、二組 FPU 與一對單指令流多數據流單位。但如果調度器（dispatcher）效率低落，系統的效能將會拖累。

超純量處理器的執行速度通常高於每週期一個指令。但同時處理多個指令不見得就是超純量化，像是管線 CPU 與多核心 CPU，就是使用不同的方式，來達同時處理多個指令的目的。

而超純量處理器的調度器從記憶體讀取指令，而且決定要將哪些指令能夠並行處理，將這些指令再調度到 CPU 內重複的功能單元。因而超純量處理器可以想成它有多個平行的管線，這些管線可以平行處理一個執行緒中指令。

## 限制

超純量的效能增進會被這三處限制住：

1. 指令流中的本質並行度（degrees of intrinsic parallelism），也就是限制指令級平行的數量。
2. 複雜又耗時的調度器的消耗時間與依賴性檢查邏輯電路。
3. 分支指令的處理

現有的二進制程式有不同的本質並行度。在部分指令中並不與其他指令互相關聯而能同時執行。而另一部分指令就有相互關聯：一個指令會影響其他指令的資源或結果。像是 `a=b+c ; d=e+f` 這串指令，因為運算中並不會相互影響而能夠並行運算。但是 `a=b+c ; d=a+f` 這串指令就可能無法並行執行，是因為指令順序中後面的指令需要前面的運算結果。

當同時發出指令的數量增加，依賴性檢查的成本會大量增加。由於檢查過程中需要 CPU 參與，這樣會惡化 CPU 的處理效率。而此成本包含為了實現依賴性檢查而增加的邏輯閘，還有在這些邏輯閘之間的時間延遲。而研究顯示出邏輯閘成本在某些狀況下可能會高達 $k^{2}\log n$ ，n 是處理器的指令集數量，而 k 是同時發送的指令數量。在數學領域稱之為排列組合問題。而即使該指令流並沒有任何的指令依賴性，超純量處理器還是要去檢查，這樣子才能確保結果不會錯誤。而無論半導體製程是多麼進步，或是切換速度是多麼的快，同時發送的指令數量還是有一個限制在。當更新進的製程允許更多的功能性單位內建其中（像是 ALU），但是指令依賴性檢查成長得太快以至於超純量調度限制還是感覺很小，既使同時有五到六個指令同時調度進去。

然而即使將無限快的依賴性檢查邏輯電路內建於超純量 CPU，如果指令流自己有很大的依賴性，這樣還是可能會限制住效能。這樣在原始碼流之間的本質平行度就會形成第二個限制。

## 替代技術

綜合來說，這三個限制驅使研究轉向其他的效能增進架構，例如超長指令字（VLIW）、顯式並行指令計算（EPIC）、同步多執行緒（SMT）和多核心處理器。

在 VLIW 架構，繁重的指令相依性檢查工作由運行時的硬體邏輯轉移到編譯器身上。而 EPIC 與 VLIW 相似，但多了快取預取指令。

同步多執行緒通常縮寫為 SMT，目的是為了改進超純量處理器的總體效率。此架構允許多個獨立的執行緒更佳的利用現代處理器架構的資源。

超純量處理器不同於多核心處理器之處，在於多餘的功能單元無法構成完整的處理器。一個處理器由多個較細粒度的功能單元所組成，例如算術邏輯單元（ALU）、整數乘法器、整數位移器、浮點運算器等等。每個功能單元可能存在複數版本，使得多個指令能平行執行。此做法不同於多核心處理器，後者使用多個執行緒（一核一緒）同時地處理指令；也不同於管線處理器 - 複數指令可以同時存在於不同的執行階段，就像工廠裝配線一樣。

這些替代技術並非互斥，他們可以（經常是）被合併使用到單一處理器上。因此一顆多核心處理器可能是這樣，每個核心包含複數個平行管線，每個管線都是超純量。有些處理器還擁有向量處理的能力。

## 內部連結

* Hyper-Threading
* 並行多工
* 預測執行 / 及早求值
* 軟體停滯，會出現於多處理器系統，由於超純量的邏輯依賴性造成的現象。

## 參考書目

* Mike Johnson, _Superscalar Microprocessor Design_, Prentice-Hall, 1991, ISBN 0-13-875634-1
* Sorin Cotofana, Stamatis Vassiliadis, "On the Design Complexity of the Issue Logic of Superscalar Machines", EUROMICRO 1998: 10277-10284
* Steven McGeady, "The 1960CA SuperScalar Implementation of the 80960 Architecture", IEEE 1990, pp. 232-240
* Steven McGeady, et al., "Performance Enhancements in the Superscalar i960MM Embedded Microprocessor," _ACM Proceedings of the 1991 Conference on Computer Architecture (Compcon)_, 1991, pp. 4-7

## 外部連結

* http://www.cs.clemson.edu/~mark/eager.html （頁面存檔備份，存於網際網路檔案館）