2012-04-30 62 views
0

我對cuda的調度系統有幾個疑問。CUDA如何安排線程

答:當我使用例如foo < < < 255,255 >>()函數,卡內實際發生了什麼?我知道每個SM從上級接收一個要安排的塊,並且每個SM負責安排其傳入的BLOCK,但是哪一部分執行?例如,如果我有8個SM,每個SM包含8個小CPU,則上級負責安排剩餘的255 * 255 - (8 * 8)個線程?

B.什麼是可以定義的最大線程的限制?我的意思是foo<<<X, Y>>>(); x,y =?

C.關於最後一個例子,一個塊內可以有多少個線程?我們可以說,我們有更多的塊/線程,執行速度會更快嗎?

感謝您的幫助

回答

3

A.計算工作分配器將從網格向SM分配一個塊。 SM將通過warp轉換塊(所有NVIDIA GPU上的WARP_SIZE = 32)。 Fermi 2.0 GPU每個SM都有兩個共享一組數據路徑的warp調度器。每個週期中,每個warp調度程序都會挑選一個warp並向其中一條數據路徑發出指令(請不要考慮CUDA內核)。在Fermi 2.1 GPU上,每個warp調度程序都有獨立的數據路徑以及一組共享數據路徑。在每個週期2.1上,每個變形調度程序將挑選一個變形,並嘗試爲每個變形指定雙重指令。

warp調度程序試圖優化數據路徑的使用。這意味着單個warp可能會在背對背循環中執行多條指令,或者warp調度程序可以選擇每個循環從不同的warp發出。

每個SM可處理的經線/線程數在CUDA編程指南v.4.2表F-1中指定。這從768個線程擴展到2048個線程(24-64個經線)。

B.每次啓動的最大線程數由最大GridDims *每塊最大線程數定義。請參閱表F-1或參閱cudaGetDeviceProperties的文檔。 C.請參閱與(B)相同的資源。線程/塊的最佳分配由您的算法分區定義,並受佔用率計算的影響。基於SM上的經紗的問題集大小以及在指令障礙(除其他事項)上阻塞的時間量,可觀察到的性能影響。對於初學者,我建議每個SM至少2個街區,佔用率約50%。

0

B.這取決於你的設備上。您可以使用cuda功能cudaGetDeviceProperties查看設備的規格。一個公共的最大數目是y =每塊1024線程,x = 65535塊每個網格維度。

C.通常的做法是擁有2(128,256,512等)線程/塊的冪。減少大型陣列非常有效(見Reduction)。塊和線程的最佳分配實際上取決於您的應用程序和硬件。我個人在TeslaM2050上使用512個線程/塊進行大型稀疏線性代數計算,因爲它對我的應用程序來說效率最高。