Compute Capabilities

16.7. 计算能力 8.x

16.7.1. 架构

流处理器(SM)包括:

  • 在计算能力为 8.0 的设备中有 64 个 FP32 核心用于单精度算术运算,而在计算能力为 8.6、8.7 和 8.9 的设备中有 128 个 FP32 核心,
  • 在计算能力为 8.0 的设备中有 32 个 FP64 核心用于双精度算术运算,在计算能力为 8.6、8.7 和 8.9 的设备中有 2 个 FP64 核心,
  • 64 个 INT32 核心用于整数运算,
  • 4 个混合精度的第三代张量核心,支持半精度(fp16)、__nv_bfloat16tf32、子字节和双精度(fp64)矩阵运算,适用于计算能力为 8.0、8.6 和 8.7 的设备(详情见 Warp 矩阵函数),
  • 4 个混合精度的第四代张量核心,支持 fp8fp16__nv_bfloat16tf32、子字节和 fp64,适用于计算能力为 8.9 的设备(详情见 Warp 矩阵函数),
  • 16 个专用函数单元用于单精度浮点超越函数,
  • 4 个 warp 调度器。

SM 静态地将其 warps 分配给各自的调度器。然后,在每个指令发出时间,每个调度器为其分配的、准备好执行的一个 warp 发出一个指令,如果有的话。

一个 SM 拥有:

  • 一个只读的常量缓存,由所有功能单元共享,用于加速从设备内存中的常量内存空间的读取,
  • 一个统一的数据缓存和共享内存,总大小为 192 KB,适用于计算能力为 8.0 和 8.7 的设备(是 Volta 的 128 KB 容量的 1.5 倍)和 128 KB,适用于计算能力为 8.6 和 8.9 的设备。

共享内存从统一数据缓存中划分出来,可以配置为各种大小(见 共享内存 部分)。剩余的数据缓存用作 L1 缓存,并且也被纹理单元使用,该单元实现了在 纹理和表面内存 中提到的各种寻址和数据过滤模式。

16.7.2. 全局内存

全局内存的行为与计算能力 5.x 的设备相同(见 全局内存)。

16.7.3. 共享内存

类似于 Volta 架构,保留给共享内存的统一数据缓存量可以根据每个内核进行配置。对于 NVIDIA Ampere GPU 架构,计算能力为 8.0 和 8.7 的设备的统一数据缓存大小为 192 KB,计算能力为 8.6 和 8.9 的设备为 128 KB。计算能力为 8.0 和 8.7 的设备的共享内存容量可以设置为 0、8、16、32、64、100、132 或 164 KB,计算能力为 8.6 和 8.9 的设备可以设置为 0、8、16、32、64 或 100 KB。

应用程序可以使用 cudaFuncSetAttribute() 设置 carveout,即首选的共享内存容量。

cudaFuncSetAttribute(kernel_name, cudaFuncAttributePreferredSharedMemoryCarveout, carveout);

API 可以将 carveout 指定为计算能力 8.0 和 8.7 设备支持的最大共享内存容量 164 KB 和计算能力 8.6 和 8.9 设备的 100 KB 的整数百分比,或者以下值之一:{cudaSharedmemCarveoutDefaultcudaSharedmemCarveoutMaxL1cudaSharedmemCarveoutMaxShared。当使用百分比时,carveout 将四舍五入到最接近的支持的共享内存容量。例如,对于计算能力为 8.0 的设备,50% 将映射到 100 KB 的 carveout,而不是 82 KB。设置 cudaFuncAttributePreferredSharedMemoryCarveout 被驱动程序视为提示;如有需要,驱动程序可能选择不同的配置。

计算能力为 8.0 和 8.7 的设备允许单个线程块寻址高达 163 KB 的共享内存,而计算能力为 8.6 和 8.9 的设备允许高达 99 KB 的共享内存。依赖于每个块超过 48 KB 的共享内存分配的内核是特定于架构的,并且必须使用动态共享内存而不是静态大小的共享内存数组。这些内核需要通过使用 cudaFuncSetAttribute() 显式选择加入,以设置 cudaFuncAttributeMaxDynamicSharedMemorySize;见 Volta 架构的共享内存

请注意,每个线程块的最大共享内存量小于每个 SM 可用的最大共享内存分区。不提供给线程块的 1 KB 共享内存保留供系统使用。