Fermi (微架構)

費米（Fermi）是英偉達在2010年3月發布的圖形處理器微架構的代號，是特斯拉微架構架構的繼承者，於2010年4月正式推向零售市場。

費米是英偉達最後一款在遊戲顯卡上保留完整雙精度的微架構。大多數GeForce 400 系列、GeForce 500 系列和部分GeForce 800 系列顯卡基於費米架構，桌面版Fermi GPU均採用40nm工藝製造，而移動版則採用了40nm和28nm兩種工藝製程。在工作站市場方面，費米架構也應用於NVIDIA Quadro x000系列、Quadro NVS型號以及NVIDIA Tesla計算模塊系列。Fermi是英偉達截止到目前最古老的、仍支持Microsoft Direct3D 12（feature_level_11）渲染API的微架構。

費米的後繼者為克卜勒，但其仍在GeForce 600系列、700系列和800系列顯卡中曾與Kepler一同使用（後兩者僅限移動版 GPU）。

費米架構的命名來自20世紀的美籍義大利裔物理學家恩里科·費米（Enrico Fermi）。

## 概述

NVIDIA GeForce GTX 480是GeForce 400系列顯卡中的首款產品，採用了Fermi微架構（核心代號 GF100-375-A3）。其主要規格如下：

- 流式多處理器 (SM)：每個 SM 包含 32 個CUDA核心（詳見「流式多處理器」和"CUDA 核心」部分）。
- GigaThread 全局調度器：負責將線程塊分發給SM的線程調度器，並管理執行過程中的線程上下文切換（詳見"Warp 調度」部分）。
- 主機接口：通過PCI-Express 2.0總線連接GPU與CPU，峰值傳輸速率為8 GB/s。
- 顯存 (DRAM)：得益於 64 位尋址能力，支持高達6 GB的GDDR5顯存（詳見「記憶體架構」部分）。
- 時鐘頻率：1.5 GHz（NVIDIA 未正式公布此數據，由 Insight 64 估算得出）。
- 峰值性能：1.5 TFlops。
- 全局記憶體時鐘：2 GHz。
- 顯存帶寬：192 GB/s。
- 影片解碼支持：支持 H.264 全高畫質 (FHD) 解碼。

### 流式多處理器 (Streaming Multiprocessor)

每個 SM 單元包含以下組件：

- 32 個單精度 CUDA 核心。
- 16 個加載/存儲單元。
- 4 個特殊功能單元 (SFUs)。
- 64 KB 片上高速記憶體塊。
- L2 緩存接口。

### 加載/存儲單元 (Load/Store Units)

- 每個時鐘周期可為16個線程計算源地址和目的地址。
- 負責從緩存或DRAM中加載數據或將數據存儲到這些區域。

### 特殊功能單元 (SFUs)

- 執行超越函數指令，例如正弦 (sin)、餘弦 (cosine)、倒數 (reciprocal) 和平方根 (square root)。
- 每個 SFU 在每個時鐘周期為每個線程執行一條指令；一個 Warp（線程束）完成這些操作大約需要八個時鐘周期。
- SFU 流水線與分發單元解耦，這意味著即使 SFU 正在被占用，分發單元也可以向其他執行單元發出指令，從而提高整體效率。

### CUDA 核心 (CUDA Core)

- 整數算術邏輯單元 (ALU)
- 支持所有指令的完整32位精度，符合標準程式語言的要求。
- 針對工作站和伺服器型號進行了優化，以高效支持 64 位運算；但在消費級版本中，該功能被人為限制（crippled）。
- 浮點運算單元 (FPU)
- 實現了新的 IEEE 754-2008 浮點數標準。
- 為單精度和雙精度算術均提供了融合乘加 (FMA) 指令。
- 每個 SM 在每個時鐘周期最多可執行 16 次雙精度融合乘加運算。
- 融合乘加 (Fused Multiply-Add, FMA)
- 將乘法與加法（即 A×B+C）合併為一次操作，僅進行一次最終的捨入步驟。
- 在加法過程中不會丟失精度。
- 相比於分開執行乘法和加法運算，FMA 具有更高的計算準確性。

### Warp 調度 (Warp Scheduling)

Fermi 架構採用兩級分布式線程調度器。

- 指令發射機制：每個 SM（流式多處理器）可以並發發射指令，利用四個執行列中的任意兩列。例如，SM 可以將來自第一列核心的 16 個操作與第二列核心的 16 個操作混合執行；或者將來自加載/存儲單元的 16 個操作與來自 SFU（特殊功能單元）的 4 個操作組合；也可以根據程序需求進行任何其他組合。
- 注意：64 位浮點運算需要同時使用前兩列執行單元，因此其運行速度僅為 32 位運算的一半。
- 雙 Warp 調度器 (Dual Warp Scheduler)：
- 在 SM 層面，每個 Warp 調度器負責將包含 32 個線程的 Warp 分發給其執行單元。
- 每個 SM 配備兩個 Warp 調度器和兩個指令分發單元，這使得 SM 能夠同時發射並執行兩個 Warp。
- 雙發射能力：雙 Warp 調度器會選擇兩個 Warp，並從每個 Warp 中各取一條指令，分發給一組 16 個核心、16 個加載/存儲單元或 4 個 SFU。大多數指令支持「雙發射」（Dual Issued），即可以並發執行兩條整數指令、兩條浮點指令，或者混合執行整數、浮點、加載、存儲及 SFU 指令。
- 限制：雙精度（64 位）指令不支持與其他任何操作進行雙分發。

### 性能 (Performance)

- 單精度理論算力 (Single-Precision GFLOPS)：
- Fermi GPU 的單精度理論峰值性能計算公式為：`2 × CUDA 核心数量 × Shader 时钟频率 (GHz)`。
- 其中係數 `2` 代表每個 FMA（融合乘加）指令在每個時鐘周期內完成的操作次數。
- 架構限制說明：上一代 Tesla 架構允許在 CUDA 核心和 SFU（特殊功能單元）之間並行雙發射 MAD+MUL 指令，但 Fermi 架構失去了這一能力。Fermi 每個 SM 每周期僅能發射 32 條指令，這剛好使其 32 個 CUDA 核心保持滿負荷運行，而無法利用額外的 SFU 資源來進一步提升單核周期的操作數（即無法超過每個 CUDA 核心每周期 2 次操作）。
- 雙精度理論算力 (Double-Precision GFLOPS)：
- Fermi GPU 的雙精度理論性能約為其單精度性能的 1/2（針對 GF100/GF110 架構）。
- 專業卡：雙精度算力僅在專業的 Quadro 和 Tesla 系列顯卡上完全可用。
- 消費級卡：GeForce 等消費級顯卡的雙精度性能被人為限制（artificially capped）為單精度性能的 1/8。

### 記憶體系統 (Memory)

- L1 Cache：每個 SM（流式多處理器）擁有獨立的 L1 緩存。
- Unified L2 Cache：統一的 L2 緩存服務於所有操作，包括加載、存儲和紋理請求。
- 容量與隔離性：每個 SM 擁有 32K（即 32,768）個 32 位寄存器。線程僅能訪問自己的寄存器，無法訪問其他線程的寄存器。
- 使用限制：CUDA 內核最多可使用 63 個寄存器。隨著線程數增加（工作負載加重），可用寄存器數量會從 63 平滑下降至 21。
- 帶寬：寄存器具有極高的內部帶寬，約為 8,000GB/s。
- 功能：片上記憶體，可配置為兩種模式：
- 48 KB 共享內存 + 16 KB L1 緩存。
- 16 KB 共享內存 + 48 KB L1 緩存。
- L1 Cache：用於為單個線程緩存數據（寄存器溢出/Spilling）。
- Shared Memory：用於同一線程塊內的多個線程間共享數據。它支持線程協作、促進片上數據的重用，並大幅減少片外記憶體流量。
- 特性：由同一線程塊內的線程訪問，提供低延遲（10-20 個時鐘周期）和高帶寬（1,600 GB/s），適用於中等規模數據（如計算中間結果、矩陣運算的行/列、影片行等）。David Patterson 指出這種共享內存採用了「局部 Scratchpad"的設計理念。
- 定義：用於存放「溢出」寄存器的記憶體位置。當線程塊所需的寄存器存儲空間超過 SM 可用容量時，會發生寄存器溢出（Register Spilling）。
- 使用場景：僅用於某些自動變量（在設備代碼中聲明，且未加 `__device__`、`__shared__` 或 `__constant__` 限定符的變量）。
- 分配規則：通常變量駐留在寄存器中，但在以下情況會被分配到本地記憶體：
- 編譯器無法確定陣列索引為常量的陣列。
- 占用寄存器空間過大的大型結構體或陣列。
- 內核使用的寄存器總數超過 SM 可用數量時，編譯器決定溢出的變量。
- 規格：768 KB 統一 L2 緩存，由 16 個 SM 共享。
- 功能：服務於所有來自/去往全局記憶體的加載和存儲操作（包括與 CPU 主機的數據拷貝），以及紋理請求。
- 原子操作：L2 緩存子系統還實現了原子操作，用於管理需要在線程塊甚至內核間共享的數據訪問。
- 訪問方式：所有線程和主機系統（通過 PCIe 總線）均可直接訪問。
- 延遲：具有較高延遲，約為 400-800 個時鐘周期。

### 影片編解碼 (Video Decompression/Compression)

- 該架構（Fermi）集成了 Nvidia NVDEC（前身為 NVCUVID）硬體單元，用於加速影片的解壓縮。
- 它也繼承了上一代技術 PureVideo 的部分功能。
- Fermi 架構不支持影片編碼（Compression）。
- 專用的影片編碼技術 Nvidia NVENC 尚未在該架構中引入，而是直到其繼任者 Kepler 架構才首次出現。

## 基本資料

- 日語原文：Nvidia Fermi
- 發布日期：2010年3月
- 前任：特斯拉微架構
- 繼任：克卜勒
- 製造工藝：40納米製程