RISC機器的五層管線示意圖（IF：讀取指令，ID：指令解碼，EX：執行，MEM：記憶體存取，WB：寫回暫存器）
**指令管線化**（英語：）是為了讓計算機和其它數位電子裝置能夠加速指令的通過速度（單位時間內被執行的指令數量）而設計的技術。

管線在處理器的內部被組織成層級，各個層級的管線能半獨立地單獨運作。每一個層級都被管理並且鏈接到一條"鏈"，因而每個層級的輸出被送到其它層級直至任務完成。 處理器的這種組織方式能使總體的處理時間顯著縮短。

未管線化的架構產生的效率低，因為有些CPU的模組在其他模組執行時是閒置的。管線化雖並不會完全消除CPU的閒置時間，但是能夠讓這些模組並行運作而大幅提升程式執行的效率。差不多有些類似流水線工廠的概念。

但並不是所有的指令都是獨立的。在一條簡單的管線中，完成一個指令可能需要5層。如右圖所示，要在最佳性能下運算，當第一個指令被執行時，這個管線需要運行隨後4條獨立的指令。可是，如果隨後4條指令依賴於第一條指令的輸出，管線控制邏輯器，就必須插入延遲時脈周期到管線內，直到依賴被滿足。而轉發技術能顯著減少延時。憑藉多個層，雖然管線化在理論上能提高效能，優勝於無管線的內核（假設時脈也因應層的數量按比例增加），但事實上，許多指令碼設計中並不會考慮到理想的執行。

簡介
--

RISC機器的五層管線示意圖
管線化是假設程式執行時有一連串的指令要被執行（垂直座標i是指令集，水平座標表時間t）。絕大多數當代的CPU都是利用時脈驅動。

而CPU是由內部的邏輯閘與正反器組成。當受到時脈觸發時，正反器得到新的數值，並且邏輯閘需要一段時間來解析出新的數值，而當受到下一個時脈觸發時正反器又得到新的數值，以此類推。而藉由邏輯閘分散成很多小區塊，再讓正反器鏈接這些小區塊組，使邏輯閘輸出正確數值的時間延遲得以減少，這樣一來就可以減少指令執行所需要的周期。

舉例來說，典型的RISC管線被分解成五個階段，每個階段之間使用正反器鏈接。

1. 讀取指令
2. 指令解碼與讀取暫存器
3. 執行
4. 記憶體存取
5. 寫回暫存器

優缺點
---

並非在所有情況下管線技術都起作用。可能有一些缺點。如果一條指令管線能夠在每一個時脈週期接納一條新的指令，被稱為**完整管線化**（fully pipelined）。因管線中的指令需要延遲處理而要等待數個時脈週期，被稱為非完整管線化。

當一名程序員（或者組合者/編譯者）編寫組合代碼（或者彙編碼）時，他們會假定每個指令是循序執行的。而這個假設會使管線化無效。當此現象發生後程式會表現的不正常，而此現象就是**危害**。不過目前有提供幾種技術來解決這些危害像是轉發與延遲等。

### 優點

1. 减少了处理器执行指令所需要的時脈週期，在通常情況下增加了指令的輸入頻率（issue-rate）。
2. 一些集成電路（combinational circuits），例如加法器（adders）或者乘法器（multipliers），通過添加更多的環路（circuitry）使其工作得更快。如果以管線化替代，能相對地減少環路。

### 缺點

1. 非管線化的處理器每次（at a time）只執行一個指令。防止分支延時（事實上，每個分支都會產生延時）和串行指令被并行執行產生的問題。設計比較簡單和較低生產成本。
2. 在執行相同的指令時，非管線化處理器的指令傳輸延遲時間（The instruction latency）比管線化處理器明顯較短。這是因為管線化的處理器必須在數據路徑（data path）中添加額外正反器（flip-flops）。
3. 非管線化處理器有固定指令位寬（a stable instruction bandwidth）。管線化處理器的性能更難以預測，並且不同的程序之間的變化（vary）可能更大。

示例
--

### 一般的管線

一般的四層管線架構；不同的顏色格表示不同的指令
右圖是一般有4層管線的示意圖：

1. 讀取指令（Fetch）
2. 指令解碼（Decode）
3. 執行指令（Execute）
4. 寫回執行结果（Write-back）

上方的大灰色格是一連串未執行的指令；下方的大灰色格則是已執行完成的指令；中間的大白色格則是管線。

執行順序如以下列表所示：

| 時序 | 執行情況 |
| --- | --- |
| 0 | 四條指令等待執行 |
| 1 | * 從記憶體（memory）中讀取綠色指令
 |
| 2 | * 綠色指令被解碼
* 從主存儲器中讀取紫色指令
 |
| 3 | * 綠色指令被執行（事實上運算已經開始（performed））
* 紫色指令被解碼
* 從主存儲器中讀取藍色指令
 |
| 4 | * 綠色指令的運算結果被寫回到寄存器（register）或者主存儲器
* 紫色指令被執行
* 藍色指令被解碼
* 從主存儲器中讀取紅色指令
 |
| 5 | * 綠色指令被執行完畢
* 紫色指令的運算結果被寫回到寄存器或者主存儲器
* 藍色指令被執行
* 紅色指令被解碼
 |
| 6 | * 紫色指令被執行完畢
* 藍色指令的運算結果被寫回到寄存器或者主存儲器
* 紅色指令被執行
 |
| 7 | * 藍色指令被執行完畢
* 紅色指令的運算結果被寫回到寄存器或者主存儲器
 |
| 8 | * 紅色指令被執行完畢
 |
| 9 | 所有指令皆執行完畢 |

#### 汽泡

一個氣泡在編號為3的時脈週期中，指令執行被延遲
条目：氣泡 (電腦運算)
指令執行中產生一個"打嗝"（hiccup），在管線中生成一個沒有實效的氣泡。

如右圖，在編號為2的時脈週期中，紫色指令的讀取被延遲，並且在編號為3的時脈週期中解碼層也產生了一個氣泡。所有在紫色指令之後的指令都被延遲執行，而在其之前已經執行了的指令則不受影響。

由於氣泡使指令執行延遲了一個時脈週期，完成全部4條指令的執行共需要8個時脈週期。

而氣泡處對指令的讀取、解碼、執行與寫回都沒有實質影響。這可以使用nop代碼來完成。

複雜化
---

很多處理器的管線深度到5層、7層、10層，甚至31層（像是Intel Pentium 4 Prescott）。Xelerator X10q甚至有多于1000層的管線深度 （页面存档备份，存于）。

| 微架構
（Microarchitecture） | 管線層數
（Pipeline stages） |
| --- | --- |
| Sony Cell | 23 |
| IBM PowerPC 7 | 17 |
| IBM Xenon | 19 |
| AMD Athlon | 10 |
| AMD Athlon XP | 11 |
| AMD Athlon 64 | 12 |
| AMD Phenom | 12 |
| AMD Opteron | 15 |
| ARM7TDMI (-S) | 3 |
| ARM7EJ-S | 5 |
| ARM810 | 5 |
| ARM9TDMI | 5 |
| ARM1020E | 6 |
| XScale PXA210/PXA250 | 7 |
| ARM1136J (F)-S | 8 |
| ARM1156T2 (F)-S | 9 |
| ARM Cortex-A5 | 8 |
| ARM Cortex-A8 | 13 |
| AVR32 AP7 | 7 |
| AVR32 UC3 | 3 |
| DLX | 5 |
| Intel P5（Pentium） | 5 |
| Intel P6（Pentium Pro） | 14 |
| Intel P6（Pentium III） | 10 |
| Intel NetBurst（Willamette） | 20 |
| Intel NetBurst（Northwood） | 20 |
| Intel NetBurst（Prescott） | 31 |
| Intel NetBurst（Cedar Mill） | 31 |
| Intel Core | 14 |
| Intel Atom | 16 |
| LatticeMico32 | 6 |
| R4000 | 8 |
| StrongARM SA-110 | 5 |
| SuperH SH2 | 5 |
| SuperH SH2A | 5 |
| SuperH SH4 | 5 |
| SuperH SH4A | 7 |
| UltraSPARC | 9 |
| UltraSPARC T1 | 6 |
| UltraSPARC T2 | 8 |
| WinChip | 4 |
| LC2200 32 bit | 5 |

當程式出現分支將不利於過深管線，整條管線將會無效化。為了減輕此狀況，分支預測就變的重要。如果分支預測錯誤，也能夠藉由自行結束預測來避免加速惡化效率。在某些運用上，像是超級電腦運算，為了能夠將超長管線的運算優勢凸顯出來，會特地將程式寫的極少分支化來避免預測失敗，而且深度的管線化主要是為了能降低每個時脈執行的指令量而設計。當程式經常出現分支，把分支重新排序（像是將更為需要的指令提早放入管線中）而將明顯的降低損失的速度以避免將分支"沖垮"。像是gcov程式能夠使用一種覆蓋率檢查的技術檢查特定分支的執行頻率，但是這種檢查法經常是最佳化的最後手段。處理能力高的管線會因為很多分支的程式而降低效率，這是因為處理器不知道下一個要讀取的指令是甚麼，而需要等待完成分支指令而讓管線清空。處理完分支之後，下一個指令就要經過所有管線，直到整個指令集的結果出現，而處理器才會再繼續執行。而在極端的狀況下，管線化處理器的效能理論上可能會與未管線化處理器一致，甚至是每層管線都在待命狀態，而且指令經常在管線之中跑來跑去時的效能比較差一些。

由於指令管線化，處理器讀取機器碼時並不會立即執行。因為如此，在很接近的地方執行更新機器碼的動作就可能無法作用，因為這些機器碼已經進入預讀輸入隊列內。指令快取又會讓此現象更加惡化。不過這只會在能夠自我變更的程式出現此現象。

範例
--

### 範例一

一個典型的加法指令可能會寫成像`ADD A, B, C`，而中央處理器（CPU）會將記憶體（Memory）內A位置與B位置的數值相加後放到C位置。在管線化處理器內，管線控制器會將這個指令分拆成一連串微指令：

```
LOAD R1, A
LOAD R2, B 
ADD R3, R1, R2
STORE R3, C
LOAD next instruction

```

*R1*, *R2*和*R3*是CPU內的暫存器（register是CPU裡面能夠快速存取的暫存記憶體）。主存儲器內標註為A位置和B位置之存儲單元中的數值被載入（或稱複製）到暫存器R1和R2中，然後送到加法器中相加，結果輸出到暫存器R3中，R3中的數值再被存儲到主存儲器內標註為C位置的存儲單元。

而且在非管線化的例子，開始驅動加法動作到完成的時間是不變的。

在這個範例中的管線分為3層：載入，執行，存儲。每一步被稱為管線層（或稱管線階段，pipeline stages）。

在非管線化處理器中，同一時間只允許一個層運作，所以必須等待指令執行完畢才能開始執行下一條指令。在管線化處理器中，所有的層能在同一時間處理不同的指令。當一條指令在執行層，另外一條指令在解碼層，第三條指令在讀取層。

管線沒有減少執行指令所花費的時間；它增加了在同一時間被處理的指令數量，並且減少了完成指令之間的延遲。隨着處理器中管線層的數量增加，能在同一時間被處理的指令數量也相應增加，也減少了指令等待處理所產生的延遲。現在生產的微處理器至少有2層管線。[來源請求]（Atmel AVR與PIC微控制器都有2層管線）Intel Pentium 4處理器有20層管線。

### 範例二

以下表格具體列出3層管線理論：

| 管線層（Stage） | 說明（Description） |
| --- | --- |
| 讀取（Load） | 從主存儲器中讀取指令 |
| 執行（Execute） | 執行指令 |
| 存儲（Store） | 將執行結果存儲到主存儲器和/或者暫存器 |

以組合語言表示將會被執行的指令列表：

```
	LOAD  A, #40      ;讀取40載入A內
	MOVE  B, A        ;將A內的数据移动到B內
	ADD   B, #20      ;將B內的數據與20相加
	STORE 0x300, B    ;將B內的數據儲存到地址為0x300的存儲器單元

```

代碼的執行循序如下：

第1週期| 讀取 | 執行 | 儲存 |
| --- | --- | --- |
| LOAD |  |  |

從主存儲器中讀取LOAD指令。

第2週期| 讀取 | 執行 | 儲存 |
| --- | --- | --- |
| MOVE | LOAD |  |

LOAD指令被執行，同時從主存儲器中讀取MOVE指令。

第3週期| 讀取 | 執行 | 儲存 |
| --- | --- | --- |
| ADD | MOVE | LOAD |

LOAD指令在存儲層（Store stage），LOAD指令的執行結果#40（the number 40）將被存儲到暫存器A。同時，MOVE指令被執行。MOVE指令必須等待LOAD指令執行完畢才能將暫存器A中的內容移動到暫存器B中。

第4週期| 讀取 | 執行 | 儲存 |
| --- | --- | --- |
| STORE | ADD | MOVE |

STORE指令被載入，同時MOVE指令執行完畢，並且ADD指令被執行。

注意! 有時候，一個指令會依賴於其他指令的執行結構（例如以上的MOVE指令）。當一個指令因為操作數而需引用一個特定的位置，讀取（作為輸入）或者寫入（作為輸入），執行那些指令的循序不同於程序原本的執行循序能導致冒險（hazards）。現時有機種技術用於預防危害，或者繞過（working around）它們。

參見
--

* 等待狀態（英语：）
* 傳統的RISC管線（英语：）
* 管線
* 並行運算
* 延迟间隙

外部連結
----

* 來自ArsTechnica的管線化相關文章 （页面存档备份，存于）


|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
处理器技术 |
| --- |
|  |
| 模型 | 

|  |  |
| --- | --- |
| 顺序模型 | 
* 图灵机
	+ 通用
	+ 波斯特-图灵机
	+ 量子
* 传动带机器（英语：）
* 堆疊結構機器
* 有限状态机
	+ 具数据通路（英语：）
	+ 分层（英语：）
	+ 队列（英语：）
* 寄存器机
	+ 计数器
	+ 指针（英语：）
	+ 隨機存取機
	+ 隨機存取儲存程式機

 |
|  |
| 函数式模型 | 
* 递归函数
* Λ演算
* 组合子逻辑
* 細胞自動機

 |

 |
|  |
| 架構 | 
* 微架構
* 冯·诺伊曼结构
* 哈佛架構
	+ 修正哈佛架構（英语：）
* 資料流架構（英语：）
* 传输触发（英语：）
* 元胞（英语：）
* 字节序
* 异构（英语：）
* Fabric（英语：）
* 多元處理
* 認知計算
* 神经形态（英语：）

|  |  |
| --- | --- |
| 内存访问 | 
* 非均匀访存模型(NUMA)
* 均匀访存模型(UMA)
* 载入/存储（英语：）
* 寄存器/存储器（英语：）

 |
|  |
| 缓存层级（英语：） | 
* 缓存层级（英语：）

 |
|  |
| 記憶體階層 | 
* 虚拟内存
* 第二级存储器

 |

 |
|  |
| 指令集架構 | 

|  |  |
| --- | --- |
| 类型 | 
* 复杂指令集(CISC)
* 精简指令集(RISC)
* 专用指令集处理器
* 显式数据图像并行（英语：）(EDGE)
	+ TRIPS（英语：）
* 超長指令集(VLIW)
* 顯式並行指令運算(EPIC)
* 最小指令集（英语：）(MISC)
* 單一指令集(OISC)
* 無指令集（英语：）(NISC)
	+ 零指令集(ZISC)
* 比較（英语：）

 |
|  |
| 指令集 | 
* x86
* ARM
* MIPS
* LoongArch
* PowerPC
* SPARC
* IA-64
* Unicore（英语：）
* MicroBlaze（英语：）
* RISC-V
* LMC（英语：）
* 其他（英语：）

 |

 |
|  |
| 执行 | 

|  |  |
| --- | --- |
|  | 
* 流水线停顿
* 操作数转发（英语：）
* 经典 RISC 流水线（英语：）

 |
|  |
| 危障 | 
* 数据依赖
* 數據危障
* 結構危障
* 控制危障
* 伪共享

 |
|  |
| 乱序执行 | 
* 托马苏洛算法
	+ 保留站
	+ 重排序缓冲区
* 寄存器重命名

 |
|  |
| 推测执行 | 
* 分支預測
	+ 存储相关性预测（英语：）

 |

 |
|  |
|  | 

|  |  |
| --- | --- |
| 并行层次 | 
* 位级并行
	+ 位序列（英语：）
	+ 字
* 指令级并行
* + 标量
	+ 純量
	+ 超純量
* 任務并行
	+ 线程
	+
* 数据并行
	+ 向量
* 記憶體
* 分布式

 |
|  |
| 執行緒 | 
* 多執行緒
* 同时多线程
	+ 超執行緒
* 超執行緒
* 超級線程（英语：）
* 预测多线程（英语：）
* 抢占式
* 协作式

 |
|  |
| 費林分類法 | 
* 單指令流單數據流(SISD)
* 單指令流多數據流(SIMD)
	+ 寄存器内（英语：）
* 单指令多线程（英语：）(SIMT)
* 多指令流單數據流(MISD)
* 多指令流多數據流(MIMD)
	+ 单程序多数据（英语：）

 |

 |
|  |
| 電腦性能 | 
* 晶體管數量
* 每周期指令(IPC)
	+ 每指令周期(CPI)
* 每秒指令(IPS)
* 每秒浮點運算次數(FLOPS)
* 每秒事务处理量 (TPS)
* 效能功耗比(PPW)

 |
|  |
| 類別 | 
* 中央处理器(CPU)
* 圖形處理器(GPU)
	+ 图形处理器通用计算(GPGPU)
* 向量处理器
* 桶状（英语：）
* 串流處理
* 輔助處理器
* 特殊應用積體電路(ASIC)
* 现场可编程逻辑门阵列(FPGA)
* 複雜可程式化邏輯裝置(CPLD)
* 多晶片模組(MCM)
* 封裝體系(SiP)

|  |  |
| --- | --- |
| 按应用 | 
* 微处理器
* 单片机(MCU)
* 移动处理器（英语：）
* 笔记本电脑处理器（英语：）
* 超低电压（英语：）
* 专用指令集处理器(ASIP)

 |
|  |
| 片上系统 | 
* 片上系统(SoC)
* 多处理器片上系统（英语：）(MPSoC)
* 可编程片上系统(PSoC)
* 片上网络（英语：）(NoC)

 |
|  |
| 硬件加速 | 
* 人工智能加速器
* 视觉处理单元(VPU)
* 物理處理器(PPU)
* 數位訊號處理器(DSP)
* 张量处理器(TPU)
* 安全加密協處理器
* 网络处理器
* 基頻處理器

 |

 |
|  |
| 字长 | 
* 
* 4位元
* 8位元
* 12位元
* 
* 16位元
* 24位元（英语：）
* 32位元
* 48位元（英语：）
* 64位元
* 128位元
* 
* 位元分割（英语：）
* 其他
	+

 |
|  |
| 核心数量 | 
* 单核（英语：）
* 多核
* 众核（英语：）
* 异构

 |
|  |
| 組件 | 
* 核心
* 缓存
	+ CPU缓存
	+ 置換機制
	+ 一致性
* 总线
* 
* 定時器訊號
* 先進先出演算法(FIFO)

|  |  |
| --- | --- |
| 功能单元 | 
* 算術邏輯單元(ALU)
* 地址生成单元(AGU)
* 浮點運算器(FPU)
* 內存管理單元(MMU)
	+ 载入-存储单元（英语：）
	+ 轉譯後備緩衝區(TLB)
* 内存控制器(IMC)

 |
|  |
| 邏輯閘 | 
* 组合逻辑电路
* 时序逻辑电路
* Glue（英语：）
* 邏輯閘
	+ 量子閘
	+ 逻辑门阵列（英语：）

 |
|  |
| 寄存器 | 
* 寄存器
* 状态寄存器（英语：）
* 栈寄存器（英语：）
* 寄存器堆
* 記憶體缓冲区
* 程式計數器

 |
|  |
| 总线 | 
* 位址匯流排
* 控制匯流排
* 后端总线

 |
|  |
| 控制单元 | 
* 指令单元（英语：）
* 緩衝器
* 写入缓冲区（英语：）
* 微程序ROM
* 计数器

 |
|  |
| 数据通路 | 
* 数据选择器
* 数据分配器
* 加法器
* 乘法器
	+ CPU倍频器
* 译码器
	+ 地址解码器（英语：）
	+ 加和寻址解码器（英语：）
* 桶式移位器

 |
|  |
| 電路 | 
* 集成电路
	+ 3D
	+ 混合訊號
	+ 電源管理
* 布尔（英语：）
* 数字
* 模拟
* 量子
* 开关

 |

 |
|  |
| 电源管理 | 
* 电源管理单元（英语：）(PMU)
* 高级电源管理
* 高级配置与电源接口(ACPI)
* 
* 动态电压调节
* 时钟门控
* 效能功耗比(PPW)
* 空闲竞争（英语：）

 |
|  |
| 相关内容 | 
* 通用CPU历史（英语：）
* 微处理器年代表（英语：）
* 处理器设计
* 数字电路
* 硬件安全模块
* 半导体制造
* Tick-Tock

 |

 |