背景
在cuda中,每32个线程会被『捆』成一束(线程束),英文是warp
, 一个warp执行一个指令,换句话说32个线程每次都是执行相同的指令。指令发射任务是由warp scheduler来完成的,具体工作原理如下:
warp scheduler
warp slot
假如sm中有1个warp scheduler(线程束调度器),调度器最多可以管理8个warp。下图做简单的展示,这里的slot个数就是调度器可以管理的warp最大值,为了方便后面解释,用涂有颜色的块表示某个slot被使用,空白则表示没有被使用。
warp的状态
在上面的warp slots解释中,其实可以理解其就是一个存放warp的池子,在cuda中凡是进入这些池子的warp,都被称作active warp。在active中的warp还可以被分为三个状态,分别是stalled, eligible, selected,具体是啥意思呢?根据我自己的理解,stalled顾名思义就是困住的,当下warp的指令没法被发射,造成stalled主要有以下5中情况:
- 在取指令
- 依赖内存指令的访存结果
- 依赖之前指令的执行结果
- pipeline正在忙
- 同步barrier
那么eligible就比较好理解,就是各项指标都符合,可以被发射,selected就是当下被选择发射的warp。这里分别用三个颜色表示三种状态。
状态切换和指令发射
对于一个warp scheduler(指令发射器),每个时钟周期可以发射出一个指令(因为只有一个issue slot)。对下面的四个时钟周期进行解释。
- 在时钟周期1的时候,有5个激活的warp, 其中3是eligible, 4号被选中发射,5,6,7是stalled。
- 在时钟周期2的时候,由于4号在运行中所以这里是stalled(可能依赖当下指令的完成),3号被选中发射,所以3号是selected。
- 在时钟周期3的时候,有个warp估计是执行完了退出了,而且没有可发射的, 所以时钟周期3的时候,发射槽闲置了。
- 在时钟周期4的时候,warp slots中的warp又有状态更新,这里5和6都是可以执行的,所以5被运到发射槽,状态标记为selected, 6标记为eligible。
nsight compute
在做性能分析的时候,会有相关指标来衡量,我们可以看到在4个时钟周期内,一共有20个active warps(20= 5+5+4+6), 那么平均每一个时钟周期有5个active warps, 而warp slots有8个槽,所以利用率(achieved_occupancy)是62.5%。而在4个时钟周期内,warps_stalled=15, warps_eligible=5,warp_issued(selected)=3, 所以发射槽的利用率为75%(issue_slot_utilization)。对标nisght compute的相关指标我们就知道是什么意思了,该如何去做优化。