您應該查看NVIDIA網站上的webinars,您可以加入實時會話或查看預先錄製的會話。下面是一個簡要的概述,但我強烈建議您觀看網絡研討會,他們會真正幫助您,因爲您可以看到圖表並在同一時間進行解釋。
當您執行在GPU上是一個函數(內核)執行作爲電網的塊的線程。
- 甲螺紋是最精細粒度,每個線程有其用於選擇操作在其上的數據塊(threadIdx)內的唯一標識符。該線程可以具有相對大量的寄存器,並且還具有被稱爲本地存儲器的專用存儲區域,其用於寄存器文件溢出和任何大的自動變量。
- A 塊是一批一起執行的線程組。這種粒度級的主要原因是塊內的線程可以通過使用快速共享內存進行通信來進行協作。每個塊都有一個唯一的標識符(blockIdx),它與threadIdx一起用於選擇數據。
- A 網格是一組執行GPU操作的模塊。
這是邏輯層次結構。您實際上只需瞭解邏輯層次結構即可在GPU上實現功能,但要獲得性能,您還需要理解SM和SP的硬件。
甲GPU由SM的,並且每個SM包含多個SP的。目前每個SM有8個SP,每個GPU有1到30個SM,但真正的實際數量並不是一個主要的問題,除非你真的進步了。
第一點要考慮性能的是扭曲。一個warp是一組32個線程(如果你在一個塊中有128個線程(例如),那麼線程0-31將在一個warp中,在下一個中爲32-63等。由於一些原因,warps非常重要,最重要的是:
- 如果warp中的線程落在if-else塊的'if'側並且其他的落在'else'之後,則warp中的線程綁定在一起,然後其實所有的32個線程對雙方都去了。從功能上是沒有問題的,這不應該採取的分支這些線程被禁用,所以你總是會得到正確的結果,但如果雙方都長那麼性能損失是很重要的。
- 經線內的線程(實際上是一個半經線,但如果你對經線正確的話,那麼你是安全的在下一代也一樣)從內存中獲取數據在一起,所以如果你可以確保所有的線程在相同的'段'中獲取數據,那麼你將只支付一個內存交易,如果他們都從隨機地址獲取,那麼你將支付32內存交易。有關詳細信息,請參閱Advanced CUDA C演示文稿,但僅限於準備就緒!一經訪問共享內存(在目前的GPU再次半warp)在一起,如果你不小心,你就會有「銀行衝突」,其中線程要排隊背後互相訪問存儲器內的
- 線程。
因此,瞭解了warp是什麼,最後一點是塊和網格如何映射到GPU上。
每個塊將開始一個SM,並會一直保留,直到它已完成。一旦完成,它將退役,另一個區塊可以在SM上啓動。正是這種動態調度爲GPU提供了可擴展性 - 如果你有一個SM,那麼所有塊都在一個大隊列中的同一個SM上運行,如果你有30個SM,那麼這些塊將被動態調度到SM上。所以你應該確保當你啓動GPU功能時,你的網格由大量的塊(至少有數百個)組成,以確保它在任何GPU上擴展。
最後一點是,SM可以在任何給定的時間執行多個塊。這解釋了爲什麼SM可以處理768個線程(或者在某些GPU中更多),而一個塊最多隻能處理512個線程(當前)。實質上,如果SM具有可用資源(寄存器和共享內存),則它將佔用額外的塊(最多8個)。佔用率計算器電子表格(包含在SDK中)將幫助您確定可以隨時執行多少個塊。
對不起,我傾吐心事,觀看網絡研討會 - 它會更容易!
來源
2010-02-06 16:19:05
Tom
希望我已經在我的回答中解釋了,但重要的一點是每個SM可以在任何給定時間執行多個塊。此外,數字96是一個紅色的鯡魚,它不需要擔心每個SP的線程,只需擔心每個SM的線程,並讓硬件處理更精細的細節。 – Tom 2010-02-06 16:21:14