Kepler_(微架构)

**克卜勒**（Kepler）是英偉達在 2012 年 4 月發布的圖形處理器微架構的代號，是費米架構的繼承者。Kepler 是英偉達第一款專注於節能的微架構。大多數 GeForce 600 系列、GeForce 700 系列和部分 GeForce 800 系列顯卡基於 Kepler 架構，均使用 28 奈米製程。Kepler 架構也應用於 Tegra K1 SOC 上的圖形處理器 GK20A 以及 NVIDIA Quadro Kxxxx 系列顯卡、Quadro NVS 510 顯卡和 NVIDIA Tesla 計算卡。Kepler 的後繼者為麥斯維爾，並且和 Maxwell 架構一併用於 GeForce 700 系列和 GeForce 800 系列顯卡。

Kepler 架構的命名來自 17 世紀科學革命使其的著名德國數學家約翰內斯・克卜勒（Johannes Kepler）。

## 概覽

在 Kepler 的前一代架構 Fermi 中，英偉達主要專注於提升計算與曲面細分的性能。然而在 Kepler 架構中，英偉達轉向了提升效率、可程式性與性能。 效率的提升來自採用了統一的 GPU 時鐘、簡化的靜態指令調度和更加優化的每瓦性能。 儘管廢棄過去 GPU 中採用的著色器時鐘需要額外的核心來達到高性能，但通過這麼做依然得以使效率提升。這不僅是因為新的核心更加節能（根據英偉達的數據，兩個 Kepler 核心的功耗相當於一個 Fermi 核心的功耗的 90%），同時也是因為統一 GPU 時鐘使得這部分的功耗降低了 50%。

可程式性是通過 Kepler 架構的 Hyper-Q 技術、動態並行和多個新的 Compute Capabilities 3.x 功能實現的。通過這些得以在 GK 系列 GPU 中實現 GPU 的高利用率和簡化的代碼管理，從而使得針對 Kepler 系列 GPU 的編程更加靈活。

在性能上，額外的執行資源（更多的 CUDA 核心、暫存器和緩存）以及 Kepler 架構支持的 6 GHz 內存速度使得 Kepler 架構的性能較過去的英偉達 GPU 顯著增強。

## 功能

GK 系列 GPU 包含了來自老的 Fermi 架構的和新的 Kepler 架構的功能。但 Kepler 架構的 GPU 包含了以下額外的基本功能：

* PCI Express 接口
* DisplayPort 1.2
* HDMI 1.4a 4K x 2K 視頻輸出
* NVIDIA PureVideo 硬體解碼加速（最大解碼 4K x 2K H.264）
* 硬體 H.264 編碼加速模塊（NVENC）
* 支持最大 4 路獨立的二維顯示器，或 3 路環繞 / 3D 顯示器（NV Surround）
* 下一代流處理器（SMX）
* Polymorph-Engine 2.0
* 簡化指令調度器
* Bindless Textures
* CUDA 版本 3.0 到 3.5
* GPU Boost（在 GK110 上升級到了 2.0）
* TXAA 支持
* 台灣積體電路製造 28 nm 製程
* 新的 shuffle 指令
* 動態並行
* Hyper-Q（Hyper-Q 的 MPI 功能只有 Tesla 支持）
* Grid 管理單元
* NVIDIA GPUDirect（GPU Direct 的 RDMA 功能只有 Tesla 支持）

### 下一代流處理器（SMX）

The Kepler architecture employs a new Streaming Multiprocessor Architecture called "SMX". 
Kepler 架構使用了新的流處理器架構「SMX」。SMX 因為採用了統一的 GPU 時鐘而成為了 Kepler 架構節能的主要原因。 儘管採用了統一時鐘的 SMX 表現出的效果為多個低主頻的 Kepler 的 CUDA 核比多個高主頻的 Fermi 的 CUDA 核的功耗低 90%，Kepler 架構需要更多的處理單元來在每個時鐘執行一組 wrap（執行緒束）。將每組 CUDA 陣列的數量從 16 個翻倍至 32 個解決了 wrap 的執行問題。同時 SMX 前端也將 wrap 的調度器和分配器翻倍，而暫存器堆也被翻倍到 64K 條來滿足額外的執行單元的需要。面對晶片面積暴增的風險，SMX 的 PolyMorph Engine 並沒有也隨其他部分翻倍，而是升級到了 2.0 版本使得它能夠在更少的周期內地繪製多邊形。 專用的雙精度 CUDA 核心被用來彌補 Kepler CUDA 核心為了節省晶片面積而放棄的雙精度計算能力。英偉達在 SMX 上做的改進帶來了 GPU 在性能和效率上的提升。GK110 上的 48KB 材質緩存可被用於計算負載。在計算負載中，材質緩存變為了一個只讀數據緩存，專供非對齊的內存訪問負載使用。同時，錯誤糾正功能也使得需要 ECC 的負載能更加安全地運行。在 GK110 中每個執行緒的暫存器數也翻倍到了 255 個。

### 簡化指令調度器

額外的晶片面積是通過將複雜的硬體調度器簡化為軟體調度器帶來的。通過軟體調度，wraps 的調度被放在了編譯階段。同時因為簡化後 GPU 的計算流水線的延遲固定，英偉達在執行緒級並行之外也實現了指令級並行。由於指令是被靜態調度的，通過採用固定延遲的指令可以實現一致性，且靜態調度的編譯器降低了一層複雜度。

### GPU Boost

GPU Boost 是一個基本類似於 CPU 睿頻的新技術。GPU 總是能以一個最低的頻率運行，稱之為「基礎頻率」。這個頻率是通過測試在最高負載下也能保持在 TDP 以內的方法得出的。 然而當負載較低時，將存在一定空間來提升頻率而不超過 TDP。這種情況下，GPU Boost 將會一級級逐漸提高 GPU 頻率，直到 GPU 達到了一個預設的功耗（默認為 170W）。 通過這種方法，GPU 將會動態提高或降低自己的頻率，從而使得它能夠在 TDP 規範哪提供最大的速度。

預設功耗和每一級提升的頻率均可通過第三方工具調整，並且提供了給基於 Kepler 架構的 GPU 超頻的方法。

### Microsoft Direct3D 支持

基於 Fermi 和 Kepler 架構 GPU 的 GeForce 600 系列支持 Direct3D 11.0 規範。英偉達原本聲稱 Kepler 架構完整支持 DirectX 11.1，包括 Direct3D 11.1。
 然而以下「Modern UI」 Direct3D 11.1 功能並不被支持：

* 目標獨立光柵化（僅限 2D 渲染）
* 16xMSAA 光柵化（僅限 2D 渲染）
* 正交線渲染模式
* 非像素著色階段的 UAV（Unordered Access View）

根據微軟的定義，Direct3D feature level 11\_1 必須完備，否則無法執行 Direct3D 11.1 
Kepler 架構內置的 Direct3D 功能和採用 Fermi 架構的 GeForce 400 系列顯卡一致

### 下一代 Microsoft Direct3D 支持

基於 Kepler 架構的 GeForce 600/700 系列顯卡支持 Direct3D 12 feature level 11\_0。

### TXAA 支持

TXAA 是英偉達設計的新的抗鋸齒技術，需要遊戲引擎直接實現在其中，且僅限於 Kepler 系列 GPU。TXAA 基於多重採樣抗鋸齒和定製的濾鏡。TXAA 被用來解決一個遊戲中的關鍵問題：閃爍或 temporal aliasing。TXAA 通過柔化動態場景來確保遊戲內的場景不包含任何的鋸齒和閃爍。

### Shuffle 指令

在底層，GK110 擁有額外的指令和操作來進一步提升性能。新的 shuffle 指令允許在一個 wrap 內的執行緒在不訪問內存的情況下共享數據，使得整個過程比原來的 load/share/store 方式更加迅速。原子操作也被重新設計使得原子操作的速度得以提升。同時還添加了一些原本只針對單精度浮點的操作的雙精度支持。

### Hyper-Q

Hyper-Q 將 GK110 的硬體工作隊列從原本的唯一一個提升到 32 個。在 Fermi 架構中，有時唯一的工作隊列被占據時工作量其實並不夠讓每個流處理器都有工作。而擁有 32 個工作隊列，GK110 在很多情形下可以使得原本空閒的 SMX 工作起來從而達到更高的利用率。Hyper-Q 的這種特質還因為它能夠被更輕易地映射到 MPI—— 一個常見的在高性能計算中使用的通訊接口 —— 而被進一步增強。傳統的為多個處理器系統設計的基於 MPI 的算法所面臨的錯誤依賴問題通過 Hyper-Q 得到了解決。通過增加 MPI 工作的數量，程式設計師將可以在不修改代碼的情況下應用 Hyper-Q 來提升算法性能。

### 動態並行

動態並行（Dynamic Parallelism）能夠使 kernel（核函數）有能力分發其他 kernel。在 Fermi 架構中，只有 CPU 可以分發 kernel，因此增加了與 CPU 通信的開銷。而通過給 kernel 分配子 kernel 的能力，GK110 可以既可以減少與 CPU 的通訊開銷，還可以讓 CPU 空下來去執行其他任務。

### Grid 管理單元

為了能夠使用動態並行，GPU 需要一個新的 grid 管理系統和分發控制系統。新的 Grid 管理單元（Grid Management Unit，GMU）管理 grid 的執行並決定它們執行的優先級。GMU 可以暫停新的 grid 的分發、將 grid 放入隊列和終止 grid 直到它們準備好被執行。這樣，GMU 將能夠提供支持運行如動態並行這樣強大的運行時的靈活性。
在 Kepler 架構中，CUDA Work Distributor（CWD）記憶著將要被分發的 grid。新的 CWD 有能力分發 32 個活動的 grid，較 Fermi 架構的 CWD 翻了一倍。Kepler 架構的 CWD 與 GMU 通過一個雙向連接進行交互，使得 GMU 能夠暫停分發新的 grid、待機和甚至終止 grid 直到 CWD 需要。GMU 同時也有一個與 SMX 單元的單向連接使得用動態並行來添加新工作的 grid 能夠將新工作傳回給 GMU 進行排優先級和分發。如果添加新工作的 kernel 暫停了，GMU 將會保持其休眠直到它依賴的工作完成。

### NVIDIA GPUDirect

NVIDIA GPUDirect 是一項允許在同一台電腦或在網絡中的多台伺服器的 GPU 可以在不需訪問 CPU 和系統內存的情況下交換數據的技術。GPUDirect 的 RDMA 功能能夠使第三方設備如 SSD、NIC 和 IB 適配器等直接訪問同一台機器上多個 GPU 的內存，從而顯著降低經由 MPI 讀寫 GPU 內存的延遲。 這項技術同時減輕了對系統內存帶寬的需求，並且使得 GPU 的 DMA 能夠空閒出來來執行其他 CUDA 任務。基於 Kepler 架構的 GK110 還支持包括 P2P 和 GPUDirect for Video 等 GPUDirect 功能。

### 視頻解碼 / 編碼

#### NVDEC

#### NVENC

NVENC 時英偉達的高效率固定編碼引擎，能夠解碼、預處理和編碼 H.264 內容。NVENC 的輸入編碼僅限於 H.264。然而彌補這塊短板的是 NVENC 可以編碼 4096x4096 的內容。

如同 Intel 的 Quick Sync 技術，NVENC 的使用需要用到專有的 API。然而英偉達並沒有計劃提供在 CUDA 內調用 NVENC 的方法。

## 性能

Kepler 架構的 GPU 的理論單精度浮點運算能力以 GFLOPS 為單位大約為 2 (操作每 FMA 指令每 CUDA 核心每指令周期) × CUDA 核心數 × 核心速度（以 GHz 為單位）。值得注意的是和上代的 Fermi 架構一樣，Kepler 架構不能像 Tesla 架構一樣通過雙發射 MAD 和 MUL 指令來提升處理性能。

基於 Kepler 架構的 GK110/210 GPU 的理論雙精度浮點性能大約為其單精度浮點性能的 1/3。然而這個性能指標僅在專業級的 NVIDIA Quadro、NVIDIA Tesla 顯卡和高端的 GeForce TITAN 顯卡上提供。面向普通消費者的 GeForce 顯卡驅動限制了雙精度浮點性能到單精度浮點性能的 1/24。 GK10x 的雙精度浮點性能也被類似地限制到了單精度浮點性能的 1/24。

## 基於 Kepler 架構的晶片

* GK104
* GK106
* GK107
* GK110
* GK208
* GK210
* GK20A (圖睿)

## 注釋

## 參見

* NVIDIA 顯示核心列表

## 參考文獻