2012-08-08 67 views
2

如果每個塊中的線程數量已經大於CUDA內核的數量,那麼可以在每次啓動塊時同時啓動塊的網格,是否有任何性能優勢?CUDA並行塊的最優數量

回答

5

我覺得有;一個線程塊被分配給一個流處理多處理器(SM),並且SM進一步將每個塊的線程劃分爲32個線程(較新的體系結構可以處理較大的線程),這些線程被調度爲按順序執行(更多)。考慮到這一點,將每個計算分解成塊以便它們佔用儘可能多的SM將會更快。這也意味着完全構建塊是卡支持的每個變形的線程的多個線程(對於SM使用32線程變形的情況,該塊爲32或64個線程而不是40個線程)。

+1

即使對於Kepler GPU,Warp大小仍然是32個線程。 – Eugene 2012-08-08 17:13:13

+2

另請注意,SM上同時運行的網格(塊)數量有限制(維基百科說費米和開普勒爲16,我不知道這是否是合適的數字)。所以大量的小塊不會讓應用程序正確地填充硬件。 – Eugene 2012-08-08 17:15:41

1

啓動延遲

啓動延遲(API調用工作開始在GPU)是一格的是Linux 3-8微秒在Windows Vista/Win7的 30-80微秒。

將功能塊分配給SM的時間爲10-100s ns。

在一個塊(32個線程)中啓動一個warp是幾個週期,並且在每個SM上並行發生。

資源限制

併發內核 - 特斯拉N/A僅1個格在一個時間 - 費米在時間 16個光柵 - 開普勒16網格(Kepler2 32個網格)

最大塊(不考慮佔用限制) -Tesla SmCount * 8(gtx280 = 30 * 8 = 240) -費米SmCount * 16(gf100 = 16 * 16 = 256) -開普勒SmCount * 16(gk104 = 8 * 16 = 128 )

參見限制佔用率計算器,每塊的線程,每個線程SM,SM每個寄存器,每個線程寄存器,...

扭曲調度和CUDA核心

CUDA核心的浮點/ ALU單位。每個SM都有其他類型的執行單元,包括加載/存儲,特殊功能,分支等。CUDA內核相當於x86處理器中的SIMD單元。它不等同於x86內核。

佔用率是每個SM對每個SM的最大翹曲數量的測量。每根SM的彎曲越多,彎曲調度程序具有合格彎曲的機會就越高。但是,佔用率越高,每個線程可用的資源就越少。作爲一個基本目標要指定的地區超過

25%,8特斯拉 扭曲50%或費米 24個經線50%或開普勒(通常更高)

你會發現有32根經線在這些計算中與CUDA核心沒有真正的關係。

爲了更好地理解這一點,請閱讀Fermi白皮書,如果您可以使用Nsight Visual Studio Edition CUDA Profiler查看問題效率實驗(尚未在CUDA Profiler或Visual Profiler中提供)以瞭解您的內核如何隱藏執行和內存延遲。