GPU中的上下文切换机制是什么?

Zk1*_*001 17 cuda gpu gpgpu opencl

据我所知,GPU在warp之间切换以隐藏内存延迟.但我想知道在哪种条件下,经线会被切换掉?例如,如果warp执行加载,并且数据已经存在于缓存中.那么warp是否已经关闭或继续下一次计算?如果连续两次添加会发生什么?谢谢

har*_*ism 22

首先,一旦在多处理器(SM)上启动了一个线程块,它的所有warp都会驻留,直到它们全部退出内核.因此,直到有足够的寄存器用于块的所有warp,并且直到块有足够的空闲共享内存为止,才会启动块.

因此warp永远不会"切换" - 传统意义上没有warp之间的上下文切换,其中上下文切换需要将寄存器保存到内存并恢复它们.

但是,SM会选择从所有常驻经线中发出指令.实际上,无论有多少ILP(指令级并行),SM都更有可能从不同的warp连续发出两条指令,而不是从同一条warp发出两条指令.不这样做会将SM暴露给依赖性停顿.即使像"添加"这样的"快速"指令也具有非零延迟,因为算术流水线的长度是多个周期.例如,在Fermi上,硬件可以在每个周期(峰值)发出2个或更多个扭曲指令,并且算术流水线延迟为~12个周期.因此,您需要在飞行中使用多个warp来隐藏算术延迟,而不仅仅是内存延迟.

一般而言,warp调度的细节依赖于体系结构,而不是公开记录,并且几乎可以保证随时间变化.CUDA编程模型独立于调度算法,您不应该在软件中依赖它.

  • 不要考虑"切换.考虑*发行*.SM有一个驻留的warp池,它可以发出指令.它在任何给定周期发出的哪些warp是无关紧要的,只要它始终是发出指示. (4认同)
  • "在飞行中",意味着居住在SM上.只要它们是常驻的,它们就不会"切换" - 它们的寄存器组,共享存储器,程序计数器等都被保留."切换"只是选择从驻留扭曲集发出的指令.我试图防止与传统CPU线程上下文"切换"混淆,在执行线程之间切换需要保存和恢复分配的寄存器值,程序计数器等到片外存储器(或缓存),因此更多重量级的操作. (4认同)
  • 不要把它当作切换,它是*发行*.SM有一个驻留的经线池,可以从中发出指令.在任何给定的周期中发生的扭曲都不重要,重要的是它总是有可以发出的指令.SM是否可以从同一个warp连续发出两个指令会影响您对CUDA的编程方式吗?不. (2认同)