CUDA:延迟隐藏详解

CUDA:延迟隐藏详解

延迟隐藏

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

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

完成隐藏延迟所需的活跃的线程束

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


参考:CUDA programing guide 5.2.3. Multiprocessor Level

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值