CUDA Programming GuideCUDA 编程指南中文图解
首页
阅读地图
1.1 Introduction
PDF 图版
  • 源代码仓库(GitHub)
  • CUDA Programming Guide Release 13.3
  • NVIDIA 官方在线目录
  • 本地原始 PDF
首页
阅读地图
1.1 Introduction
PDF 图版
  • 源代码仓库(GitHub)
  • CUDA Programming Guide Release 13.3
  • NVIDIA 官方在线目录
  • 本地原始 PDF
  • 5. Technical Appendices

    • 5.1 计算能力(Compute Capabilities)
    • 5.2 CUDA 环境变量(CUDA Environment Variables)
    • 5.3 C++ 语言支持(C++ Language Support)
    • 5.4 C/C++ 语言扩展(C/C++ Language Extensions)
    • 5.5 浮点计算(Floating-Point Computation)
    • 5.6 设备可调用 API 与内建函数(Device-Callable APIs and Intrinsics)
    • 5.7 CUDA C++ 内存模型(CUDA C++ Memory Model)
    • 5.8 CUDA C++ 执行模型(CUDA C++ Execution model)

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 目标可用功能的超集。

表 28 系列特定兼容性(Family-Specific Compatibility)
编译目标(Compilation Target)兼容的计算能力(Compatible with Compute Capability)
compute_100f10.010.3
compute_103f10.3[1]
compute_110f11.0[1]
compute_120f12.012.1
compute_121f12.1[1]

[1] 某些系列在创建时只包含一个成员。未来可能扩展这些系列,使其包含更多设备。

5.1.3 功能与技术规格(Features and Technical Specifications)

表 29 各计算能力的功能支持(Feature Support per Compute Capability)
功能支持(Feature Support)计算能力(Compute Capability)
(未列出的功能在所有计算能力上都受支持)7.x8.x9.010.x11.012.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。

表 30 各计算能力的设备和流式多处理器(SM)信息(Device and Streaming Multiprocessor (SM) Information per Compute Capability)
计算能力(Compute Capability)
7.58.08.68.78.99.010.010.311.012.x
FP32 与 FP64 吞吐量之比[2]32:12:164:12:164: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 数163216243224
每个 SM 的最大常驻 warp 数3264486448
每个 SM 的最大常驻线程数10242048153620481536
Green Contexts:useFlags 为 0 时的最小 SM 分区大小248
Green Contexts:useFlags 为 0 时每个分区的 SM 协同调度对齐量28

[2] 非 Tensor Core 吞吐量。有关吞吐量的更多信息,请参阅 CUDA Best Practices Guide。

表 31 各计算能力的内存信息(Memory Information per Compute Capability)
计算能力(Compute Capability)
7.58.08.68.78.99.010.x11.012.x
每个 SM 的 32 位寄存器数量64 K
每个 thread block 的最大 32 位寄存器数量64 K
每个线程的最大 32 位寄存器数量255
每个 SM 的最大 shared memory 数量64 KB164 KB100 KB164 KB100 KB228 KB100 KB
每个 thread block 的最大 shared memory 数量[3]64 KB163 KB99 KB163 KB99 KB227 KB99 KB
shared memory bank 数量32
每个线程的最大 local memory 数量512 KB
constant memory 大小64 KB
每个 SM 的 constant memory 缓存工作集8 KB
每个 SM 的 texture memory 缓存工作集32 或 64 KB28 KB ~ 192 KB28 KB ~ 128 KB28 KB ~ 192 KB28 KB ~ 128 KB28 KB ~ 256 KB28 KB ~ 128 KB

[3] 依赖每个 block 超过 48 KB shared memory 分配的 kernel,必须使用 dynamic shared memory 并显式选择启用,见[配置 L1/Shared Memory 平衡](../03-advanced-cuda/advanced-kernel-programming.html#advanced-kernel-l1-shared-config)。

表 32 各计算能力的 shared memory 容量(Shared Memory Capacity per Compute Capability)
计算能力(Compute Capability)统一数据缓存大小(KB)SMEM 容量大小(KB)
7.59632, 64
8.01920, 8, 16, 32, 64, 100, 132, 164
8.61280, 8, 16, 32, 64, 100
8.71920, 8, 16, 32, 64, 100, 132, 164
8.91280, 8, 16, 32, 64, 100
9.02560, 8, 16, 32, 64, 100, 132, 164, 196, 228
10.x2560, 8, 16, 32, 64, 100, 132, 164, 196, 228
11.02560, 8, 16, 32, 64, 100, 132, 164, 196, 228
12.x1280, 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)及相关计算。

表 33 各计算能力支持 Tensor Core 加速的输入数据类型(Input Data Types Supported by Tensor Core Acceleration per Compute Capability)
计算能力(Compute Capability)Tensor Core 输入数据类型(Tensor Core Input Data Types)
FP64TF32BF16FP16FP8FP6FP4INT8INT4
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)
Next
5.2 CUDA 环境变量(CUDA Environment Variables)