【问题标题】:Questions about CUDA latency hiding mechanism and shared memory关于CUDA延迟隐藏机制和共享内存的问题
【发布时间】:2012-05-26 03:02:38
【问题描述】:

我知道要使 CUDA 程序高效,我们需要启动足够多的线程来隐藏昂贵操作的延迟,例如全局内存读取。例如,当一个线程需要从全局内存中读取时,其他线程将被调度运行,以便读取操作与线程的执行重叠。因此,一个 CUDA 程序的总执行时间只是每个线程执行时间的总和,不包括读取全局内存的时间。但是,如果我们可以把数据放到共享内存中,让线程从共享内存中读取,通常可以让CUDA程序运行的快很多。我的困惑是,由于内存读取的时间是隐藏的,它不应该影响程序的性能。为什么它仍然会对程序的性能产生如此大的影响?

【问题讨论】:

  • 这个问题的整个前提完全没有意义——“如果我们可以把数据放到共享内存中,让线程从共享内存中读取,通常我们可以让CUDA程序运行很多快点”。这根本不是真的。
  • @talonmies,这有什么不妥之处?它的措辞可以更好,但适当使用共享内存绝对可以提高 CUDA 内核的性能。
  • @BrendanWood:从全局内存读取到共享内存,然后从共享内存读取的行为 - 这是问题中描述的 - 对性能没有任何好处,并且是一种常见的误解(主要是编程指南的错误,它说共享内存比全局快,导致得出使用它是灵丹妙药的结论)。共享内存有助于提高性能的唯一方法是促进对全局内存的读取或写入合并,或线程之间的数据重用(节省带宽)。
  • @talonmies,我认为这是 xhe8 问题的完美答案。 xhe8 显然对 CUDA 不是很熟悉,他/她的困惑显然​​是由于从逻辑上考虑它而没有看到如何通过将某些东西放入共享内存中来提高性能。前提措辞不佳(可能是由于对共享内存的误解,就像您说的那样),但这是一个完全有效的问题,询问您是否可以超越“将数据放入共享内存”的语义。
  • @talonmies,你能给我指一些解释为什么共享内存可以更详细地帮助提高性能的教程吗?因为你说的和我能从编程指南中学到的有些不同。

标签: cuda shared-memory


【解决方案1】:

如果你对全局内存的请求过多,最终所有线程将主要等待来自它的数据(或完成写入),因此没有人能够隐藏它的延迟和带宽不足。

共享内存有助于减少对全局内存的读取/写入,这在上述情况下尤其有用(这实际上是典型的而不是偶然的)。

CUDA 程序的总执行时间只是每个线程执行时间的总和

不!这是第一个线程开始和最后一个线程完成之间的时间。

【讨论】:

    【解决方案2】:

    简短的回答是,仅仅使用共享内存不会带来性能提升。

    从全局内存读取到共享内存,然后从共享内存读取的行为 - 这是问题中描述的 - 对性能没有任何好处,并且是一个常见的误解(主要是编程指南的错误,其中说共享内存比全局快,因此得出使用它是灵丹妙药的结论)。

    共享内存有助于提高性能的唯一方法是促进对全局内存的读取或写入的合并(减少内存事务,提高缓存一致性),或者线程之间的数据共享或重用(节省内存带宽),或者作为更快的暂存空间大于存储在 DRAM 中的线程本地内存。

    [此答案由 cmets 组装而成,并添加为社区 wiki 条目,以将问题从未回答列表中删除]

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2012-02-22
      • 1970-01-01
      • 2014-08-14
      • 2023-03-11
      • 2011-11-07
      • 1970-01-01
      • 2013-04-01
      • 2016-03-14
      相关资源
      最近更新 更多