如this work中所述:
如果CUDA编译器生成的指令流表示的ILP为3.0(即在危险发生之前平均可以执行三条指令),并且指令流水线深度为22个阶段,则只有八个 Activity 扭曲(22/3)。 )可能足以完全隐藏指令等待时间并实现最大算术吞吐量。
我不明白为什么这足够了?
最佳答案
如果调度程序可以在每个指令发出周期连续22个周期从同一扭曲成功地发出一条指令,则调度程序没有理由在其位置调度另一个扭曲,并且单个扭曲足以填充流水线。这对应于至少22的ILP。
但是Real-World Code™从不展示这种高ILP:例如,某些指令取决于先前指令的结果或内存请求。当调度程序无法再执行独立指令时,该warp的执行将停止。调度程序将选择另一个可以执行的warp,并执行尽可能多的指令,直到warp也停止为止,依此类推。
因此,如果warp#1成功执行了3条指令然后停滞,则调度程序选择warp#2,执行3条指令...等等。当调度程序进入warp#8时,管道中已经有21条指令用于7个停滞的warp。然后,从该扭曲执行一条指令就足以完全填充流水线。到管道开始排空时,第1个翘曲又准备好了,因此为什么8个ILP为3的翘曲足以填充22级管道。
关于cuda - 为什么CUDA GPU只需要8个事件扭曲?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30526021/