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