簡體   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