2014-10-28 38 views
2

我參加了CUDA並行編程課程,並且我看到了很多CUDA線程配置的例子,在這些例子中,我們需要將線程的數量四捨五入到最接近的32的倍數。我知道線程被分組爲warp,如果你啓動1000個線程,那麼GPU會將它舍入到1024,所以爲什麼要明確地表達呢?爲什麼要在CUDA中啓動32個線程的倍數?

回答

3

建議通常在您可能會想到選擇各種線程塊大小以解決相同問題的情況下給出。

讓我們以矢量添加爲例。假設我的矢量長度爲100000.我可以選擇通過啓動100個1000線程塊來實現。在這種情況下,每個塊將有1000個活動線程和24個不活動線程。我的線程資源平均利用率爲1000/1024 = 97.6%。

現在,如果我選擇大小爲1024的塊呢?現在我只需要啓動98塊。這些塊的前97個在線程利用率方面得到充分利用 - 每個線程都在做一些有用的事情。第98塊只有672個(1024個)線程正在做一些有用的事情。由於線程檢查(if (idx < N))或其他內核代碼中的構造,其他顯式非活動。所以我在這個塊中有352個不活動的線程。但我的整體平均利用率十萬〇三百五十二分之十萬= 99.6%

因此,在上述情況下,最好選擇「全」 threadblocks,由32

整除如果你正在做載體上添加的矢量長度爲1000,並且您打算在單個線程塊中執行此操作(兩者可能都是錯誤的想法),那麼無論您爲線程塊大小選擇1000還是1024,都無關緊要。

相關問題