2014-09-10 110 views
0

我已經測試了NVIDIA探查器內核,其輸出如下:GPU利用率解讀

enter image description here

我們已經推出了具有256塊和256個線程內核。 據我明白了,GRAFIC示出了三個部分,一個用於扭曲,一個用於寄存器,一個用於共享內存和每個部分具有計算出的「塊限制」,從該一個在寄存器部是最小和最大限制值。 顯然,內核是綁定的,我們只能在一個SM上同時啓動4個塊。這就是Profiler所說的。我堅決問自己關於以下的事情:

一個GTX 780鈦,擁有192個核心的一個SM,怎麼可能是4塊* 256個線程= 1024個線程可以同時推出?無論如何,CUDA中的術語「同時」是指什麼?這是否意味着,可以在調度程序中同時調度4個塊,並且SM以當前單塊的變形以鎖步方式執行指令。這個詞同時有點混淆?

非常感謝

+1

每線程寄存器,其使用的是在目前的數量限制塊,其可以同時(在同一時間)上的一個SM執行的數目。因此GPU沒有得到充分利用。請記住,寄存器,塊和線程之間的關係是一種三方關係。這個文檔http://developer.download.nvidia.com/compute/cuda/CUDA_Occupancy_calculator.xls可以幫助你。 – KiaMorot 2014-09-10 12:46:19

回答

5

的GPU是一個延遲隱藏機器,並且在延遲隱藏涉及在各種執行單元調度各個線程(指令),在每一循環/發出槽。爲了最好地隱藏延遲,GPU喜歡有更多的可用線程來選擇指令,而不是SM上的執行單元。

所以在給定的週期內,可能只有192個(或更少的,可能)的執行單元由warp調度器調度,但是在下一個週期/問題槽中,可以調度更多的指令。爲了促進這個過程,我們希望儘可能多的線程/ warps /塊可用於調度。這裏的「同時」是指在SM上「打開」和「可以調度」的線程/扭曲/塊的數量。它並不是指在任何問題槽中發出的實際指令數量,也不涉及SM上「核心」或「執行單元」的數量。

可以在任何給定時間在SM上「打開」的線程/ warps /塊的數量(以便可用於調度目的)可能受限於所討論的線程塊的資源使用。高寄存器使用Threadblocks,例如,可能會限制threadblocks,可以是對SM「開放」的總數,因爲SM必須分配的全寄存器設置爲每「開放」 threadblock。

由於GTX 780的Ti採用了GK110 GPU,該GK110 white paper可能會感興趣的。

+0

感謝您的可愛解釋。你寫了「,但在下一個週期/問題槽中,可以安排更多指導。」 - >你的意思是什麼?預定了192多條指令?如果是這樣的話,由於有192個可用內核,因此一個塊中最多隻能有192個線程同時執行一條指令仍然是事實。 – Gabriel 2014-09-10 17:39:38

+0

GPU執行單元是流水線式的。 「更多」是指新指令(與之前發佈的指令相比),不是「超過192」。由於先前發出的指令可以在管道運行的不同階段,說這樣的話「最多隻有從一個塊192個線程可以在同一時間執行一條指令」是不理智的。在任何給定的時刻,各種指令都在流水線上執行。關於*在單個週期/問題槽中可以發佈什麼*,它仍然不完全正確,因爲開普勒SM中有超過192個執行單元。 – 2014-09-10 17:58:14

+0

192「核心」大致指SP單位。除SP單元外還有其他執行單元。但是隻有4個warp調度器,每個都可以雙重發布warp的價值指示。所以最大理論值是8 * 32 = 256個線程指令。這種最大理論在實踐中通常不會實現。即使是這樣,256條線程指令也不能全部是相同的類型(例如SP浮點乘法)。 – 2014-09-10 18:00:11