比如对于GTX760,sm数量为8,sp数量为192。当我将block数量和线程数量分别设定为16和192时。
如果在核函数中声明:
global ker()
{
volatile shared float sdata[SIZE_SHARE_DATA];
…
}
那么实际所开辟的共享内存数量是以一个逻辑block来划分还是以物理的SM来划分?
也就是说,在运行完核函数的声明后,一个sm中的shared memory是分配了2个sdata还是只分配了1个sdata?
比如对于GTX760,sm数量为8,sp数量为192。当我将block数量和线程数量分别设定为16和192时。
如果在核函数中声明:
global ker()
{
volatile shared float sdata[SIZE_SHARE_DATA];
…
}
那么实际所开辟的共享内存数量是以一个逻辑block来划分还是以物理的SM来划分?
也就是说,在运行完核函数的声明后,一个sm中的shared memory是分配了2个sdata还是只分配了1个sdata?
8个SM, 每个SM有24个SP,创建了16个block,每个block有12个thread。然后一个block运行在一个SP上面。那么在shared memory上就分配了一个sdata,为什么会有2个sdata这种想法?
LZ您好:
shared memory虽然使用了SM上的硬件资源,但实际上总是一个block分配一份的。如果一个block所声明的shared memory用量超过了一个SM上的资源总量,那么是无法执行的。以及,如果一个block只声明了很少的一部分shared memory而一个SM上同时resident了多个block,那么会从SM的硬件资源中划分出多份给多个resident的block使用的。
以及,如果block的数量非常巨大,那么一个SM上当前resident的block计算结束以后,会释放相应的shared memory资源,供后面加载到SM上的block继续使用。
具体到您的问题,您的显卡是kepler架构的,根据programming guide,您的一个SMX上可以最多resident 16个blocks,以及,您的每个block有192个线程,以及根据某来源的测试表明,硬件调度会优先将blocks发送到不同的SMX上(也就是优先均匀安排工作),此时SMX上最大resident block数量和最大resident threads数量都不构成限制。
此时,如果您的每个block申请的shared memory数量不超过SMX上shared memory硬件资源的一半(8KB/24KB),您的每个SMX上会resident 2个block,以及此时一个SMX上会划分出两块shared memory资源给您的两个block的sdata使用。
或者,如果您的每个block申请的shared memory数量超过了SMX上shared memory硬件资源的一半(8KB/24KB),您的每个SMX上仅会resident 1个block,以及此时一个SMX上会划分出一块shared memory资源给您的一个block的sdata使用。
总而言之,当block使用shared memory的时候,一个SMX上划分出几块shared memory仅取决于您一个SMX上resident blocks的多少。而一个SMX上能resident多少个blocks受到多个因素的限制,比如SMX上最大resident blocks数量的限制,SMX上最大resident threads的限制,每个block 申请shared memory大小的限制等。
您的问题大致答复如上,祝您编码顺利~
sally_您好:
感谢您积极回帖参与讨论。
但是您的说法都是错误的。
1:目前为止的NV 的支持CUDA的GPU设计中,没有任何架构是每个SM有24个SP的这种设计。其中1.x硬件是每SM 8SP,2.0是每SM 32SP,2.1是每SM 48SP,3.x是每SMX 192SP。
2:根据1#说法,每个block内是192个thread。192是每block线程数的典型值。(以及,这个数值与kepler GPU每SM 192SP并无直接关系)每个block一般不会选取12个thread这种配置,12个thread过于小了,连一个warp都不到,将明显影响计算效率。
3:block是运行在SM上的,block内的thread是运行在SP上的。确切一点的说法是,block是resident在SM上的,SM上resident的block(s)的各个连续线程以warp为单位对于当前指令发射到SM内部的以SP为主的计算单元和LSU上执行,并随时从执行单元切出以便其他就绪的warp使用执行单元,以此机制来掩盖计算和访存的延迟。
4:LZ的情况确实是一个SMX上划分出两个sdata,具体原因前文已经详述。
大致如此,欢迎您常来论坛~
非常感谢版主的细心解释!刚开始接触CUDA,估计还会犯更多的错误!
版主你说的根据 programming guide.是指哪个文档?也就是对于各种GPU的架构,SP,SM,最大block数啊之类的查询。
sally_您好:
我指的是 CUDA C Programming Guide,这个是随着CUDA Toolkit附带的。
您可以在Appendix.F中找到各架构GPU的硬件资源特性。
祝您好运~
我有看到。谢谢!
不客气的,欢迎您常来~
多谢版主指教,如此细致的作答加深了我对cuda工作原理的认识。
[
不客气的,欢迎您常来论坛,一同探讨!
祝您编码顺利!
[
不客气的,欢迎您常来论坛,一同探讨!
祝您编码顺利!