关于CUDA延迟隐藏机制和共享内存的问题

关于CUDA延迟隐藏机制和共享内存的问题,cuda,shared-memory,Cuda,Shared Memory,我明白,要使CUDA程序高效,我们需要启动足够多的线程来隐藏昂贵操作(如全局内存读取)的延迟。例如,当一个线程需要从全局内存中读取时,其他线程将被安排运行,以便读取操作与线程的执行重叠。因此,CUDA程序的总执行时间只是每个线程执行时间的总和,不包括全局内存读取时间。但是,如果我们可以将数据放入共享内存,并让线程从共享内存中读取数据,通常我们可以使CUDA程序运行得更快。我的困惑是,由于内存读取的时间是隐藏的,所以它不应该影响程序的性能。为什么它仍然会对程序的性能产生如此大的影响?非常简单的答案

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

非常简单的答案是,仅仅使用共享内存的行为不会带来性能的提高

从全局内存读取到共享内存,然后从共享内存读取的行为——这是问题中描述的——对性能没有任何好处,是一种常见的误解(主要是编程指南的错误,该指南说共享内存比全局内存快,从而得出结论,使用它是一个银弹)

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


[此答案由评论汇总而成,并作为社区wiki条目添加,以将问题从未回答列表中删除]

非常简短的答案是,仅仅使用共享内存不会带来性能改进

从全局内存读取到共享内存,然后从共享内存读取的行为——这是问题中描述的——对性能没有任何好处,是一种常见的误解(主要是编程指南的错误,该指南说共享内存比全局内存快,从而得出结论,使用它是一个银弹)

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


[此答案由评论汇总而成,并作为社区wiki条目添加,以将问题从未回答列表中删除]

此问题的整个前提毫无意义-“如果我们可以将数据放入共享内存并让线程从共享内存中读取,通常我们可以使CUDA程序运行得更快”。这根本不是真的。@Talonmes,这有什么不对的?可以用更好的措辞,但适当使用共享内存绝对可以提高CUDA内核的性能。@BrendanWood:从全局内存读取到共享内存,然后从共享内存读取的行为——这是问题中描述的——对n性能,这是一个常见的误解(主要是编程指南的错误,它说共享内存比全局内存快,从而得出使用它是一个银弹的结论)。共享内存有助于提高性能的唯一方法是促进读取或写入到全局内存的合并,或线程之间的数据重用(节省带宽)@Talonmes,我认为这是对xhe8问题的完美回答。xhe8显然对CUDA不太熟悉,他/她的困惑显然是因为他/她逻辑地思考了这个问题,没有看到如何通过在共享内存中放置一些东西来提高性能。前提措词不当(可能是因为对共享内存的误解,如你所说),但如果你能超越“将数据放入共享内存”的语义,这是一个完全正确的问题@Talonmes,你能给我指一些教程吗?这些教程解释了为什么共享内存可以更详细地帮助提高性能。因为你所说的与我从编程指南中学到的有些不同。这个问题的整个前提毫无意义-“如果我们可以将数据放入共享内存,让线程从共享内存中读取数据,通常我们可以使CUDA程序运行得更快"。这根本不是真的。@Talonmes,这有什么不对的?可以用更好的措辞,但适当使用共享内存绝对可以提高CUDA内核的性能。@BrendanWood:从全局内存读取到共享内存,然后从共享内存读取的行为——这是问题中描述的——对n性能,这是一个常见的误解(主要是编程指南的错误,它说共享内存比全局内存快,从而得出使用它是一个银弹的结论)。共享内存有助于提高性能的唯一方法是促进读取或写入到全局内存的合并,或线程之间的数据重用(节省带宽)@Talonmes,我认为这是对xhe8问题的完美回答。xhe8显然对CUDA不太熟悉,他/她的困惑显然是因为他/她逻辑地思考了这个问题,没有看到如何通过在共享内存中放置一些东西来提高性能。前提措词不当(可能是因为对共享内存的误解,就像你说的),但如果你能超越“将数据放入共享内存”的语义,这是一个完全正确的问题。@talonmies,你能给我指一些教程,解释为什么共享内存