0

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

4

2 回答 2

3

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

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

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

[此答案从评论中收集并添加为社区 wiki 条目,以将问题从未回答列表中删除]

于 2016-01-25T06:40:46.427 回答
0

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

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

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

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

于 2021-12-02T12:26:40.130 回答