2010-07-12 11 views
1

假設一個塊有512個線程的限制,比如我的內核需要超過512個線程來執行,應該如何設計線程層次以獲得最佳性能? (情況1)CUDA內核中的線程層次設計

第一嵌段 - 512個螺紋 第二塊 - 剩餘線程

(情況2)橫跨分配某些塊中的線程的數目相等。

+0

如果一個內核需要600個線程,最好的選擇是分配2個塊中的300個線程。或者是否有任何選項可以利用第一個塊的全部512個線程並保留在第二個塊中? – 2010-07-12 06:25:50

+0

我認爲這取決於你正試圖解決的問題。你能更具體一點嗎? – KLee1 2010-07-12 06:26:02

+0

如果我的內核需要601個線程或任何奇數,那麼應該如何分配塊? – 2010-07-12 06:27:22

回答

1

我不認爲這真的很重要,但它是一羣更重要的線程塊邏輯,讓你能夠使用其它CUDA優化(如內存合併)

This link提供一些見解CUDA將如何(可能)和組織你的線程。

從彙總引述:

總之,在 內核啓動特殊參數定義的 網格和塊的尺寸。獨特的 座標blockId和threadId 變量允許網格的線程以 區分它們。 程序員有責任在內核 函數中使用 這些變量,以便線程可以正確標識要處理的數據部分。這些變量 迫使程序員組織 線程和有數據到 分層和多維 組織。

0

爲了最大化計算/存儲器訪問重疊,最好將線程平分爲兩個塊。例如,當一個塊中有256個線程時,它們不會在同一時間內全部計算,而是通過32個線程的變形在SM上進行計劃。當一個warp正在等待全局內存數據時,計劃另一個warp。如果你有一小塊線程,那麼你的全局內存訪問就會受到更多的懲罰。

此外,在你的例子中,你的GPU不足。請記住,GPU有幾十個多處理器(例如C1060特斯拉的30),並且一個塊被映射到一個多處理器。在你的情況下,你將只使用2個多處理器。