4
我已經在cuda中編寫了一個應用程序,它在每個塊中使用1kb的共享內存。 由於每個SM中只有16kb的共享內存,因此總共只能容納16個塊(我是否正確理解它?),儘管一次只能調度8個塊,但現在如果某個塊正忙着做內存操作,所以其他塊將在GPU上安排,但所有的共享內存被其他16塊已經在那裏調度使用,所以除非先前分配的塊完全完成,否則cuda不會在同一個SM上安排更多塊。或者它會將一些塊的共享內存移動到全局內存,並在那裏分配其他塊(在這種情況下,我們應該擔心全局內存訪問延遲?)共享內存優化混淆
那麼這是否意味着有時最好不要使用共享內存?因爲更多的塊將並行運行? – scatman 2011-04-11 09:05:26
這真的取決於。共享內存慢得多,寄存器和寄存器沒有存儲區衝突,因此,如果可能的話,最好使用共享內存上的寄存器。共享內存的傳統用途是允許塊之間的線程之間的數據重用,並且在前費米時間內對此非常有效。在Fermi中,共享內存的情況可能不那麼引人注目。 L1和L2高速緩存意味着你可以在不做任何事情的情況下經常在共享內存薄荷產出中獲得很大的一部分,並且沒有銀行衝突或序列化效應需要擔心。 – talonmies 2011-04-11 09:29:03
因此,如果某個塊在一個SM上一次調度到一個塊,現在所有的warp都在等待內存操作完成,那麼cuda將調度另一個block在同一個SM上(共享內存數據會發生什麼情況已分配的塊?),還是等待分配的塊完成其操作? – peeyush 2011-04-11 12:13:26