GPU概念:Thread, Block, Grid, Warp, SP, SM

  • Stream(流)
      流是一系列顺序执行的命令,流之间相对无序或并发的执行他们的命令。

  • Streaming Processor(SP)
      最基本的处理单元, 具体的指令和任务都是在SP上处理的。GPU进行并行计算,也就是很多个SP同时做处理。现在SP的术语已经有点弱化了,而是直接使用thread来代替。一个SP对应一个thread。

  • Streaming Multiprocessor(SM)
      多个sp加上其他的一些资源组成一个SM。其他资源包括存储资源,共享内存,寄储器等。一个SM中的所有SP是先分成warp,共享同一个memory和instruction unit。
      每个SM通过使用两个特殊函数(Special Function Unit,SFU)单元进行超越函数和属性插值函数(根据顶点属性来对像素进行插值)计算。SFU用来执行超越函数、插值以及其他特殊运算。

  • Warp
      warp是SM调度和执行的基础概念,同时warp实际上是一个和硬件相关的概念,通常一个SM中的SP(thread)会分成几个warp(SP在SM中是进行物理上的分组),每一个wrap中在Tegra中是32个thread。这个wrap中的32个thread(SP)是一起工作的,执行相同的指令,如果没有这么多thread需要工作,那么这个wrap中的一些thread(SP)是不工作的。
      P.S. 每一个线程都有自己的寄存器内存和local memory,一个warp中的线程是同时执行的,也就是当进行并行计算时,线程数尽量为32的倍数,如果线程数不上32的倍数的话;假如是1,则warp会生成一个掩码,当一个指令控制器对一个warp单位的线程发送指令时,32个线程中只有一个线程在真正执行,其他31个 进程会进入静默状态。

  • Grid、Block与Thread
      在利用CUDA进行编程时,一个grid分为多个block,而一个block分为多个thread。划分的依据是任务特性和GPU本身的硬件特性。grid、block和thread是软件概念,而非硬件的概念。

  从硬件角度讲,一个GPU由多个SM组成(当然还有其他部分),一个SM包含有多个SP(以及还有寄存器资源,shared memory资源,一级缓存(L1 cache),scheduler(调度器),SPU,LD/ST单元(读取单元)等等),1.x硬件,一个SM包含8个SP,2.0是32个,2.1是48个,3.0和3.5是192个。以及SP目前也称为CUDA CORE,而SM目前也称为MP,在KEPLER架构(SM3.0和3.5)下也称为SMX。

  从软件角度讲,CUDA因为是SIMT的形式,grid和block是thread的组织形式。thread是最小的逻辑单位,wrap是最小的硬件执行单位,若干个thread(典型值是128~512个)组成一个block,block被加载到SM上运行,多个block组成整体的grid。

  P.S. SIMT: SIMT中文译为单指令多线程,英文全称为Single Instruction Multiple Threads。GPU中的SIMT体系结构相对于CPU的SIMD中的概念。为了有效地管理和执行多个单线程,多处理器采用了SIMT架构。此架构在第一个unified computing GPU中由NVIDIA公司生产的GPU引入。不同于CPU中通过SIMD(单指令多数据)来处理矢量数据;GPU则使用SIMT,SIMT的好处是无需开发者费力把数据凑成合适的矢量长度,并且SIMT允许每个线程有不同的分支。 纯粹使用SIMD不能并行的执行有条件跳转的函数,很显然条件跳转会根据输入数据不同在不同的线程中有不同表现,这个只有利用SIMT才能做到。

  总的来说,在GPU中最小的硬件单元是SP(这个术语通常使用thread来代替),而硬件上一个SM中的所有SP在物理上是分成了几个wrap,每一个warp包含一些thread,warp中的SP是可以同时工作的,但是执行相同的指令,也就是说取指令单元取一条指令同时发射给WARP中的所有的SP(假设SP都需要工作,否则有些是空闲的)。可见,在硬件上一个SM > WARPS > SP(thread)。从软件thread组织方面来看,因为一个SM中是分WARP的,而一个WARP包含一定数目(比如Tegra的32个)的SP(thread),因此最好按照这个数目来组织thread,否则硬件该warp上有些SP是不工作的。

你可能感兴趣的:(gpu)