我理解为了使CUDA程序高效,我们需要启动足够的线程来隐藏昂贵操作的延迟,例如全局内存读取。例如,当线程需要从全局内存中读取时,其他线程将被调度为运行,以便读取操作与线程的执行重叠。因此,CUDA程序的总执行时间只是每个线程执行时间的总和,不包括全局内存读取的时间。但是,如果我们可以将数据放入共享内存并让线程从共享内存中读取,通常我们可以使CUDA程序运行得更快。我的困惑是,由于内存读取的时间被隐藏,它不应该影响程序的性能。为什么它仍然可以影响程序的性能呢?
答案 0 :(得分:3)
非常简短的回答是,仅仅使用共享内存的行为不会带来性能提升。
从全局存储器读取到共享存储器,然后从共享存储器读取 - 这是问题中描述的 - 对性能没有任何好处,并且是一种常见的误解(主要是编程指南的错误,他说共享内存比全局快,导致得出结论,使用它是一个银弹。
共享内存可以帮助提高性能的唯一方法是促进对全局内存的读取或写入的合并(减少内存事务,提高缓存一致性),或者线程之间的数据共享或重用(节省内存带宽),或者更快临时空间比存储在DRAM中的线程本地存储器。
[这个答案汇集了评论,并作为社区维基条目添加,以便将问题从未答复的列表中删除]