我是cuda的新手,并且对共享记忆有一些疑问:
每个SM在同一个GPU内具有相同数量的共享内存吗?
SM如何在块之间划分共享内存?它是平均分配的吗(例如,如果有2个块,那么每个块都会获得SM内共享内存的一半,而不管实际使用了多少),还是基于需求?
我对共享内存库的理解是:共享内存分为32个相等的大内存库。那么,这是否意味着每个区块(即eveyr区块拥有自己的32个存储库)还是每个SM?
如果我从/到一个以上单词的共享内存中执行CudaMemcpy,这算作一次交易还是多次交易?这会导致银行冲突吗?
谢谢!
答案 0 :(得分:3)
让我首先指出,共享存储器首先是编程模型的抽象,通过该模型可以公开硬件的某些功能(快速片上存储器)。在CUDA编程模型中,网格中的每个块(内核启动)都获得相同数量的共享内存。多少取决于内核功能所需的静态分配的共享内存的数量,以及内核启动中指定的任何其他动态共享内存。
- 每个SM在同一GPU中是否具有相同数量的共享内存?
是的,目前就是这种情况。但是,这与您想象中的CUDA编程方式实际上并不相关,因为:
- SM如何在块之间划分共享内存?它是否平均分配(例如,如果有2个块,则每个块获得SM内共享内存的一半,而不管实际使用了多少),还是基于需求?
启动内核时,可以指定每个块需要多少共享内存。然后,这将通知每个多处理器可以容纳多少个块。因此,不是块的数量定义了每个块获得多少共享内存,而是相反:每个块所需的共享内存量是定义每个多处理器上可以驻留多少个块的因素之一。
您将需要阅读有关延迟隐藏和占用的信息,因为这是涉及GPU编程的非常基本的主题。有关不同GPU架构的内存子系统的更多详细信息,请查看CUDA Programming Guide。
- 我对共享存储库的理解是:共享内存分为32个相等的大存储库。那么这是否意味着每个区块(即eveyr区块有自己的32个存储库)还是每个SM?
最后,由于GPU内核的SIMD(SIMT)特性,实际的程序执行以扭曲方式发生。当这种扭曲(当前有效地意味着一组32个线程)执行共享内存访问时,随着该指令生成的共享内存请求得到处理,存储体冲突将成为一个问题。没有真正记载是否可以并行处理多个扭曲的共享内存请求。我的猜测是每个SM只有一个单元来处理共享内存请求,因此答案是否定的。
- 如果我在一个以上单词的共享内存中/从一个共享内存执行CudaMemcpy,这算作一次交易还是多次交易?这会导致银行冲突吗?
您不能cudaMemcpy()
进入共享内存。共享内存只能由相同块的设备线程访问,并且仅在该块运行时才持久存在。