2013-11-14 49 views
1

我正在實現的算法有許多事情需要並行完成。我的問題是,如果我不打算使用共享內存,我應該更喜歡使用更少的線程/塊或更多的線程/塊來減少性能的塊,以便總線程數加起來就是我需要的並行數量去做?Cuda塊或線程首選項

+0

[CUDA確定每個塊的線程,每個網格的塊的可能重複](http://stackoverflow.com/questions/4391162/cuda-determining-threads-per-block-blocks-per-grid),[CUDA,如何選擇<<<塊,線程<>>?](http://stackoverflow.com/questions/12660060/cuda-how-to-choose-blocks-threads),也許[CUDA - 如果我選擇了太多塊?](http://stackoverflow.com/questions/5476152/cuda-what-if-i-choose-too-many-blocks)。 – JackOLantern

回答

1

我假設「設定數量的東西」是一個小數字,或者你不會問這個問題。試圖揭示更多的並行性可能花費時間。

CUDA GPUs組執行活動和結果內存訪問到32個線程的warps。所以至少要創建每個線程塊至少一個warp。

然後,您會希望至少創建與GPU中SM一樣多的線程塊。如果你有4個SM,那麼你在32以上的下一個縮放增量就是創建4個線程塊,每個線程塊有32個線程。

如果在這個假設的例子中你有超過128個「數目的東西」,那麼你可能會想要增加每個線程塊和線程塊的扭曲。你可能會從threadblocks開始,直到你得到一些數字,大約16個左右,這將允許你的代碼在比你假設的4-SM GPU更大的GPU上擴展。但是可以在單個SM上打開的線程塊數量是有限制的,因此在16個線程塊之後很快就會增加每個線程塊超過1的線程數量(即超過32個線程)。

這些針對小問題的策略將允許您在問題擴大時儘可能快地利用GPU上的所有硬件,同時如果問題足夠大,仍然允許隱藏延遲時間的機會(例如,超過每個線程塊有一個warp,或者每個SM有多個threadblock)。