跳转至

5.1 计算能力

本文档为 NVIDIA CUDA Programming Guide 官方文档中文翻译版

原文地址:https://docs.nvidia.com/cuda/cuda-programming-guide/05-appendices/compute-capabilities.html


此页面是否有帮助?

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 运行时 API cudaDeviceGetAttribute()、CUDA 驱动程序 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> // 需要链接 -lnvidia-ml

int computeCapabilityMajor, computeCapabilityMinor;
nvmlDeviceGetCudaComputeCapability(nvmlDevice, &computeCapabilityMajor, &computeCapabilityMinor);

5.1.2. 特性可用性

随着计算架构引入的大多数计算特性,都旨在使其在后续的所有架构中可用。这在表 29 中通过某个特性在其引入后的计算能力上标记为“是”来表示其可用性。

5.1.2.1. 架构特定功能

从计算能力 9.0 的设备开始,随架构引入的专用计算功能可能无法保证在所有后续计算能力上都可用。这些功能被称为架构特定功能,旨在加速特定操作,例如 Tensor Core 操作,这些操作并非针对所有类别的计算能力设计,或者可能在未来的代次中发生重大变化。必须使用架构特定的编译器目标(参见功能集编译器目标)编译代码才能启用架构特定功能。使用架构特定编译器目标编译的代码只能在其编译所针对的精确计算能力上运行。

5.1.2.2. 系列特定功能

从计算能力 10.0 的设备开始,一些架构特定功能在多个计算能力的设备中是通用的。包含这些功能的设备属于同一系列,这些功能也可以称为系列特定功能。系列特定功能保证在同一系列的所有设备上都可用。需要系列特定的编译器目标来启用系列特定功能。参见第 5.1.2.3 节。为系列特定目标编译的代码只能在该系列成员的 GPU 上运行。

5.1.2.3. 功能集编译器目标

编译器可以针对三组计算功能进行目标设定:

基线功能集:引入的主要计算功能集,旨在使其在后续计算架构中可用。这些功能及其可用性总结在表 29 中。

架构特定功能集:一小部分高度专业化的功能,称为架构特定功能,引入它们是为了加速特定操作,这些功能不保证在后续计算架构中可用或可能发生重大变化。这些功能总结在相应的“计算能力 #.#”小节中。架构特定功能集是系列特定功能集的超集。架构特定编译器目标随计算能力 9.0 设备引入,通过在编译目标中使用 a 后缀来选择,例如,指定 compute_100acompute_120a 作为计算目标。

系列特定功能集:一些架构特定功能在多个计算能力的 GPU 中是通用的。这些功能总结在相应的“计算能力 #.#”小节中。除少数例外情况外,具有相同主计算能力的后续代次设备属于同一系列。表 28 说明了系列特定目标与设备计算能力的兼容性,包括例外情况。系列特定功能集是基线功能集的超集。系列特定编译器目标随计算能力 10.0 设备引入,通过在编译目标中使用 f 后缀来选择,例如,指定 compute_100fcompute_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 目标中可用功能的超集。
编译目标 兼容的计算能力
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 ] ( 1 , 2 , 3 )

某些系列在创建时仅包含单个成员。未来可能会扩展以包含更多设备。

5.1.3. 功能与技术规格

功能支持 计算能力
(未列出的功能在所有计算能力上都支持) 7.x 8.x 9.0 10.x 11.0 12.x
在共享内存和全局内存中对 128 位整数值进行操作的原子函数 ( Atomic Functions )
在全局内存中对 float2 和 float4 浮点向量进行操作的原子加法 ( atomicAdd() )
线程束归约函数 ( Warp Reduce Functions )
Bfloat16 精度浮点运算
128 位精度浮点运算
硬件加速的 memcpy_async(流水线)
硬件加速的分裂到达/等待屏障(异步屏障)
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 11.0 12.x
FP32 与 FP64 吞吐量之比 [ 2 ] 32:1 2:1 64:1 2: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 24
每个 SM 的最大常驻线程束数 32 64 48 64 48
每个 SM 的最大常驻线程数 1024 2048 1536 2048 1536
绿色上下文:useFlags 0 的最小 SM 分区大小 2 4 8
绿色上下文:useFlags 0 每个分区的 SM 协同调度对齐 2 8

[ 2 ]

非张量核心吞吐量。有关吞吐量的更多信息,请参阅 CUDA 最佳实践指南

计算能力
7.5 8.0 8.6 8.7 8.9 9.0 10.x 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 100 KB
每个线程块的最大共享内存量
每个线程块的共享内存容量 [3] 64 KB 163 KB 99 KB 163 KB 99 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 28 KB ~ 128 KB

[3] 依赖每个线程块分配超过 48 KB 共享内存的内核必须使用动态共享内存,并且需要显式选择加入,请参阅 配置 L1/共享内存平衡

计算能力 统一数据缓存大小 (KB) 共享内存容量大小 (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 功能集可通过内联 PTX 在 CUDA 编译工具链中使用。强烈建议应用程序通过 CUDA-X 库(例如 cuDNN、cuBLAS 和 cuFFT)或通过 CUTLASS 使用此功能集。CUTLASS 是一个 CUDA C++ 模板抽象和 Python 领域特定语言 (DSL) 的集合,旨在实现 CUDA 内所有级别的高性能矩阵-矩阵乘法 (GEMM) 及相关计算。

计算能力 Tensor Core 输入数据类型
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
11.0
12.x

本页