簡體   English   中英

在內核中聲明共享內存變量

[英]declaring shared memory variables in a kernel

我有一個關於共享變量如何工作的問題。

當我在這樣的內核中聲明一個共享變量__shared__ int array1[N] ,每個活動塊的每個唯一共享內存現在都有一個大小為N的array1實例。這意味着每個活動塊的每個共享內存現在已經分配了N * sizeof (int)字節。 對於具有計算能力1.3的gpu,N * sizeof(int)必須至多為16KB。

因此,假設上述情況正確並且使用在主機上分配的2D線程和2D塊,如下所示:

dim3 block_size(22,22);
dim3 grid_size(25,25);

我將擁有25x25個array1實例,每個實例的大小為N * sizeof(int),並且可以訪問塊的每個共享內存的大多數線程是22x22。 這是我原來的問題,並得到了答復。

問:當我為array1分配一個值時

array1[0]=1;

那么所有活動塊會立即在自己的共享內存中分配該值嗎?

每個塊將始終分配自己的共享內存陣列。 因此,如果啟動25x25塊,最終將在共享內存中創建25x25陣列。

但是,並不意味着所有這些數組將同時存在,因為不能保證所有數據塊同時存在。 活動塊的數量取決於正在運行的GPU的實際模型。 GPU驅動程序將嘗試盡可能多地啟動,並且額外的blocsk將在之前的工作結束之后運行。

N * sizeof(int)的最大值取決於卡的Compute Capaibity和L1-cache配置。 它可以在:8KB,16KB,32KB和48KB之間變化。

要回答您的上一個問題 - 屬於相應塊的所有線程都可以看到每個共享數組。 在您的情況下,相應的22x22線程將顯示每個共享陣列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM