【发布时间】:2011-07-07 13:04:59
【问题描述】:
据我所知,GPU 在扭曲之间切换以隐藏内存延迟。但我想知道在什么情况下,扭曲会被关闭?例如,如果一个 warp 执行加载,并且数据已经在缓存中。那么warp是关闭还是继续下一个计算?如果有两个连续添加会发生什么? 谢谢
【问题讨论】:
据我所知,GPU 在扭曲之间切换以隐藏内存延迟。但我想知道在什么情况下,扭曲会被关闭?例如,如果一个 warp 执行加载,并且数据已经在缓存中。那么warp是关闭还是继续下一个计算?如果有两个连续添加会发生什么? 谢谢
【问题讨论】:
首先,一旦一个线程块在多处理器 (SM) 上启动,它的所有 warp 都会驻留,直到它们全部退出内核。因此,直到有足够的寄存器用于该块的所有扭曲,并且直到有足够的空闲共享内存用于该块,才会启动一个块。
因此,warp 永远不会“切换出去”——没有传统意义上的 warp 上下文切换,其中上下文切换需要将寄存器保存到内存并恢复它们。
然而,SM 确实会从所有常驻经线中选择要发布的指令。事实上,SM 更有可能从不同的 warp 连续发出两条指令,而不是从同一个 warp,无论它们是什么类型的指令,无论有多少 ILP(指令级并行度)。不这样做会使 SM 暴露于依赖停顿。即使像加法这样的“快速”指令也具有非零延迟,因为算术流水线是多个周期长。例如,在 Fermi 上,硬件每个周期(峰值)可以发出 2 条或更多条扭曲指令,算术流水线延迟约为 12 个周期。因此,您需要在飞行中使用多个扭曲来隐藏算术延迟,而不仅仅是内存延迟。
一般来说,warp 调度的细节取决于架构,没有公开记录,并且几乎可以保证随着时间的推移而改变。 CUDA 编程模型独立于调度算法,您不应在软件中依赖它。
【讨论】: