3

GTX 4xx、5xx (Fermi) 具有动态调度,而 GTX 6xx (Kepler) 切换到静态调度。

  • 什么是 GPU 上下文中的静态和动态调度?
  • 静态与动态的设计选择如何影响现实世界计算工作负载的性能?
  • 有什么可以在代码中完成来优化静态或动态调度的算法吗?
4

1 回答 1

3

我假设您指的是硬件中的静态/动态指令调度

动态指令调度意味着处理器可以在运行时重新排序各个指令。这通常涉及一些硬件,它们将尝试预测指令流水线中任何内容的最佳顺序。在您提到的 GPU 上,这是指为每个单独的扭曲重新排序指令。

从动态调度器切换回静态调度器的原因在GK110 架构白皮书中描述如下:

我们还寻找机会来优化 SMX warp 调度器逻辑的功能。例如,Kepler 和 Fermi 调度器都包含类似的硬件单元来处理调度功能,包括:

  • 为长延迟操作(纹理和负载)注册记分板

  • 经线间调度决策(例如,在合格的候选人中选择最好的经线进行下一步)

  • 线程块级调度(例如,GigaThread 引擎)

然而,Fermi 的调度器还包含一个复杂的硬件阶段,以防止数学数据路径本身中的数据危害。多端口寄存器记分板跟踪尚未准备好有效数据的任何寄存器,依赖检查器块根据记分板分析大量完全解码的 warp 指令的寄存器使用情况,以确定哪些有资格发布。

对于 Kepler,我们认识到此信息是确定性的(数学流水线延迟不是可变的),因此编译器可以预先确定指令何时准备好发出,并在指令本身中提供此信息。这使我们能够用一个简单的硬件块替换几个复杂且功耗高的块,该硬件块提取预先确定的延迟信息,并使用它来屏蔽 warp 在 inter-warp 调度程序阶段的资格。

所以基本上,他们是在用芯片复杂性(即更简单的调度程序)来换取效率。但是,编译器现在可以预测最佳顺序,至少对于数学管道而言,这种潜在的效率损失现在已被拾取。

至于你的最后一个问题,即可以在代码中做什么来优化静态或动态调度的算法,我个人的建议是不要使用任何内联汇编器,而让编译器/调度器来做它的事情。

于 2013-02-03T15:27:09.957 回答