繁体   English   中英

为什么我的内核没有超过共享内存限制?

[英]How come my kernel doesn't exceed the shared memory limit?

我正在从matlab调用CUDA内核。

以前有人告诉我(David Kirk的书),每个线程只能占用16kb的共享内存,但是我所消耗的内存远远超过此:

__global__ void plain(float* arg)
{

    __shared__ float array[12000];
    int k;

    for (k=1;k<12000; k++)
    {
        array[k]=1;
    }   
}

CUDA C报告浮点数为4个字节,这意味着数组的总大小为48Kb,大于12Kb。 运行正常,怎么可能呢?

我还被告知GPU共享内存的大小非常小-我该怎么办? 每个块的最大共享内存很重要。 卡的每个块的最大共享内存为49152字节,但是我能够以每个块1000个线程的速度运行上述代码。

似乎每块将使用49Kb,这是不对的。 是SM一次只服务一个块,并且保留了每个线程块只能有49Kb的条件吗?

每个块的49Kb共享内存与每个线程的16Kb共享内存如何协调?

谢谢

每个线程块分配共享内存,每个具有2.0和更高计算能力的SM最多可提供48 KB。 因此,在给定的SM上,您可能正在运行一个占用整个48 KB的线程块,或者说说三个线程块,每个线程块分配16 KB。 每个SM的16 KB共享内存的限制适用于<2.0的计算能力。 与按线程块分配的共享内存相反,按线程分配本地内存(“ local”表示“ thread local”)。

线程没有共享内存。 您的代码使用“阻止”共享内存(CUDA中没有其他共享内存)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM