又好久没更新了,一方面是最近事情有点多,另一方面最近也确实有点懒。

      之前我说要把硬件部分补完,要写Nvidia的GPU,我估计一篇写不完,所以先写点。

       早先的硬件文章可以参考:

上一篇:解读神秘的华为昇腾910 (qq.com)

上上一篇Microsoft Maia (qq.com)

上上上篇Google的TPU (qq.com)

上上上上篇怎么看待Groq (qq.com)

上上上上上篇特斯拉 DOJO超级计算系统究竟是个啥?(1) (qq.com)

     今天开个基本篇吧,先介绍一下大面上NV的GPU都需要了解哪些知识点,其实比起上面的文章,这篇反而应该是第一篇写

英伟达的GPU(1)_Memory

,我总整这事...

     首先,为啥要GPU

     我们先看一个基本的神经网络计算 Y=F(x)=Ax+B

 这就是一次乘法一次加法 ,也叫FMA,(fused multiply-add)

     如果矩阵乘,就是上面的那个式子扩展一下,所以又用了这张老图

英伟达的GPU(1)_Core_02

       比如你要多执行好几个y=Ax+B,可能比较简单的方法就是这个

英伟达的GPU(1)_Core_03

       上面能用,但是一个线程效率低

       在一个处理器周期里面是可以处理多个指令的,这个时候引入了线程的概念来做这个事,也就是所谓的并发。

英伟达的GPU(1)_Memory_04

      并发能大大提升处理器处理任务的效率,在一个时间段执行多个任务,但是请注意,这并不意味着这些任务是同时执行的,虽然都在这个时间段执行,比如一个时钟周期,但是任务任务都会被随时中断,供其他任务运行。

       能不能自己弄自己的不要有别人打扰,在同一时刻

英伟达的GPU(1)_Memory_05

       那就得上并行了,上了并行开启了多进程,然后进程分布在不同的硬件core上,大家互不打扰,执行效率就高。总之,在同一时刻,大家互不打扰的一个方式就是多core,自己玩自己的。

      比如CPU来讲它多少core呢?我看过前几天发布会有至强6的E系列最高288core的,那GPU呢,上一代H100是1万8。

    对,1万8。 差出小100倍

    刚才我们聊了,要把矩阵运算要是分解为多个这种FMA(Y=AX+B),最高效率肯定是多进程来实现并行。

    就因为这个原因,CPU从根上就不太可能和GPU相比

    当然CPU也不是不能做矩阵乘,就是效率低,虽然现在也有多向量化支持的指令集,甚至出现了AMX这种的指令集,但是硬件上的限制还是决定了它的上限,这也是硬件架构决定的,比如下面的这张老图。

    

英伟达的GPU(1)_Memory_06

(人家CPU本来就不是发明出来要干这个事的)。

  GPU的架构

     这东西其实一开始也不是用于AI的,它只要就是用来给游戏算多边形的,后来吴恩达发现用GPU的多核能力运行AI的训练推理效果非常好,再加上CUDA推出,GPU编程简单了一大半,GPU才慢慢从AI学界逐渐走向产业界。

     最开始的架构

  1. GPC —— 图处理,Graphics Processing Clusters
  2. TPC —— 纹理处理,Texture Processing Clusters
  3. SM —— 流式多处理器,Stream Multiprocessors(我们就用这个)
  4. CORE  —— 就是CORE干活的(CORE是SM的下级,也是实际提供算力的)
  5. HBM —— 高带宽内存,High Bandwidth Memory(这个也用)
     

     他们之间的层级关系为:GPC > TPC > SM > CORE

     当然还有什么sram寄存器啥的也不在这里每个都点了

     我们玩AI的话呢,从大面上讲主要就是玩SM

     SM最早是在G80的时候被定义出来的,目前也是被沿用

英伟达的GPU(1)_Memory_07

    一个SM里面包含了很多的东西

  • CUDA Core:向量运行单元 (FP32-FPU、FP64-DPU、INT32-ALU),这块最容易被混淆,CUDA core来实现矩阵计算是用的向量化能力,直接矩阵对矩阵式用Tensor Core,这块后面会讲。另外,实际上Volta,也就是V100那个架构以后,因为FP32FPU和INT32ALU都是单独的独立出来了,所以严格说就没CUDA Core了,但是大家都这么叫也不改口了。
  • Tensor Core:Tensor也就是张量运算单元(FP8、FP16、BF16、TF32、INT8、INT4)
  • Special Function Units:特殊函数(超越函数和数学函数,反平方根、正余弦啥的)
  • Warp Scheduler:线程束调度器
  • Dispatch Unit:指令分发单元
  • Multi level Cache:多级缓存(L0/L1 Instruction Cache、L1 Data Cache & Shared Memory)
  • 7.Register File:寄存器
  • 8.Load/Store:访问存储单元LD/ST(折腾io的)


     刚我们讲了并发和并行的区别,肯定并行处理单位时间处理能力更高,但是在一个processor(或者更高一级的概念)内部,我们肯定还是会调用thread来实现并发,而GPU/CUDA玩的核心理念也叫SIMT,就是单指令多线程。

     不同于有的core级别设计的线程管理,NV的GPU是SM级别的SIMT,这些线程的调度是要靠Warp Scheduler来实现的。

     简单说就是:

     因为表面上看起来是N(N个硬件SKU有关)个Threads来实现并行,但是同一时刻因为硬件的限制,也不可能。所以就要求一个 Warp 调度N个Threads来实现并行之间的调度,这N个 Threads 以锁步的方式执行同一条指令,其中任何一个单独的 Thread会使用自己的 Data 执行指令分支,就通过这个方法,让GPU同一时刻能实现超大的数据和指令处理能力。

    当然这些都是硬件层面的,软件层面要和CUDA配合。

    先写到这,下节来讲CUDA的软件层面怎么和硬件层面配合。

    

英伟达的GPU(1)_Memory_08