2012-05-05 68 views
104

我一直在使用CUDA幾個星期,但我對塊/ warps/thread的分配有些疑問。 我正在從教學的角度來看(大學項目)的建築學,所以達到高峯表現並不是我關心的問題。CUDA塊/扭曲/線程如何映射到CUDA核心上?

首先,我想知道,如果我得到這些事實直:

  1. 程序員編寫內核,並在線程塊的網格組織執行。

  2. 將每個塊分配給流式多處理器(SM)。一旦分配,它就不能遷移到另一個SM。

  3. 每個SM將自己的塊分成Warps(當前最大大小爲32個線程)。變形中的所有線程都同時在SM的資源上執行。

  4. 線程的實際執行由SM中包含的CUDA Cores執行。線程和內核之間沒有特定的映射。

  5. 如果一個warp包含20個線程,但目前只有16個內核可用,warp將不會運行。另一方面,如果一個塊包含48個線程,它將被拆分成2個線程,並且它們將並行執行,只要有足夠的內存可用。

  6. 如果一個線程在一個內核上啓動,那麼對於內存訪問或長浮點操作而言,它會停止運行,它的執行可能會在另一個內核上恢復。

他們是否正確?

現在,我有一個GeForce 560 Ti,根據規格配備8個SM,每個SM包含48個CUDA核心(共384個核心)。

我的目標是確保架構的每個核心都執行相同的指令。假設我的代碼將不需要更多的寄存器比在每個SM可用的那些,我想象不同的方法:

  1. 創建的每個48個螺紋8點的塊,使得每個SM有1塊來執行。在這種情況下,48個線程將在SM中並行執行(利用所有可用的48個內核)?

  2. 如果我啓動64個6線程塊,是否有區別? (假設它們將均勻地映射到SM之間)如果我在計劃工作中「淹沒」GPU(例如,創建1024個1024線程的每個線程),是否合理假設所有核心都將是在某個點使用,並將執行相同的計算(假設線程永不停止)?

  3. 有什麼辦法可以使用探查器來檢查這些情況嗎?

  4. 這個東西有沒有參考?我閱讀了CUDA編程指南以及「編程大規模並行處理器」和「CUDA應用程序設計和開發」中致力於硬件體系結構的章節。但我無法得到確切的答案。

回答

94

最好的參考中有兩個是

  1. NVIDIA Fermi Compute Architecture Whitepaper
  2. GF104 Reviews

我會盡力回答您的每一個問題。

程序員將工作分爲線程,線程轉換爲線程塊,線程塊轉換爲網格。計算工作分配器將線程塊分配給流式多處理器(SM)。一旦一個線程塊被分配給一個SM,線程塊的資源就被分配(warp和共享內存),並且線程被分成32個線程的組,稱爲warps。一旦分配了經紗,它就被稱爲主動扭曲。兩個warp調度程序在每個循環中選擇兩個活動warp,並將warp發送到執行單元。有關執行單元和指令調度的更多細節,請參見1第7-10頁和第2

4'。 laneid(warp中的線索索引)和一個核心之間有映射關係。

5'。如果一個warp包含少於32個線程,那麼在大多數情況下,它將被執行,就像它有32個線程一樣。由於以下幾個原因,Warps可能有少於32個活動線程:每個塊的線程數量不能被32整除,程序執行一個發散塊,以使未採用當前路徑的線程被標記爲非活動狀態,或者退出線程。

6'。線程塊將分爲 WarpsPerBlock =(ThreadsPerBlock + WarpSize - 1)/ WarpSize 沒有要求warp調度程序從同一個線程塊中選擇兩個warp。

7'。執行單元不會在內存操作中停頓。如果某個資源在指令準備好分派時不可用,那麼指令將在資源可用時再次分派。經線可能會在屏障,內存操作,紋理操作,數據依賴性等方面停頓。失敗的warp不適合warp調度程序選擇。在Fermi上,每個週期至少有2個符合條件的warp是有用的,這樣warp調度器就可以發出指令。

GTX480與GTX560之間的區別請參見參考2

如果你閱讀參考資料(幾分鐘),我想你會發現你的目標沒有意義。我會盡力迴應你的觀點。

1'。如果你啓動內核< < < 8,48 >>>你會得到8塊,每塊有32個和16個線程的2個warp。不能保證將這8個塊分配給不同的SM。如果將2個塊分配給SM,那麼每個warp調度程序可以選擇warp並執行warp。您只能使用48個內核中的32個。

2'。48個線程的8個塊和6個線程的64個塊之間存在很大差異。假設你的內核沒有分歧,每個線程執行10條指令。

  • 8塊48個螺紋= 16根經紗×10個指令= 160個指令
  • 64個塊與6個線程= 64根經紗×10個指令= 640個指令

爲了得到最佳效率的工作分工應該是32個線程的倍數。硬件不會合並來自不同經線的線程。

3'。如果內核沒有最大化寄存器或共享內存,則GTX560一次可以有8個SM * 8塊= 64個塊或8個SM * 48個warps = 512個wargs。在任何時候,部分工作將在SMs上開展。每個SM都有多個執行單元(多於CUDA內核)。在任何給定時間使用哪些資源取決於應用程序的warp調度程序和指令組合。如果你不做TEX操作,那麼TEX單元將空閒。如果你不做特殊的浮點運算,SUFU單元將空閒。

4'。並行Nsight和Visual Profiler顯示

a。執行IPC

b。發行IPC

c。每個活動週期的主動經線

d。每個活動週期合格的經紗(僅適用於Nsight)

e。經紗失速原因(僅限Nsight)

f。執行每條指令的活動線程數

分析器不顯示任何執行單元的使用率百分比。對於GTX560,粗略的估計是IssuedIPC/MaxIPC。 對於MaxIPC假設 GF100(GTX480)是2 GF10x(GTX560)是4但目標是3是更好的目標。 「

+0

回答謝謝您的回答。我閱讀了參考文獻,但在答案中有一些我不明白的地方。在下面的問題中,我假設我們正在使用具有48個核心(16核心* 3「核心組」)的費米架構: 1.您提到了核心和laneid之間的映射。它是什麼樣的映射? 2.從參考資料中我瞭解到,每個「核心組」在每個時鐘週期內最多執行一次半翹曲(16個線程)。所以理論上,如果我們在同一個塊中有48個線程,它們將被組織成3個半變形並且在48個內核上並行執行。我對嗎? – Daedalus

+0

CUDA內核是單精度FP單元的數量。根據CUDA核心思考執行是不正確的。每個warp有32個線程。這些線程將被髮布給一組執行單元(例如16個cuda核心)。爲了在單個時鐘內向所有48個內核發佈,兩個warp調度器中的一個需要選擇符合超標量對的req的warp,並且這兩個指令都需要是由CUDA內核執行的類型。另外,另一個warp調度器必須選擇一個warp,其下一條指令將由CUDA內核執行。 –

+0

沒有要求經線位於同一個程序段中,或者程序段中的經線具有相同的程序計數器。 –

5

」E.如果一個warp包含20個線程,但目前只有16個可用內核,warp將不會運行。「

不正確。你們通常意義上的內核(也用在CPU中)是令人困惑的 - GPU中「多處理器」的數量,nVIDIA營銷中的內核說「我們的卡擁有數千個CUDA內核」。

一個warp本身只能在單個核心(=多處理器)上進行調度,並且最多可以同時運行32個線程;它不能使用多於一個核心。

數字「48 warps」是在具有Compute Capability 2.x的nVIDIA GPU上,每個多處理器的最大活動warp數(可以選擇安排在下一個週期中工作,在任何給定週期中的warps) ;並且這個數字對應於1536 = 48 x 32個線程。基於this webinar

+0

@GregSmith:編輯瞭解決此問題的答案。你很耐心,但是 - 已經有五年了...... – einpoklum

+0

single core(= multiprocessor)?我認爲問題假設術語單核=處理器而不是多處理器。用你的術語你的答案是正確的。 – Adarsh