正如this work所说:
如果CUDA编译器生成的指令流表示ILP为3.0(即,在危险之前可以执行三条指令的平均值),并且指令流水线深度为22级,则少至8条活动warp( 22/3)可能足以完全隐藏指令延迟并实现最大算术吞吐量。
我不明白为什么这就足够了?
答案 0 :(得分:3)
如果调度程序可以在每个指令发布周期成功地从同一个warp发出指令22个连续周期,那么调度程序没有理由在其位置安排另一个warp,并且单个warp足以填充管道。这相当于至少22的ILP。
但Real-World Code™从未展示过如此高的ILP:例如,某些指令取决于之前的指令或内存请求的结果。当调度程序不能再执行独立指令时,该warp的执行会停止。调度程序将选择另一个准备执行的warp,并执行尽可能多的指令,直到该warp也停止,等等。
因此,如果warp#1成功执行3条指令然后停止,则调度程序选择warp#2,执行3条指令......等等。当调度程序变为warp#8时,7条管道中已经有21条指令陷入僵局的扭曲。从该warp执行单个指令就足以完全填满管道。当管道开始排空时,经线#1再次准备就绪,因此,为什么8个ILP为3的经线足以填充22级管道。