shared memory数量限制是针对每个SM还是每个block?

TeslaC1060中shared memory的数量为:
“Totalamountof shared memory per block:16384bytes”
显然,每个block能用的shared memory不能超过16384B(right?)
但是更进一步,运行于一个SM上的多个block的SMEM总和是否可以超过16384B呢?

便于说明,直接考虑个极端情况: 16384B =4096个float,令kernel的__shared__数组为float BUF[4][1024]. 那么,是不是总的block数目(gridDim.xgridDimx.ygridDim.z)就不能超过30(C1060的SM数)了?

意思和疑问应该表述清楚了吧?请各位指点一下:D
Thanks!

LZ您好:

对于1.x硬件,每个SM上最大的shared memory量为16KB,对于2.x以及更高版本的硬件,每个SM上最大的shared memory数量是48KB。

一个block所能使用的最大的shared memory数量就是一个SM上所拥有的shared memory的数量,因为此时,一个SM上只能resident 一个block。
换句话说,SM是硬件实体而block是一个软件概念,block需要使用SM上的资源。如果 一个block使用资源较少,那么一个SM上可以resident多个block(注意,这里仍然有限制,即便每个block都极小,1.x和2.x硬件上一个SM上最多只能resident 8个blocks;3.0和3.5可以resident 16个blocks),如果一个block占用的资源较多,比如说占用了全部16KB/48KB的shared memory,那么一个SM上只能resident 1个block。如果用超了,直接会拒绝执行的。

因此您应该明白,一个SM上的最大shared memory数量与一个block可使用的最大shared memory数量这两个数值相等,是十分自然的。以及,一个SM上多个resident blocks总共占用的shared memory资源之和也不能超出一个SM上的shared memory资源总量的。

这是您的第一个问题。

但是,这个和grid中总的block数量是无关的。

硬件能支持的grid中的block数量至少是6553565535个,(对于fermi是6553565535*65535,kepler则是(2^31-1)6553565535)。

这里只和计算能力版本有关,和SM数量无关,哪怕只有一个SM也可以。

因为block不是全部加载在SM上的,而是每次加载一个或者数个,有运行完的block会释放SM资源,并且加载新的block上来。所以在没有其他限制因素的前提下,10个SM的GPU能跑的代码,1个SM的GPU也可以跑,就是慢点。您最多可以说同时resident的block数量有所减少,但这并不影响您grid中block的总数。

这是您第二段中的问题。

大致如此,供您参考。

祝您好运~

以及需要补充一点的是,在1.x计算能力版本的硬件上,shared memory还担负着保存kernel函数参数的任务,因此经常会被占用掉一小部分,因此如果您一个block恰好使用16KB shared memory的话,此时是无法运行的,需要少用一些才行。

对于2.x及更新的硬件,kernel函数的参数被装入constant cache,不占用shared memory。

以上内容经横扫千军斑竹提醒,特此补充。

祝LZ编码顺利~

哈,版主给力!分析透彻,信息量巨大
我理解一下先…
多谢~

不客气的,十分荣幸为您服务。

以及,这些都是手册上的内容,也是常见内容的。

欢迎您莅临论坛,祝您好运~

说一下我对版主帖子的理解:
针对C1060:
(1)每个block的SMEM数量需要小于16KB,留点空间给kernel函数参数
(2)grid中block数目限制是软件层面的,每个block的SMEM数量乘以grid中总的block数目可以大于16KB
(3)但是同时resident在一个SM上的block数目受两个限制:①硬件计算能力,也就是不超过8个;②这些block所用的SMEM总量要低于16KB

对吧?

LZ您好:

1:正确。

2:按照手册说法,GPU支持的最大grid规模和计算能力版本是有关的,所以这里应该还和硬件设计有关而不是单纯的软件层面,但是并无进一步资料。

每个block的shared memory的用量乘以grid中block的总数,完全可以大于16KB,甚至大于16KB*SM数量。以及,其他各项资源也是如此。但是这个一般并不强调,一般只考虑resident状态的block占据的资源,反过来SM上资源也只是限制resident block/thread的多少。所有resident的block才是“同时”占据GPU/SM资源的,也才受到GPU/SM资源的约束。

3:同时resident在一个SM上的block数目受到这两个限制,但并不仅受到这两个限制。还受到诸如SM上寄存器资源数量的限制,以及SM上最大resident threads数量的限制等。您可以在programming guide的Appendix.F里找到具体的约束。

大致如此,供您参考。

祝您编码顺利~

明白了,版主解答巨全面
多谢版主:D

不客气的,十分荣欣为您解答。

欢迎您常来论坛参与讨论。

祝您一切顺利~

斑竹太强大了。真的。膜拜啊
另感谢 斑竹对我的技术支持