har*_*ism 22
首先,一旦在多处理器(SM)上启动了一个线程块,它的所有warp都会驻留,直到它们全部退出内核.因此,直到有足够的寄存器用于块的所有warp,并且直到块有足够的空闲共享内存为止,才会启动块.
因此warp永远不会"切换" - 传统意义上没有warp之间的上下文切换,其中上下文切换需要将寄存器保存到内存并恢复它们.
但是,SM会选择从所有常驻经线中发出指令.实际上,无论有多少ILP(指令级并行),SM都更有可能从不同的warp连续发出两条指令,而不是从同一条warp发出两条指令.不这样做会将SM暴露给依赖性停顿.即使像"添加"这样的"快速"指令也具有非零延迟,因为算术流水线的长度是多个周期.例如,在Fermi上,硬件可以在每个周期(峰值)发出2个或更多个扭曲指令,并且算术流水线延迟为~12个周期.因此,您需要在飞行中使用多个warp来隐藏算术延迟,而不仅仅是内存延迟.
一般而言,warp调度的细节依赖于体系结构,而不是公开记录,并且几乎可以保证随时间变化.CUDA编程模型独立于调度算法,您不应该在软件中依赖它.