【问题标题】:Is ILP (instruction level parallelism ) helpful for GPU program optimization?ILP(指令级并行)对 GPU 程序优化有帮助吗?
【发布时间】:2021-08-15 01:35:14
【问题描述】:

根据 Volkov 的谈话Better Performance at Lower Occupancy,ILP 是隐藏延迟的重要方法,它增加了吞吐量。然而,同样从他的谈话来看,每个 SM 只有两个 warp 调度器,这意味着(如果我没有误解的话)SM 可以在一个线程中发出两条独立的指令。那为什么ILP > 2,吞吐量也可以增加(根据Volkov的谈话p15-p20中的实验)?

【问题讨论】:

  • 这个问题似乎过于笼统。是的,ILP 在一定程度上有所帮助,并且在较新的 GPU 架构(大致是 Pascal 和更高的架构)中利用 ILP 的机会更多。
  • ILP 在 SM 执行期间也被流水线使用。 ILP 代码还可以在编译期间更好地重新排序,以减少指令依赖性。当指令等待完成时,我不认为调度程序被阻塞。它们可以在下一个循环中发出相同warp的独立指令。
  • 那么使用 k 个 warp 调度器,我们能否仅使用 ILP(连续使用超过 k 个独立指令)达到 k 倍以上的吞吐量?
  • 有些 warp 调度器是双重问题,有些不是。对您的问题的准确回答需要指定哪个。对于 k 个单一问题的 warp 调度程序,在特定时钟周期内不可能发出超过 k 个指令。对于 k 个双发布 warp 调度程序(例如,开普勒),可以在特定时钟周期内发布多于 k 个指令。请注意,warp 调度程序已分配 warp。这意味着两个独立的 warp 调度程序不能在特定的时钟周期(或者对于最近的 GPU)发出与同一个 warp 相关的指令。
  • 在特定指令流中的指令(与 ILP 相关)之间的 独立性 属性是一个普遍有用的属性。如前所述,编译器可以识别独立性并将其用于reorder instructions,这可以提高性能。这不一定与问题特征有关。

标签: cuda


【解决方案1】:

ILP(指令级并行)对 GPU 程序优化有帮助吗?

是的。可能有几个原因。一个原因是指令流中相邻且具有ILP可能性特征的指令也具有独立性,这意味着它们之间的执行顺序不依赖于彼此的正确性。这是指令流中的一个有价值的特性,因为它允许指令流在遇到停顿之前继续具有可发布的指令。指令停顿的一个常见原因是不满足依赖关系。流中指令之间的独立性意味着这不能成为这些指令停止的原因。编译器当然知道这一点,并将尝试创建独立的指令组,可能是loop unrolling。另一个潜在的原因是在 GPU 架构(例如 Kepler)上运行的情况下,该架构具有双问题的 warp 调度程序。在这种情况下,为了在任何给定时钟周期内实现最大发布率,指令流中的指令必须彼此相邻且可独立发布。

每个 SM 只有两个 warp 调度器

并非所有 GPU 架构都如此;它因架构而异。 warp 调度器的问题特征也因架构而异。有些是单问题的,有些是双问题的

那么使用 k 个 warp 调度器,我们能否仅使用 ILP(连续使用超过 k 个独立指令)达到 k 倍以上的吞吐量?

是的,如果与连续没有独立指令的代码进行比较,原因已经说明。独立性允许最大的发布率不会由于指令之间的依赖关系而停顿。这是吞吐量的一个有价值的特征。在最近的 GPU 架构中,当线程块由 CUDA Work Distributor 存放在 SM 上时,warp 被“静态”分配给 warp 调度程序。拥有 k 个 warp 调度程序并不意味着我需要按顺序排列 k 个独立指令,以便让所有 warp 调度程序在特定时钟周期内都可以发布。如果我们想象所有 warp 调度程序碰巧都在锁步中工作的情况(一般没有理由假设这一点),那么我们会遇到这样的情况,即在给定时钟周期内,每个 warp 调度程序都希望发出 same 指令,尽管适用于不同的经线。如果没有其他信息(例如该指令类型的执行资源的可用性),我们会假设该指令可以跨多个 Warp 调度程序发出。关键是即使指令流中没有没有 ILP,也可以使用多个warp调度程序并发出指令。指令流中的 ILP 不必为 4,以便所有 4 个 warp 调度程序都可以在同一个周期中发出。但是我们确实在 warp 调度器想要双重发布时需要 ILP(在指令流中的某个点要求最小 ILP 为 2),即使除了对 warp 调度器的所有这些关注之外,ILP 还是很有价值的因为它意味着有可能拥有更长的指令序列,这些指令可以在没有停顿的情况下发布。这对于任何 GPU 来说都是有价值的,与其特定的 SM 配置无关。

【讨论】:

    猜你喜欢
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2017-01-10
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    相关资源
    最近更新 更多