GTX 4xx,5xx(Fermi)进行了动态调度,GTX 6xx(Kepler)切换到静态调度。
答案 0 :(得分:1)
我假设您在硬件中指的是静态/动态instruction scheduling。
动态指令调度意味着处理器可以在运行时重新排序各个指令。这通常涉及一些硬件,它们会尝试预测指令流水线中的最佳顺序。在您提到的GPU上,这是指为每个单独的warp重新排序指令。
GK110 Architecture Whitepaper中描述了从动态调度程序切换回静态调度程序的原因如下:
我们还寻找机会优化SMX经纱的功率 调度程序逻辑。例如,Kepler和Fermi调度程序都包含 用于处理调度功能的类似硬件单元,包括:
为长延迟操作(纹理和纹理)注册记分板 负荷)
交错间调度决策(例如,选择最佳经线) 其次是符合条件的候选人)
线程块级别调度(例如,GigaThread引擎)
然而,Fermi的调度程序还包含一个复杂的硬件阶段 防止数学数据路径本身的数据危害。一个多端口 注册记分板跟踪尚未注册的任何寄存器 准备好有效数据,并依赖检查器块分析 在多个完全解码的warp指令中注册使用 对记分牌,确定哪些有资格发行。
对于开普勒来说,我们认识到这些信息是确定性的( 数学管道延迟不可变),因此它是 编译器可以在指令执行时预先确定 准备发布,并在说明中提供此信息 本身。这使我们能够取代几个复杂且功耗昂贵的产品 具有简单硬件块的块,用于提取预定义的块 延迟信息并用它来掩盖经线的资格 inter-warp调度程序阶段。
基本上,他们为了效率而交换芯片复杂性,即更简单的调度程序。但是现在可以通过编译器获取可能失去的效率,编译器可以预测最佳顺序,至少对于数学流水线而言。
至于你的最后一个问题,即在代码中可以做些什么来优化静态或动态调度的算法,我个人的建议是不使用任何内联汇编程序,只需让编译器/调度程序做它的事情。