CUDA编程——Warp Divergence

Warp

  回顾一下CUDA的线程层次
  CUDA编程中,warp是调度和运行的基本单元,目前,每个warp包含32个threads。软件逻辑上,程序员的所有thread是并行的,但是,从硬件的角度来说,实际上并不是所有的thread能够在同一时刻执行。

  例如:一个block 有128个thread,那么可以分为warp0~warp3,SM同时只执行一个warp,其他warp以就绪,挂起等状态存在。这点类似CPU的线程调度。从这角度看,SM相当于CPU核心,warp相当于CPU中一个线程。

  Q:一个SM中可能有128或者192个SP(根据compute capability不同),一个thread需要SP中运行,一个SM同时执行的只有一个warp也就是32个thread,那么这个SM中的其他SP都在空闲?


Warps & Blocks

  Warp是GPU运行调度的单位,由SM的warp scheduler负责调度,对程序员来说warp是透明的,我们可以设置的是block。Blocks中包含很多threads,CUDA会将它们组成成warps,如果block所含线程数目不是32(warp size)的整数倍,硬件也会为warp凑足,那么多出的threads所在的warp中,会存在一些inactive的threads,如下图。需要注意的是,即使这部分thread是inactive的,也会消耗SM资源。一个warp中的thread必然在同一个block中。


CUDA编程——Warp Divergence_第1张图片


Warp Divergence

  我们知道GPU是SIMT架构,warp是GPU调度的基本单元,也就是说一个warp中的threads执行同一条指令,并且每个thread会使用各自的data执行该指。
  那么问题来了,遇到分支语句如if…else,for,while,如果这些线程遇到这些控制流语句时,如果进入不同的分支,同一时刻除了正在执行的分之外,其余分支都被阻塞了,十分影响性能。这类问题就是warp divergence,如下图所示。为了获得最好的性能,就需要避免同一个warp存在不同的执行路径。
  


   CUDA编程——Warp Divergence_第2张图片
  

你可能感兴趣的:(CUDA编程)