5.1. 计算能力
计算设备的一般规格和功能取决于其计算能力(参见计算能力与流式多处理器版本)。
表 29、表 30和表 31展示了当前支持的各个计算能力所对应的功能和技术规格。
所有 NVIDIA GPU 架构均使用小端表示法。
5.1.1. 获取 GPU 计算能力
CUDA GPU 计算能力页面提供了 NVIDIA GPU 型号与其计算能力之间的完整映射。
也可以使用随NVIDIA 驱动程序提供的nvidia-smi工具来获取 GPU 的计算能力。例如,以下命令将输出系统上可用的 GPU 名称和计算能力:
nvidia-smi --query-gpu=name,compute_cap
在运行时,可以使用 CUDA 运行时 APIcudaDeviceGetAttribute()、CUDA 驱动程序 APIcuDeviceGetAttribute()或 NVML APInvmlDeviceGetCudaComputeCapability()获取计算能力:
#include <cuda_runtime_api.h>
int computeCapabilityMajor, computeCapabilityMinor;
cudaDeviceGetAttribute(&computeCapabilityMajor, cudaDevAttrComputeCapabilityMajor, device_id);
cudaDeviceGetAttribute(&computeCapabilityMinor, cudaDevAttrComputeCapabilityMinor, device_id);
#include <cuda.h>
int computeCapabilityMajor, computeCapabilityMinor;
cuDeviceGetAttribute(&computeCapabilityMajor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, device_id);
cuDeviceGetAttribute(&computeCapabilityMinor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, device_id);
#include <nvml.h> // required linking with -lnvidia-ml
int computeCapabilityMajor, computeCapabilityMinor;
nvmlDeviceGetCudaComputeCapability(nvmlDevice, &computeCapabilityMajor, &computeCapabilityMinor);
5.1.2. 功能可用性
随某种计算架构引入的大多数计算功能都旨在供所有后续架构使用。表 29通过在某项功能引入之后的计算能力中将该功能的可用性标为“是”来表示这一点。
5.1.2.1. 架构特定功能
从计算能力 9.0 的设备开始,随某种架构引入的专用计算功能可能无法保证在所有后续计算能力上均可用。这些功能称为架构特定功能,旨在加速专用运算,例如张量核心运算,这些运算并非适用于所有类别的计算能力,或者可能会在未来的几代架构中发生重大变化。代码必须使用架构特定编译器目标进行编译(参见功能集编译器目标),才能启用架构特定功能。使用架构特定编译器目标编译的代码只能在与编译时所针对的计算能力完全相同的计算能力上运行。
5.1.2.2. 系列特定功能
从计算能力 10.0 的设备开始,一些架构特定功能由多种计算能力的设备共有。包含这些功能的设备属于同一系列,这些功能也可称为系列特定功能。系列特定功能保证在同一系列的所有设备上均可用。启用系列特定功能需要使用系列特定编译器目标。参见第 5.1.2.3 节。针对系列特定目标编译的代码只能在属于该系列的 GPU 上运行。
5.1.2.3. 功能集编译器目标
编译器可以针对三组计算功能进行编译:
基线功能集:占主导地位的一组计算功能,引入这些功能的目的是使其可用于后续计算架构。表 29汇总了这些功能及其可用性。
架构特定功能集:一小组高度专门化的功能,称为架构特定功能,引入它们是为了加速专用运算,但不保证其在后续计算架构上可用,或者它们可能会发生重大变化。相应的“计算能力 #.#”小节汇总了这些功能。架构特定功能集是系列特定功能集的超集。架构特定编译器目标随计算能力 9.0 的设备一同引入,可通过在编译目标中使用a后缀来选择,例如,将compute_100a或compute_120a指定为计算目标。
系列特定功能集:一些架构特定功能由多种计算能力的 GPU 共有。相应的“计算能力 #.#”小节汇总了这些功能。除少数例外,具有相同计算能力主版本号的后续几代设备均属于同一系列。表 28列出了系列特定目标与设备计算能力之间的兼容性,包括例外情况。系列特定功能集是基线功能集的超集。系列特定编译器目标随计算能力 10.0 的设备一同引入,可通过在编译目标中使用f后缀来选择,例如,将compute_100f或compute_120f指定为计算目标。
从计算能力 9.0 开始,所有设备都具有一组架构特定功能。要在特定 GPU 上使用这些功能的完整集合,必须使用带有a后缀的架构特定编译器目标。此外,从计算能力 10.0 开始,存在一些功能集,它们出现在具有不同计算能力次版本号的多个设备中。这些指令集称为系列特定功能,共有这些功能的设备被称为属于同一系列。系列特定功能是该 GPU 系列所有成员共有的架构特定功能的一个子集。带有f后缀的系列特定编译器目标允许编译器生成使用这一架构特定功能公共子集的代码。
例如:
compute_100编译目标不允许使用架构特定功能。此目标将兼容计算能力为 10.0 及更高版本的所有设备。compute_100f系列特定编译目标允许使用整个 GPU 系列共有的架构特定功能子集。此目标将仅兼容属于该 GPU 系列的设备。在此示例中,它兼容计算能力为 10.0、10.3 和 10.7 的设备。系列特定compute_100f目标中可用的功能是基线compute_100目标中可用功能的超集。compute_100a架构特定编译目标允许使用计算能力 10.0 设备中的全部架构特定功能。此目标将仅兼容计算能力为 10.0 的设备,而不兼容其他任何设备。compute_100a目标中可用的功能构成了compute_100f目标中可用功能的超集。
5.1.3. 功能和技术规格
功能支持 |
计算能力 |
|||||
|---|---|---|---|---|---|---|
(所有计算能力均支持未列出的功能) |
7.x |
8.x |
9.0 |
10.x |
11.0 |
12.x |
对共享内存和全局内存中的 128 位整数值进行操作的原子函数(原子函数) |
否 |
是 |
||||
对全局内存中的 |
否 |
是 |
||||
线程束归约函数(线程束归约函数) |
否 |
是 |
||||
Bfloat16 精度浮点运算 |
否 |
是 |
||||
128 位精度浮点运算 |
否 |
是 |
||||
硬件加速的 |
否 |
是 |
||||
硬件加速的到达/等待分离式屏障(异步屏障) |
否 |
是 |
||||
L2 缓存驻留管理(L2 缓存控制) |
否 |
是 |
||||
用于加速动态规划的 DPX 指令(动态规划扩展(DPX)指令) |
多条指令 |
原生 |
多条指令 |
|||
分布式共享内存 |
否 |
是 |
||||
线程块簇(线程块簇) |
否 |
是 |
||||
张量内存加速器(TMA)单元(使用张量内存加速器(TMA)) |
否 |
是 |
||||
请注意,下列表格中使用的单位 KB 和 K 分别对应 1024 字节(即一个 KiB)和 1024。
计算能力 |
|||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
7.5 |
8.0 |
8.6 |
8.7 |
8.9 |
9.0 |
10.0 |
10.3 |
10.7 |
11.0 |
12.x |
|
FP32 与 FP64 吞吐量之比[2] |
32:1 |
2:1 |
64:1 |
2:1 |
64:1 |
4:1 |
64:1 |
||||
每个设备的最大驻留网格数(并发核函数执行) |
128 |
||||||||||
网格的最大维数 |
3 |
||||||||||
网格在 x 维上的最大尺寸 |
231-1 |
||||||||||
网格在 y 维或 z 维上的最大尺寸 |
65535 |
||||||||||
线程块的最大维数 |
3 |
||||||||||
线程块在 x 维或 y 维上的最大尺寸 |
1024 |
||||||||||
线程块在 z 维上的最大尺寸 |
64 |
||||||||||
每个线程块的最大线程数 |
1024 |
||||||||||
线程束大小 |
32 |
||||||||||
每个 SM 的最大驻留线程块数 |
16 |
32 |
16 |
24 |
32 |
16 |
24 |
||||
每个 SM 的最大驻留线程束数 |
32 |
64 |
48 |
64 |
32 |
48 |
|||||
每个 SM 的最大驻留线程数 |
1024 |
2048 |
1536 |
2048 |
1024 |
1536 |
|||||
绿色上下文:useFlags 为 0 时的最小 SM 分区大小 |
2 |
4 |
8 |
||||||||
绿色上下文:useFlags 为 0 时每个分区的 SM 协同调度对齐要求 |
2 |
8 |
|||||||||
非张量核心的吞吐量。有关吞吐量的更多信息,请参阅CUDA 最佳实践指南
计算能力 |
|||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
7.5 |
8.0 |
8.6 |
8.7 |
8.9 |
9.0 |
10.0 |
10.3 |
10.7 |
11.0 |
12.x |
|
每个 SM 的 32 位寄存器数量 |
64 K |
||||||||||
每个线程块的最大 32 位寄存器数量 |
64 K |
||||||||||
每个线程的最大 32 位寄存器数量 |
255 |
||||||||||
每个 SM 的最大共享内存容量 |
64 KB |
164 KB |
100 KB |
164 KB |
100 KB |
228 KB |
328 KB |
228 KB |
100 KB |
||
每个线程块的最大共享内存容量[3] |
64 KB |
163 KB |
99 KB |
163 KB |
99 KB |
227 KB |
327 KB |
227 KB |
99 KB |
||
共享内存存储体数量 |
32 |
||||||||||
每个线程的最大局部内存容量 |
512 KB |
||||||||||
常量内存大小 |
64 KB |
||||||||||
每个 SM 的常量内存缓存工作集 |
8 KB |
||||||||||
每个 SM 的纹理内存缓存工作集 |
32 或 64 KB |
28 KB ~ 192 KB |
28 KB ~ 128 KB |
28 KB ~ 192 KB |
28 KB ~ 128 KB |
28 KB ~ 256 KB |
8 KB ~ 256 KB |
28 KB ~ 256 KB |
28 KB ~ 128 KB |
||
对于依赖每个线程块超过 48 KB 共享内存分配的核函数,必须使用动态共享内存,并且需要显式选择启用,参见配置 L1/共享内存平衡。
计算能力 |
统一数据缓存大小(KB) |
SMEM 容量大小(KB) |
|---|---|---|
7.5 |
96 |
32, 64 |
8.0 |
192 |
0, 8, 16, 32, 64, 100, 132, 164 |
8.6 |
128 |
0, 8, 16, 32, 64, 100 |
8.7 |
192 |
0, 8, 16, 32, 64, 100, 132, 164 |
8.9 |
128 |
0, 8, 16, 32, 64, 100 |
9.0 |
256 |
0, 8, 16, 32, 64, 100, 132, 164, 196, 228 |
10.0 |
256 |
0, 8, 16, 32, 64, 100, 132, 164, 196, 228 |
10.3 |
256 |
0, 8, 16, 32, 64, 100, 132, 164, 196, 228 |
10.7 [4] |
336 |
0, 8, 16, 32, 64, 100, 132, 164, 196, 228, 328 |
11.0 |
256 |
0, 8, 16, 32, 64, 100, 132, 164, 196, 228 |
12.x |
128 |
0, 8, 16, 32, 64, 100 |
对于计算能力为 10.7 的设备,使用 328 KB 共享内存配置的核函数必须通过设置cudaFuncAttributeSharedMemoryMode函数属性或cudaLaunchAttributeSharedMemoryMode启动属性来显式启用cudaSharedMemoryModeAllowOversizedSharedMemory。
表 33展示了张量核心加速所支持的输入数据类型。在 CUDA 编译工具链中,可以通过内联 PTX 使用张量核心功能集。强烈建议应用程序通过 CUDA-X 库(例如 cuDNN、cuBLAS 和 cuFFT)或通过CUTLASS来使用此功能集,后者是一组 CUDA C++ 模板抽象和 Python 领域特定语言(DSL),旨在实现 CUDA 内各个层级的高性能矩阵-矩阵乘法(GEMM)及相关计算。
计算能力 |
张量核心输入数据类型 |
||||||||
|---|---|---|---|---|---|---|---|---|---|
FP64 |
TF32 |
BF16 |
FP16 |
FP8 |
FP6 |
FP4 |
INT8 |
INT4 |
|
7.5 |
是 |
是 |
是 |
||||||
8.0 |
是 |
是 |
是 |
是 |
是 |
是 |
|||
8.6 |
是 |
是 |
是 |
是 |
是 |
||||
8.7 |
是 |
是 |
是 |
是 |
是 |
||||
8.9 |
是 |
是 |
是 |
是 |
是 |
是 |
|||
9.0 |
是 |
是 |
是 |
是 |
是 |
是 |
|||
10.0 |
是 |
是 |
是 |
是 |
是 |
是 |
是 |
是 |
|
10.3 |
是 |
是 |
是 |
是 |
是 |
是 |
是 |
||
10.7 |
是 |
是 |
是 |
是 |
是 |
是 |
是 |
||
11.0 |
是 |
是 |
是 |
是 |
是 |
是 |
是 |
||
12.x |
是 |
是 |
是 |
是 |
是 |
是 |
是 |
||