据我所知,GPU在warp之间切换以隐藏内存延迟。但我想知道在哪种条件下,经线会被切换掉?例如,如果warp执行加载,并且数据已经存在于缓存中。那么warp是否已经关闭或继续下一次计算?如果连续两次添加会发生什么? 感谢
答案 0 :(得分:21)
首先,一旦在多处理器(SM)上启动了一个线程块,它的所有warp都会驻留,直到它们都退出内核。因此,只有在块的所有warp都有足够的寄存器,并且直到块有足够的可用共享内存时才会启动块。
因此warp永远不会“切换” - 传统意义上没有warp之间的上下文切换,其中上下文切换需要将寄存器保存到内存并恢复它们。
然而,SM确实从所有常驻经线中选择发出指令。实际上,无论有多少ILP(指令级并行),SM都更有可能从不同的warp连续发出两条指令而不是同一条warp,无论它们是什么类型的指令。不这样做会将SM暴露给依赖性停顿。即使像“添加”这样的“快速”指令也具有非零延迟,因为算术流水线的长度是多个周期。例如,在Fermi上,硬件可以在每个周期(峰值)发出2个或更多个扭曲指令,并且算术流水线延迟为~12个周期。因此,您需要在飞行中使用多个warp来隐藏算术延迟,而不仅仅是内存延迟。一般而言,warp调度的细节取决于体系结构,没有公开记录,并且几乎可以保证随时间变化。 CUDA编程模型独立于调度算法,您不应该在软件中依赖它。