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

Cuda 什么是GPU上的静态和动态调度?,cuda,gpu,nvidia,Cuda,Gpu,Nvidia,GTX 4xx、5xx(费米)采用动态调度,GTX 6xx(开普勒)采用静态调度 什么是GPU上下文中的静态和动态调度 静态与动态的设计选择如何影响真实世界计算工作负载的性能 在代码中有什么可以用来优化静态或动态调度算法的吗 我假设您指的是硬件中的静态/动态 动态指令调度意味着处理器可以在运行时对单个指令重新排序。这通常涉及一些硬件,这些硬件将尝试预测指令管道中任何内容的最佳顺序。在您提到的GPU上,这是指为每个单独的扭曲重新排序指令 从动态计划程序切换回静态计划程序的原因如下所述: 我们还寻

GTX 4xx、5xx(费米)采用动态调度,GTX 6xx(开普勒)采用静态调度

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

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

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

从动态计划程序切换回静态计划程序的原因如下所述:

我们还寻找机会优化SMX warp的功率 调度程序逻辑。例如,开普勒和费米调度程序都包含 处理调度功能的类似硬件单元,包括:

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

  • 经纱间调度决策(例如,选择最佳经纱 合格候选人中的下一位)

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

然而,费米的调度程序也包含了一个复杂的硬件阶段来实现 防止数学数据路径本身中的数据危险。多端口 登记记分板记录所有尚未登记的登记 准备好了有效的数据和依赖项检查器块 跨多个完全解码的warp指令注册使用情况 对照记分牌,确定哪些有资格发放

对于开普勒来说,我们认识到这一信息是确定性的 数学管道延迟不是可变的),因此是可变的 编译器可以预先确定指令何时运行 准备发布,并在说明中提供此信息 它本身这使我们能够更换几个复杂且耗电昂贵的 具有简单硬件块的块,用于提取预先确定的 延迟信息,并使用它在 跨扭曲调度程序阶段

所以基本上,他们是在用芯片的复杂性,也就是更简单的调度程序来换取效率。但是,编译器现在可以预测出最佳顺序,至少对于数学管道来说,这可能会损失效率


至于您的最后一个问题,即如何在代码中优化静态或动态调度算法,我个人的建议是不要使用任何内联汇编程序,只让编译器/调度程序完成它的工作

谢谢你,佩德罗,这正是我要找的。白皮书现在在我的阅读清单上。我查看了开普勒的一些SASS反汇编,没有看到额外的延迟信息。不过,它可能只是没有被展示。听起来,动态指令调度与CPU上的无序执行是一样的。白皮书中的措辞有点奇怪。听起来他们好像在说他们在费米已经有了固定长度的管道,他们刚刚意识到他们可以利用这个事实来实现静态指令调度,而不会损失任何性能。然而,我从网络上得到的印象是,在现实世界的计算负载下,现在更难达到理论上的最大值。所以他们似乎做了两个改变,使用固定长度的管道,然后以此作为切换到静态调度的基础。开普勒发生了很大的变化。特别是,ALU增加了四倍,而寄存器只增加了一倍,共享内存保持不变。那真的很痛苦。动态调度不是真正的无序执行,我认为提前计算这一点是非常合理的决定。我只是想知道,当常规ALU暂停被静态处理时,它们是如何使内存获取暂停成为动态的。