揭秘英伟达 GPU 架构演进近十年,从费米到安培( 三 )


揭秘英伟达 GPU 架构演进近十年,从费米到安培

文章插图
 
和 Pascal 的改变类似,到了 Volta,直接拆了 4 个区块,每个区块多配了一个 L0 指令缓存,而 Shared Memory/Register File 这都没有变少,也就和 Pascal 的改变一样,单个线程可使用的资源更多了 。单个区块还多个两个名为 Tensor Core 的单元,这就是这个版本的核心了 。可以吐槽一下,这个版本又把 L1 和 Shared Memory 合并了 。
我们首先看 CUDA Core, 可以看到,原本的 CUDA Core 被拆成了 FP32 Cuda Core 和 INT32 Cuda Core,这意味着可以同时执行 FP32 和 INT32 的操作 。
众所周知,DeepLearning 的计算瓶颈在矩阵乘法,在 BLAS 中称为 GEMM,TensorCore 就是只做 GEMM 计算的单元,可以看到,从这里开始,NVIDIA 从 SIMT 走到了 SIMT+DSA 的混合 。
每个 TensorCore 只做如下操作:
D=A*B+C即:
揭秘英伟达 GPU 架构演进近十年,从费米到安培

文章插图
 
其中 A, B, C, D 都是 4x4 的矩阵,且 A 和 B 是 FP16 矩阵,C 和 D 可以是 FP16 或者 FP32. 通常,更大的矩阵计算会被拆解为这样的 4x4 矩阵乘法 。
这样的矩阵乘法是作为 Thread Warp 级别的操作在 CUDA 9 开始暴露给程序员,除此以外,使用 cublas 和 cudnn 当然同样也会在合适的情况下启用 TensorCore.
在这个版本中,另一个重要更新是 NVLink, 简单来说就是更多更快 。每个连接提供双向各自 25GB/s 的带宽,并且一个 GPU 可以接 6 个 NVLink,而不是 Pascal 时代的 4 个 。一个典型的拓扑如下图:
揭秘英伟达 GPU 架构演进近十年,从费米到安培

文章插图
 
从 Volta 开始,线程调度发生了变化,在 Pascal 以及之前的 GPU 上,每个 Warp 里的 32 个线程共享一个 Program Counter (简称 PC) ,并且使用一个 Active Mask 表示任意时刻哪些线程是可运行的,一个经典的运行如下:
揭秘英伟达 GPU 架构演进近十年,从费米到安培

文章插图
 
直到第一个分支完整结束,才会执行另一个分支 。这意味着同一个 warp 内不同分支失去了并发性,不同分支的线程互相无法发送信号或者交换数据,但同时,不同 warp 之间的线程又保留了并发性,这当中的线程并发存在着不一致,事实上如果程序员不注意这点,很可能导致死锁 。
在 Volta 中解决了这个问题,同 warp 内的线程有独立的 PC 和栈,如下:
揭秘英伟达 GPU 架构演进近十年,从费米到安培

文章插图
 
由于运行时仍然要符合 SIMT,所以存在一个调度优化器负责将可运行的线程分组,使用 SIMT 模式执行 。经典运行如下:
揭秘英伟达 GPU 架构演进近十年,从费米到安培

文章插图
 
上图可以注意到,Z 的执行并没有被合并,这是因为 Z 可能会产生一些被其他分支需要的数据,所以调度优化器只有在确定安全的情况下才会合并 Z,所以上图 Z 未合并只是一种情况,一般来说,调度优化器足够聪明可以发现安全的合并 。程序员也可以通过一个 API 来强制合并,如下:
揭秘英伟达 GPU 架构演进近十年,从费米到安培

文章插图
 
从 Volta 开始,提高了对多进程并发使用 GPU 的支持 。在 Pascal 及之前,多个进程对单一 GPU 的使用是经典的时间片方式 。从 Volta 开始,多个用不满 GPU 的进程可以在 GPU 上并行,如下图:
揭秘英伟达 GPU 架构演进近十年,从费米到安培

文章插图
 
Turing2018 年 NVIDIA 发布了 Turing 架构,个人认为是 Volta 的延伸版本,当然首先各种参数加强,不过我们这里就不提参数加强了 。
揭秘英伟达 GPU 架构演进近十年,从费米到安培

文章插图
 
比较重要是的增加了一个 RT Core,全名是 Ray Tracing Core, 顾名思义,这个是给游戏或者仿真用的,因为本人没有从事过这类工作,就不介绍了 。
此外 Turing 里的 Tensor Core 增加了对 INT8/INT4/Binary 的支持,为了加速 deep learning 的 inference, 这个时候深度学习模型的量化部署也渐渐成熟 。
Ampere2020 年 NVIDIA 发布了 Ampere 架构,这就是一个大版本了,里面又细分了 GA100, GA102, GA104, 我们这里就只关注 GA100 。
我们先看 GA100 的 SM:
揭秘英伟达 GPU 架构演进近十年,从费米到安培

文章插图
 
这里面最核心的升级就是 Tensor Core 了 。
除了在 Volta 中的 FP16 以及在 Turing 中的 INT8/INT4/Binary,这个版本新加入了 TF32, BF16, FP64 的支持 。着重说说 TF32 和 BF16, 如下图:


推荐阅读