问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

英伟达GPU的硬件架构——显存带宽和算力

创作时间:
作者:
@小白创作中心

英伟达GPU的硬件架构——显存带宽和算力

引用
CSDN
1.
https://blog.csdn.net/xqch1983/article/details/141997588

CUDA是建立在英伟达GPU硬件架构之上的并行计算平台和编程模型。因此,就像要写好高性能的CPU程序,必须对CPU的硬件架构有一定的理解一样,我们写CUDA程序也必须对GPU有最基本的了解。

从冯诺依曼体系结构说起

众所周知,冯诺依曼体系结构是现代计算机的基础,它包含了五个基本部件:运算器、控制器、存储器、输入设备和输出设备。其中,运算器和控制器合称为中央处理器(CPU),存储器包括内存和外存,输入设备和输出设备合称为外设。CPU通过总线与内存和外设进行数据交换。


图 1. 冯诺依曼体系结构

经过近几十年的高速发展,这些基本部件都变得无比复杂且强大。对于CPU来说,它的核心频率已达到数GHz,核心数量也达到数十甚至上百个。而存储器则发展出了多层次的体系结构,包括一级缓存、二级缓存、三级缓存、内存、硬盘等。

但即便拥有这无与伦比速度的现代CPU+内存体系,人们仍然在不断尝试新的方法冲刺计算性能上限。随着摩尔定律逐渐失效,提高CPU频率变得越来越困难,因此提高处理器的核心数量就成了一种收效更好的方法。

通过提升处理器核心数量来提升计算性能这种思路促进了并行计算理论以及应用技术的发展,从而诞生了GPGPU这一概念。从体系结构上来看,GPU技术扩展了冯诺依曼结构中的运算单元,将其从单个变成了多个


图 2. GPU改进的冯诺依曼体系结构

也就是说,一个控制单元对应多个运算单元,这样一来,每条指令可以同时运行在多个运算单元上,这种模式也被称为SIMT(Single Instruction Multiple Thread,单指令多线程),SIMT是GPU实现SIMD (Single Instruction Multiple Data, 单指令多数据)的方式。

需要注意的是,GPU的这种创新与CPU的多核心不是一个层次的概念,多核CPU的每个物理核心仍然是单线程的(虽然CPU有超线程技术,但只是逻辑上的双核心)。另一方面,虽然CPU也能实现SIMD,但CPU的实现方式是增加寄存器宽度,然后使用扩展指令(SSE,AVX等)执行运算,从而达到向量化计算的效果。由于寄存器数量有限,因此CPU核心的并行能力相对于GPU来说是非常有限的。

流式多处理器 (Streaming Multiprocessor, SM)

流式多处理器可以看作是GPU的处理核心,同CPU的多核设计类似,GPU也有多个流式多处理器(通常远超CPU的核心数量),比如GA100有128个SM,GV100有84个SM。深入到SM内部来看,它又被划分成多个处理块(Processing Block),这里所谓的处理块就是我们前面提到的单指令多线程单元,它的控制单元包含指令缓存(Instruction Cache)、线程束调度器(Warp Scheduler)、分配单元(Dispatch Unit)等组件,而运算单元则包含一大堆各种类型的处理核心,官方术语叫流处理器(Stream Processor, SP),这些SP被分为多个组,有的负责INT运算,有的负责FP16运算,以及FP32,FP64等等,从软件层面来看,他们又被称为CUDA Core。值得一提的是,从Volta架构开始,英伟达引入了一种新的SP,叫做Tensor Core,专门用于加速矩阵运算。

图 3. GA100的SM结构图

内存层次结构

英伟达GPU的存储硬件设备主要由寄存器文件,L1缓存,L2缓存和GPU显存组成,其中L1缓存位于SM内部,L2缓存由所有SM共享。L1和L2缓存都是片上内存,因此相较于GPU显存来说,拥有更高的读写速度。


图 4. GPU的内存层次结构简化图

显存带宽 (Memory Bandwidth)

显存带宽是GPU的一项重要性能指标,它反映了SM在计算的过程中从显存中读写数据的速度,单位是(GB/s)。显然,由于在SM中还存在运算指令执行过程,所以实际的程序利用的有效带宽并不能完全达到显存带宽提供的理论上限。了解显存带宽的指导意义在于,可以帮助我们评估算法的硬件利用率,如果利用率太低,那么就需要考虑如何优化算法。

与显存相关的指标还有位宽(bus width),内存频率(clock rate)等,它们与带宽的关系如下:

BandWidth=2×MemClockRate×(BusWidth/8)

以A100 40G GPU为例,它的显存位宽为5120 bit,频率为1215 MHz,那么它的显存带宽就是

BandWidth=2×(1215MHz×10−3GHz/MHz)×(5120bit/(8bit/Byte))=1555GB/s

算力 (Performance)

GPU的算力是指其在单位时间内能够完成的浮点运算次数,常用单位有FLOPS,GFLOPS,TFLOPS,分别表示float operation per second,giga float operation per second,tera float operation per second。

由于GPU的计算核心被分成了多个数据类型,且每个数据类型的核心数量可能不同,所以GPU针对不同数据类型的算力也有可能是不同的。总的来说,GPU的理论峰值算力计算公式为

PeakPerf=2×CUDACores×BoostClockRate

其中CUDACores是特定数据类型的CUDA核心数量,BoostClockRate表示GPU的Boost频率。之所以这里还乘以2,是因为每个CUDA核心在每个时钟周期可以执行一次FMA操作,而每个FMA操作包含一次乘法和一次加法,因此每个CUDA核心每个时钟周期可以执行两次浮点运算。

以A100为例,它每个SM的FP32 CUDA核心数量为64,总的SM数量为108,Boost频率为1410 MHz,那么它的理论FP32峰值算力就是

PeakPerffp32=2×64×108×1.410GHz=19.5TFLOPS

这与官方公布的文档中的数据是一致的。

参考

[1] 这两张图来源于PMPP这本书4.4节关于SIMD硬件的讨论。

[2] NVIDIA Ampere Architecture In-Depth

[3] CUDA Memory and Cache Architecture

[4] How to Implement Performance Metrics in CUDA C/C++

[5] NVIDIA A100 Tensor Core GPU Architecture

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号