5.1 计算能力(Compute Capabilities)
计算设备的一般规格和功能取决于其计算能力(见计算能力与流式多处理器版本)。
表 29、表 30和表 31展示了当前支持的各个计算能力对应的功能与技术规格。
所有 NVIDIA GPU 架构都使用小端表示。
5.1.1 获取 GPU 计算能力(Obtain the GPU Compute Capability)
CUDA GPU 计算能力页面提供了 NVIDIA GPU 型号与其计算能力之间的完整对应关系。
另外,也可以使用随NVIDIA 驱动程序提供的nvidia-smi工具获取 GPU 的计算能力。例如,下面的命令会输出系统中可用的 GPU 名称和计算能力:
nvidia-smi --query-gpu=name,compute_cap
在运行时,可以通过 CUDA Runtime API 的 cudaDeviceGetAttribute()、CUDA Driver API 的 cuDeviceGetAttribute()或 NVML API 的 nvmlDeviceGetCudaComputeCapability()获取计算能力:
#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 功能可用性(Feature Availability)
某个计算架构引入的大多数计算功能,预期会在之后的所有架构上可用。在表 29中,对于引入该功能之后的计算能力,会以“是(Yes)”表示该功能可用。
5.1.2.1 架构特定功能(Architecture-Specific Features)
从计算能力 9.0 的设备开始,某个架构引入的专用计算功能可能不保证在之后的所有计算能力上可用。这些功能称为*架构特定(architecture-specific)*功能,目标是加速专用操作,例如 Tensor Core 操作;这些操作并非面向所有类别的计算能力,或者在未来代际中可能发生重大变化。必须使用架构特定编译器目标(见功能集编译器目标)编译代码,才能启用架构特定功能。使用架构特定编译器目标编译的代码,只能在编译时所针对的确切计算能力上运行。
5.1.2.2 系列特定功能(Family-Specific Features)
从计算能力 10.0 的设备开始,一些架构特定功能会由多个计算能力的设备共同拥有。包含这些功能的设备属于同一系列,这些功能也可以称为*系列特定(family-specific)*功能。系列特定功能保证在同一系列的所有设备上可用。启用系列特定功能需要使用系列特定编译器目标,详见第 5.1.2.3 节。针对系列特定目标编译的代码,只能在属于该系列的 GPU 上运行。
5.1.2.3 功能集编译器目标(Feature Set Compiler Targets)
编译器可以针对三组计算功能:
基线功能集(Baseline Feature Set):以可在后续计算架构上使用为目标而引入的、占主导地位的一组计算功能。这些功能及其可用性汇总在表 29中。
架构特定功能集(Architecture-Specific Feature Set):一组规模较小且高度专用的功能,称为架构特定功能。这些功能用于加速专用操作,但不保证在后续计算架构上可用,或者可能发生重大变化。这些功能汇总在相应的“计算能力 #.#”小节中。架构特定功能集是系列特定功能集的超集。架构特定编译器目标随计算能力 9.0 设备引入,在编译目标中使用 a 后缀选择,例如将 compute_100a 或 compute_120a 指定为计算目标。
系列特定功能集(Family-Specific Feature Set):一些架构特定功能由多个计算能力的 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 的设备兼容。系列特定compute_100f目标可用的功能是基线compute_100目标可用功能的超集。架构特定编译目标
compute_100a允许在计算能力 10.0 设备上使用完整的架构特定功能集合。该目标只与计算能力 10.0 的设备兼容,不与其他计算能力兼容。compute_100a目标可用的功能是compute_100f目标可用功能的超集。
| 编译目标(Compilation Target) | 兼容的计算能力(Compatible with Compute Capability) | |
|---|---|---|
compute_100f | 10.0 | 10.3 |
compute_103f | 10.3[1] | |
compute_110f | 11.0[1] | |
compute_120f | 12.0 | 12.1 |
compute_121f | 12.1[1] | |
[1] 某些系列在创建时只包含一个成员。未来可能扩展这些系列,使其包含更多设备。
5.1.3 功能与技术规格(Features and Technical Specifications)
| 功能支持(Feature Support) | 计算能力(Compute Capability) | |||||
|---|---|---|---|---|---|---|
| (未列出的功能在所有计算能力上都受支持) | 7.x | 8.x | 9.0 | 10.x | 11.0 | 12.x |
| 在 shared memory 和 global memory 中对 128 位整数值执行原子操作(Atomic Functions) | 否(No) | 是(Yes) | ||||
在 global memory 中对 float2 和 float4 浮点向量执行原子加法(atomicAdd()) | 否(No) | 是(Yes) | ||||
| Warp 归约函数(Warp Reduce Functions) | 否(No) | 是(Yes) | ||||
| Bfloat16 精度浮点运算 | 否(No) | 是(Yes) | ||||
| 128 位精度浮点运算 | 否(No) | 是(Yes) | ||||
硬件加速的 memcpy_async(Pipelines) | 否(No) | 是(Yes) | ||||
| 硬件加速的 Split Arrive/Wait Barrier(分离式到达/等待屏障)(Asynchronous Barriers) | 否(No) | 是(Yes) | ||||
| L2 Cache 驻留管理(L2 Cache Control) | 否(No) | 是(Yes) | ||||
| 用于加速动态规划的 DPX 指令(Dynamic Programming eXtension (DPX) Instructions) | 多条指令(Multiple Instr.) | 原生(Native) | 多条指令(Multiple Instr.) | |||
| 分布式共享内存(Distributed Shared Memory) | 否(No) | 是(Yes) | ||||
| 线程块集群(Thread Block Clusters) | 否(No) | 是(Yes) | ||||
| Tensor Memory Accelerator(TMA)单元(使用 Tensor Memory Accelerator(TMA)) | 否(No) | 是(Yes) | ||||
注意,下面各表使用的 KB 和 K 单位分别对应 1024 字节(即 KiB)和 1024。
| 计算能力(Compute Capability) | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 7.5 | 8.0 | 8.6 | 8.7 | 8.9 | 9.0 | 10.0 | 10.3 | 11.0 | 12.x | |
| FP32 与 FP64 吞吐量之比[2] | 32:1 | 2:1 | 64:1 | 2:1 | 64:1 | |||||
| 每个设备的最大常驻 grid 数量(并发 kernel 执行) | 128 | |||||||||
| grid 的最大维度 | 3 | |||||||||
| grid 的最大 x 维度 | 231-1 | |||||||||
| grid 的最大 y 或 z 维度 | 65535 | |||||||||
| thread block 的最大维度 | 3 | |||||||||
| thread block 的最大 x 或 y 维度 | 1024 | |||||||||
| thread block 的最大 z 维度 | 64 | |||||||||
| 每个 block 的最大线程数 | 1024 | |||||||||
| Warp 大小 | 32 | |||||||||
| 每个 SM 的最大常驻 block 数 | 16 | 32 | 16 | 24 | 32 | 24 | ||||
| 每个 SM 的最大常驻 warp 数 | 32 | 64 | 48 | 64 | 48 | |||||
| 每个 SM 的最大常驻线程数 | 1024 | 2048 | 1536 | 2048 | 1536 | |||||
| Green Contexts:useFlags 为 0 时的最小 SM 分区大小 | 2 | 4 | 8 | |||||||
| Green Contexts:useFlags 为 0 时每个分区的 SM 协同调度对齐量 | 2 | 8 | ||||||||
[2] 非 Tensor Core 吞吐量。有关吞吐量的更多信息,请参阅 CUDA Best Practices Guide。
| 计算能力(Compute Capability) | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| 7.5 | 8.0 | 8.6 | 8.7 | 8.9 | 9.0 | 10.x | 11.0 | 12.x | |
| 每个 SM 的 32 位寄存器数量 | 64 K | ||||||||
| 每个 thread block 的最大 32 位寄存器数量 | 64 K | ||||||||
| 每个线程的最大 32 位寄存器数量 | 255 | ||||||||
| 每个 SM 的最大 shared memory 数量 | 64 KB | 164 KB | 100 KB | 164 KB | 100 KB | 228 KB | 100 KB | ||
| 每个 thread block 的最大 shared memory 数量[3] | 64 KB | 163 KB | 99 KB | 163 KB | 99 KB | 227 KB | 99 KB | ||
| shared memory bank 数量 | 32 | ||||||||
| 每个线程的最大 local memory 数量 | 512 KB | ||||||||
| constant memory 大小 | 64 KB | ||||||||
| 每个 SM 的 constant memory 缓存工作集 | 8 KB | ||||||||
| 每个 SM 的 texture memory 缓存工作集 | 32 或 64 KB | 28 KB ~ 192 KB | 28 KB ~ 128 KB | 28 KB ~ 192 KB | 28 KB ~ 128 KB | 28 KB ~ 256 KB | 28 KB ~ 128 KB | ||
| 计算能力(Compute Capability) | 统一数据缓存大小(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.x | 256 | 0, 8, 16, 32, 64, 100, 132, 164, 196, 228 |
| 11.0 | 256 | 0, 8, 16, 32, 64, 100, 132, 164, 196, 228 |
| 12.x | 128 | 0, 8, 16, 32, 64, 100 |
表 33展示了 Tensor Core 加速支持的输入数据类型。Tensor Core 功能集可以通过 inline PTX 在 CUDA 编译工具链中使用。强烈建议应用通过 cuDNN、cuBLAS 和 cuFFT 等 CUDA-X 库使用该功能集,或者使用CUTLASS。CUTLASS 是一组 CUDA C++ 模板抽象和 Python 领域特定语言(DSL),旨在支持 CUDA 各个层级上的高性能矩阵-矩阵乘法(GEMM)及相关计算。
| 计算能力(Compute Capability) | Tensor Core 输入数据类型(Tensor Core Input Data Types) | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| FP64 | TF32 | BF16 | FP16 | FP8 | FP6 | FP4 | INT8 | INT4 | |
| 7.5 | 是(Yes) | 是(Yes) | 是(Yes) | ||||||
| 8.0 | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | |||
| 8.6 | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | ||||
| 8.7 | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | ||||
| 8.9 | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | |||
| 9.0 | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | |||
| 10.0 | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | |
| 10.3 | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | ||
| 11.0 | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | ||
| 12.x | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | 是(Yes) | ||
