2011-04-10 88 views
4

我已經在cuda中編寫了一個應用程序,它在每個塊中使用1kb的共享內存。 由於每個SM中只有16kb的共享內存,因此總共只能容納16個塊(我是否正確理解它?),儘管一次只能調度8個塊,但現在如果某個塊正忙着做內存操作,所以其他塊將在GPU上安排,但所有的共享內存被其他16塊已經在那裏調度使用,所以除非先前分配的塊完全完成,否則cuda不會在同一個SM上安排更多塊。或者它會將一些塊的共享內存移動到全局內存,並在那裏分配其他塊(在這種情況下,我們應該擔心全局內存訪問延遲?)共享內存優化混淆

回答

7

它不起作用。這將被安排在一個單獨的SM任何特定的時刻運行塊的數量永遠是最低如下:

  1. 8塊
  2. 塊,其靜態和與動態分配共享數內存小於16kb或48kb,取決於GPU架構和設置。還有共享內存頁面大小限制,這意味着每塊分配被四捨五入到頁面大小的下一個最大倍數
  3. 每個塊寄存器使用的總和小於8192/16384/32678的塊的數量取決於體系結構。還有寄存器文件頁面大小,這意味着每塊分配四捨五入到頁面大小的下一個最大倍數。

這就是它的全部。沒有「分頁」共享內存來容納更多的塊。 NVIDIA產生一個計算佔用率的電子表格,隨工具包一起提供,並可單獨下載。您可以在其包含的公式中看到確切的規則。它們也在CUDA編程指南的第4.2節中討論。

+0

那麼這是否意味着有時最好不要使用共享內存?因爲更多的塊將並行運行? – scatman 2011-04-11 09:05:26

+0

這真的取決於。共享內存慢得多,寄存器和寄存器沒有存儲區衝突,因此,如果可能的話,最好使用共享內存上的寄存器。共享內存的傳統用途是允許塊之間的線程之間的數據重用,並且在前費米時間內對此非常有效。在Fermi中,共享內存的情況可能不那麼引人注目。 L1和L2高速緩存意味着你可以在不做任何事情的情況下經常在共享內存薄荷產出中獲得很大的一部分,並且沒有銀行衝突或序列化效應需要擔心。 – talonmies 2011-04-11 09:29:03

+0

因此,如果某個塊在一個SM上一次調度到一個塊,現在所有的warp都在等待內存操作完成,那麼cuda將調度另一個block在同一個SM上(共享內存數據會發生什麼情況已分配的塊?),還是等待分配的塊完成其操作? – peeyush 2011-04-11 12:13:26