我一直在使用CUDA幾個星期,但我對塊/ warps/thread的分配有些疑問。 我正在從教學的角度來看(大學項目)的建築學,所以達到高峯表現並不是我關心的問題。CUDA塊/扭曲/線程如何映射到CUDA核心上?
首先,我想知道,如果我得到這些事實直:
程序員編寫內核,並在線程塊的網格組織執行。
將每個塊分配給流式多處理器(SM)。一旦分配,它就不能遷移到另一個SM。
每個SM將自己的塊分成Warps(當前最大大小爲32個線程)。變形中的所有線程都同時在SM的資源上執行。
線程的實際執行由SM中包含的CUDA Cores執行。線程和內核之間沒有特定的映射。
如果一個warp包含20個線程,但目前只有16個內核可用,warp將不會運行。另一方面,如果一個塊包含48個線程,它將被拆分成2個線程,並且它們將並行執行,只要有足夠的內存可用。
如果一個線程在一個內核上啓動,那麼對於內存訪問或長浮點操作而言,它會停止運行,它的執行可能會在另一個內核上恢復。
他們是否正確?
現在,我有一個GeForce 560 Ti,根據規格配備8個SM,每個SM包含48個CUDA核心(共384個核心)。
我的目標是確保架構的每個核心都執行相同的指令。假設我的代碼將不需要更多的寄存器比在每個SM可用的那些,我想象不同的方法:
創建的每個48個螺紋8點的塊,使得每個SM有1塊來執行。在這種情況下,48個線程將在SM中並行執行(利用所有可用的48個內核)?
如果我啓動64個6線程塊,是否有區別? (假設它們將均勻地映射到SM之間)如果我在計劃工作中「淹沒」GPU(例如,創建1024個1024線程的每個線程),是否合理假設所有核心都將是在某個點使用,並將執行相同的計算(假設線程永不停止)?
有什麼辦法可以使用探查器來檢查這些情況嗎?
這個東西有沒有參考?我閱讀了CUDA編程指南以及「編程大規模並行處理器」和「CUDA應用程序設計和開發」中致力於硬件體系結構的章節。但我無法得到確切的答案。
回答謝謝您的回答。我閱讀了參考文獻,但在答案中有一些我不明白的地方。在下面的問題中,我假設我們正在使用具有48個核心(16核心* 3「核心組」)的費米架構: 1.您提到了核心和laneid之間的映射。它是什麼樣的映射? 2.從參考資料中我瞭解到,每個「核心組」在每個時鐘週期內最多執行一次半翹曲(16個線程)。所以理論上,如果我們在同一個塊中有48個線程,它們將被組織成3個半變形並且在48個內核上並行執行。我對嗎? – Daedalus
CUDA內核是單精度FP單元的數量。根據CUDA核心思考執行是不正確的。每個warp有32個線程。這些線程將被髮布給一組執行單元(例如16個cuda核心)。爲了在單個時鐘內向所有48個內核發佈,兩個warp調度器中的一個需要選擇符合超標量對的req的warp,並且這兩個指令都需要是由CUDA內核執行的類型。另外,另一個warp調度器必須選擇一個warp,其下一條指令將由CUDA內核執行。 –
沒有要求經線位於同一個程序段中,或者程序段中的經線具有相同的程序計數器。 –