CUDA:延迟隐藏详解

延迟隐藏
线程束调度器的功能是调度线程束参与指令(流水线)的执行,例如运行指令和内存指令。
如果活跃的线程束有32个,线程束调度器有4个,线程束调度器每时钟周期会调度4个线程束进行指令执行,也就是说需要8个时钟周期进行调度,32个活跃的线程束都会执行。那么如果说一个指令的耗时或者说延迟是7个周期,当线程束调度器调度最后4给线程执行该指令的时候,第一组线程束的指令已经执行完毕了(第一组的线程束指令延迟被隐藏了),此时,我们就说指令的延迟被隐藏了或这说完成了延时延迟。
换句话说,一个SM中32个线程束执行一个耗时8个时钟周期的指令,它们全部执行完毕最短需要的时间是,8+8 = 16个时钟周期,在延迟隐藏的情况下,即每个线程束都处于活跃状态,耗时是16个周期,即16个周期即完成了任务。在非延迟隐藏的情况下,即没有足够多的线程束处于活跃状态,那么线程束调度器就会存在等待的情况,在这种情况下,耗时将>16个周期。
所以说,延迟隐藏需要有足够多的活跃的线程束,足够多活跃的线程束正相关于设备开启的线程束数量,设备开启的线程束数量由块的大小(执行配置)和资源约束(一个核函数中寄存器和共享内存的使用情况)决定。

总之,如果有足够的并发活跃线程,那么可以让GPU在每个周期内的每一个流水线阶段中忙碌。GPU的指令延迟被其他线程束的计算隐藏。

完成隐藏延迟所需的活跃的线程束
根据利特尔法则,所需的线程束数量 = 延迟 × 吞吐量,吞吐量一般指cuda核心的数量。
吞吐量指SM中每个周期的操作数量确定(操作数由每个SM中的核心数决定)。
并行操作数 = 吞吐量×延迟
并行操作数由一个线程中的独立的指令(每个核函数中有更多独立的指令)和很多并发的符合条件的线程(更多活跃的线程束的数量)。
 

发布了64 篇原创文章 · 获赞 264 · 访问量 106万+

猜你喜欢

转载自blog.csdn.net/bbbeoy/article/details/104049787