[英]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.