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纳米制程