首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基本cuda共享内存

基本cuda共享内存
EN

Stack Overflow用户
提问于 2018-09-07 10:25:22
回答 1查看 401关注 0票数 2

我是库达的新手,我有几个关于共享记忆的问题:

  1. 是否每个SM在同一个GPU中都有相同数量的共享内存?
  2. SM如何在块之间划分共享内存?它是否平均分配(例如。如果有两个块,那么无论实际使用了多少块,每个块都获得SM中共享内存的一半),还是基于需求?
  3. 我对共享内存库的理解是:共享内存被分成32个同样大的内存库。那么,这意味着每个块(即每个块都有自己的32家银行)还是每个SM?
  4. 如果我执行一个从多个单词组成的共享备忘录中的CudaMemcpy,这算一个事务还是多个事务?这会导致银行冲突吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-07 11:07:59

让我首先指出,共享内存首先是编程模型的抽象,通过该模型暴露了硬件的某一特性(快速的片上内存)。在CUDA编程模型中,网格中的每个块(内核启动)获得相同数量的共享内存。这取决于内核函数所需的静态分配共享内存量以及内核启动中指定的任何额外的动态共享内存。

  1. 是否每个SM在同一个GPU中都有相同数量的共享内存?

是的,目前的情况是这样。然而,这与您可能认为的编写CUDA程序的方式不太相关,因为:

  1. SM如何在块之间划分共享内存?它是否平均分配(例如。如果有两个块,那么无论实际使用了多少块,每个块都获得SM中共享内存的一半),还是基于需求?

当启动内核时,可以指定每个块需要多少共享内存。然后通知每个多处理器可以容纳多少块。所以,不是块的数量定义了每个块获得多少共享内存,而是反过来:每个块所需的共享内存量是决定每个多处理器上可以驻留多少块的因素之一。

当涉及到GPU编程时,您会想了解延迟、隐藏和占用,因为这些都是非常基本的主题。有关不同GPU体系结构的内存子系统的更多细节,请查看CUDA编程指南

  1. 我对共享内存库的理解是:共享内存被分成32个同样大的内存库。那么,这意味着每个块(即每个块都有自己的32家银行)还是每个SM?

最后,由于GPU内核的SIMD (SIMT)特性,实际的程序执行发生了翘曲。当这种扭曲(目前,这实际上意味着一组32个线程)执行共享内存访问时,当该指令生成的共享内存请求被服务时,银行冲突将是一个问题。对于多个翘曲的共享内存请求是否可以并行处理,并没有进行真正的记录。我的猜测是,每个SM只有一个单元来处理共享内存请求,因此答案是否定的。

  1. 如果我执行一个从多个单词组成的共享备忘录中的CudaMemcpy,这算一个事务还是多个事务?这会导致银行冲突吗?

不能将cudaMemcpy()输入共享内存。只有同一块的设备线程才能访问共享内存,并且只有在该块运行时它才会持续。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52220535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档