【问题标题】:How to explain the super-linear speedup observed in GPU device with CUDA code?如何用 CUDA 代码解释在 GPU 设备中观察到的超线性加速?
【发布时间】:2014-07-10 21:48:44
【问题描述】:

我无法理解 Tesla C1060 上令人尴尬的并行计算的扩展性能。使用所有块和每个块的多个线程运行它,我得到的运行时间约为 0.87 秒。

但是,如果我只在一个块中运行所有迭代,每个块有一个线程,则运行时间最长为 1872 秒,这比我期望的从缩小到使用的 240x0.87s = 209 秒要长得多240 个流处理器中只有一个。

相反,通过使用所有 240 个内核,我的速度似乎提高了 2000 倍以上。这种超线性加速怎么可能?在对这个系统进行性能建模时,我还应该注意哪些其他因素?

【问题讨论】:

  • Re: close votes - 我认为这实际上是一个非常有用的 GPU 代码性能建模问题;我已经尝试编辑问题以进一步说明问题。

标签: performance cuda parallel-processing


【解决方案1】:

启动由 1 个线程组成的内核会将内核执行限制为 30 个 SM 中的 1 个。对于每个发出的扭曲指令,将仅使用 1/32 的执行单元。此外,来自同一经线的指令不能在背靠背的问题槽中发出,至少有 1/2 的问题槽是空的。由于指令依赖性和内存延迟,额外的插槽将是空的,从而使速度提高 2-4 倍。让我们假设一个非常悲观的 2 倍。可能的收益的粗略计算将是

30x increase for using all 30 SMs
32x increase for using full width of the execution units
 2x increase for using issue slots and saturating memory system
= 30 * 32 * 2
= >1920x performance increase

您看到 1872/.87 = 2152x 的差异。这很容易通过 >2x 来解释,因为问题槽是空的,而且每个 SM 1 个 warp 不能使内存系统饱和。

【讨论】:

  • 那么,如果我运行单线程 CUDA 程序,是不是在当前指令执行完成之前不会发出下一条指令?或者单线程 CUDA 程序是否有任何指令级并行性?
猜你喜欢
  • 2020-04-24
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 2012-05-27
  • 2015-05-25
  • 2015-07-12
相关资源
最近更新 更多