什么是GPU上的静态和动态调度?

时间:2013-02-02 19:08:44

标签: cuda gpu nvidia

GTX 4xx,5xx(Fermi)进行了动态调度,GTX 6xx(Kepler)切换到静态调度。

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

1 个答案:

答案 0 :(得分:1)

我假设您在硬件中指的是静态/动态instruction scheduling

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

GK110 Architecture Whitepaper中描述了从动态调度程序切换回静态调度程序的原因如下:

  

我们还寻找机会优化SMX经纱的功率   调度程序逻辑。例如,Kepler和Fermi调度程序都包含   用于处理调度功能的类似硬件单元,包括:

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

  •   
  • 交错间调度决策(例如,选择最佳经线)   其次是符合条件的候选人)

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

  •   
     

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

     

对于开普勒来说,我们认识到这些信息是确定性的(   数学管道延迟不可变),因此它是   编译器可以在指令执行时预先确定   准备发布,并在说明中提供此信息   本身。这使我们能够取代几个复杂且功耗昂贵的产品   具有简单硬件块的块,用于提取预定义的块   延迟信息并用它来掩盖经线的资格   inter-warp调度程序阶段。

基本上,他们为了效率而交换芯片复杂性,即更简单的调度程序。但是现在可以通过编译器获取可能失去的效率,编译器可以预测最佳顺序,至少对于数学流水线而言。

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