Nvidia显卡硬件与软件

硬件

下面这张图是GPU的硬件结构,这个图有点大,放大看可以看到很多细节,我们可以看到有各种硬件组成单元,比如GPC,TPC,SM, L2Cache,绿色小块就是cuda core也叫sp,后面这些都有专门对应的软件信息。

再往里面深入一层就可以看到更加具体的细节,下面这种图就是SM的细节。可以看到sm里面又分为两个大块,每一个大块的名字叫SMP(SM Processing Block),对于浮点计算来说,CPU可以同时支持不同精度的浮点运算,但在GPU里针对单精度和双精度就需要各自独立的计算单元,一般在GPU里支持单精度运算的Single Precision ALU称之为FP32 core或简称core,而把用作双精度运算的Double Precision ALU称之为DP unit或者FP64 core,这里的SM里边由32个DP Unit,由64个CUDA Core,所以单精度双精度单元数量比是2:1,厂家的配置说明里CUDA Core就是单指绿色的个数,不包括黄色的。每一个SM有自己的指令缓存,L1缓存,共享内存。而每一个SMP有自己的Warp Scheduler、Register File等。LD/ST 是load store unit,用来内存操作的。SFU是Special function unit,用来做cuda的intrinsic function的,类似于__cos()这种。
Nvidia显卡硬件与软件_第1张图片

软件

  1. 当一个kernel启动后,thread会被分配到这些SM中执行。同一个block只会分配到一个SM中,所以同一个block中的threads必然在同一个SM中并行(SIMT)执行。
  2. 实际上一个block中并不是所有的thread能够在同一时刻执行,Nvidia把32个threads组成一个warp,warp是调度和运行的基本单元 , warp中所有threads并行的执行相同的指令。而同一个block的warp处于同一个wrap scheduler(wrap调度器),当某个wrap阻塞时,其他wrap顶上去,这样同一个block的warp就是出去乱序状态,而block和block之间的scheduler更是不相同,所以不同block之间的wrap更是乱序状态,透彻的理解了运行原理,我们才能在正确的地方加入同步机制,避免死锁等问题。
  3. 假如一个SM有64个sp, 也就是说同时可以执行2个wrap, 正在被执行的warp叫做resident warp, 每个SM支持的最大resident warp个数可以在对应的显卡说明上找到,除了一些运行时候的wrap, 还有一些warp处于不同状态,挂起,就绪,这些wrap和正在执行的warp被统称为active wrap, 这些warp需要的资源(寄存器)在进入sm的时候就已经被分配。比如下图的SM1就包含m个active warp。
    Nvidia显卡硬件与软件_第2张图片

为了提高SM的利用率,我们需要将所有active wrap都要用完,假如我们有16个block, 每个block有32个thread,(这里说一下,每一个sm都有block所能容纳的上限,wrap所能容纳的上限(这个可以根据sp的个数推导出来,最好还是去查表),原因就不在词细讲,有兴趣可以自己看[nvidia]的文档,比如有一块GPU的block上限是16,activate warp的上限是64), 那么上面那个<16,32>的kernel对于sm的使用率就只有25%, 所以有时候我们需要根据自己使用GPU来设置合适thread来提高sm的利用率,此外还有share_memory的影响,所以使用的时候要小心

你可能感兴趣的:(CUDA编程,深度学习)