【发布时间】:2012-05-26 03:02:38
【问题描述】:
我知道要使 CUDA 程序高效,我们需要启动足够多的线程来隐藏昂贵操作的延迟,例如全局内存读取。例如,当一个线程需要从全局内存中读取时,其他线程将被调度运行,以便读取操作与线程的执行重叠。因此,一个 CUDA 程序的总执行时间只是每个线程执行时间的总和,不包括读取全局内存的时间。但是,如果我们可以把数据放到共享内存中,让线程从共享内存中读取,通常可以让CUDA程序运行的快很多。我的困惑是,由于内存读取的时间是隐藏的,它不应该影响程序的性能。为什么它仍然会对程序的性能产生如此大的影响?
【问题讨论】:
-
这个问题的整个前提完全没有意义——“如果我们可以把数据放到共享内存中,让线程从共享内存中读取,通常我们可以让CUDA程序运行很多快点”。这根本不是真的。
-
@talonmies,这有什么不妥之处?它的措辞可以更好,但适当使用共享内存绝对可以提高 CUDA 内核的性能。
-
@BrendanWood:从全局内存读取到共享内存,然后从共享内存读取的行为 - 这是问题中描述的 - 对性能没有任何好处,并且是一种常见的误解(主要是编程指南的错误,它说共享内存比全局快,导致得出使用它是灵丹妙药的结论)。共享内存有助于提高性能的唯一方法是促进对全局内存的读取或写入合并,或线程之间的数据重用(节省带宽)。
-
@talonmies,我认为这是 xhe8 问题的完美答案。 xhe8 显然对 CUDA 不是很熟悉,他/她的困惑显然是由于从逻辑上考虑它而没有看到如何通过将某些东西放入共享内存中来提高性能。前提措辞不佳(可能是由于对共享内存的误解,就像您说的那样),但这是一个完全有效的问题,询问您是否可以超越“将数据放入共享内存”的语义。
-
@talonmies,你能给我指一些解释为什么共享内存可以更详细地帮助提高性能的教程吗?因为你说的和我能从编程指南中学到的有些不同。
标签: cuda shared-memory