CUDA程式開發 軟硬體層級的排程解讀

2021-09-11 19:39:51 字數 2816 閱讀 2490

關鍵字:sp、sm、device、thread、block、grid、warp

想要編寫出高效能的cuda核函式,研究cuda的軟硬體架構是必不可少的。比如在給每乙個核函式配置<<<>>>內的啟動引數時,你可能在想到底應該分配多少個block,每個block中應該分配多少個thread,這些引數是試出來的,還是有一定的規律可循。如果你想把這個問題搞清楚,不如先從cuda的軟硬體層級開始了解。

從硬體方面看,cuda將gpu的處理單元被分為3個層次:流處理器(streaming process,sp)、流多處理器(streaming multiprocessor,sm)和裝置(device)。

而cuda對kernel函式中的執行緒管理也分為3個層次:執行緒(thread)、執行緒塊(block)和執行緒格(grid)。

實際上,將執行緒分層不僅是為了便於將執行緒與資料塊相對應,也是為了將軟體執行與硬體相對應。cuda將grid分配到device上,通過gigathread engine將block分配到sm上,再通過warp scheduler將thread分配到sp上。也許你會問它們到底是怎麼排程的,其中的細節是怎樣的?

乙個kernel核函式在啟動之後,只能在乙個gpu裝置上執行,不可能執行在多個gpu上。但是,乙個gpu是可以同時執行多個kernel的,這與多個工作佇列有關,是為了最大化gpu的利用率。

kernel核函式中的乙個block會被排程到乙個sm上,注意乙個block也不能在多個sm上執行。但是,乙個sm能夠同時執行多個block,計算能力2.0的sm可以最多執行8個block,計算能力3.0的sm可以最多執行16個block。在程式執行時,乙個sm具體能夠執行幾個block,這與每個block占用的資源數量和sm內擁有的總資源數量有關係。同時block在分配給sm時,是考慮到sm的負載均衡的,舉個例子。有19個block,4個sm,分配的情況很可能是這樣的:先給每個sm分配4個block,還剩餘3個block,然後給其中的3個sm分別分配1個block,而不是給其中的1個sm分配3個block。這種負載均衡是有利於縮短程式的執行時間。

最後,是block中thread的排程情況,這個要複雜一點。cuda出於程式執行效率和執行靈活性的考慮,將thread的排程粒度設定為32個執行緒,也就是常說的1個執行緒束(warp,warp在英文中有紡織機上經線的意思,多個線組成一排,一起織布)。所以,乙個block被分配到乙個sm上之後,會被sm按32為一組分成多個warp,這些warp會被隨機排程,且會被多次排程。

在具體介紹warp的排程情況之前,我們先了解一下warp的三種狀態:

乙個warp能從就緒態轉為執行態,需要兩個條件:乙個是必須有32個sp可以被利用,另乙個是當前指令需要的資源都已準備好。所有處於這三種狀態的warp我們稱其為active warp,而那些還有被分配sm的block裡的warp則是非active warp。

下面具體說明一下warp的排程情況,如下圖,cuda會隨機挑選乙個warp,並由warp scheduler將其排程給32個sp單元,之後由instruction dispatch unit將kernel中的一條指令傳送給32個sp執行,在執行過程中很可能會出現阻塞情況,比如訪問視訊記憶體時需要等待,等待過程中這個被執行的warp會從執行態進入阻塞態,此時warp scheduler又會隨機排程乙個處於就緒態的warp,然後再由instruction dispatch unit分發一條指令,以此類推,多個warp就是這樣被隨機且迴圈排程的。

(注:這裡提到的32個sp,是對於計算能力較高的裝置而言的,而對於計算能力比較低的裝置,是16個sp單元,即將warp分成兩份)

這裡,有人可能會問,warp切換的開銷大不大。因為我們都知道,cpu上線程的切換是需要為當前執行緒儲存上下文資訊的(暫存器和程式計數器等),這個儲存和恢復上下文的過程,需要幾十納秒到幾微秒的時間。那麼gpu上涉及到大量的warp切換,會不會很耗時。實際上,sm在進行warp切換時開銷很小,可以忽略不計,因為相比於cpu,gpu為所有的thead單獨分配了足夠的暫存器,每乙個thread的狀態資訊在sm上總是單獨存好的,所以切換的時候不需要額外的儲存和恢復。

關於warp還有乙個問題 ,就是乙個sm最多可以執行多少個warp。對於計算能力3.0以上的裝置,理論上1個sm最多可以同時執行2048個thread,那麼,1個sm最多就可以同時執行2048/32=64個warp。注意這裡的同時執行是乙個邏輯值,而不是物理值。邏輯值64個warp是指同一時間最多可以同時排程64個active warp;而物理值對應於1個sm中的warp scheduler的個數和sp的個數,以kepler為例,乙個sm中有4個warp scheduler和192個sp,則物理上最多可以同時執行4個執行態的warp。

同時,細心的你可能已經發現,最大值64個warp是與乙個sm可以同時排程多個block相佐證的。因為乙個block最多執行1024個執行緒,即32個warp,這只是最大值的一半,所以從側面證明了sm可以排程多個block。

總結一下,cuda將硬體分為三個層次:device、sm、sp,將軟體分為三個層次:grid、block、thread。乙個grid只能執行在乙個device上,而乙個device可以執行多個grid;乙個block只能執行在乙個sm上,而乙個sm也可以同時執行多個block;cuda的執行緒排程粒度是32個thead,即1個warp,warp在sp上是隨機且多次被排程執行的,warp的切換開銷可以忽略不計。

簡碼物聯 軟硬體開發

物聯網是什麼?物聯網即 萬物相連的網際網路 簡單來說就是讓所有能行使獨立功能的普通物體實現互聯互通的網路。什麼是物聯網解決方案?物聯網覆蓋生活的各個領域,物聯網智慧型家居 智慧型交通 智慧型教育 智慧型醫療 智慧型農程式設計客棧業等等,每個領域從軟硬體開發 雲服務開發到工業及模具設計 生產加工,形成...

ubuntu深度學習軟硬體開發環境搭建

硬體 先從硬體自已配機器開始 目前對於個人來說,價效比比較高的深度學習顯示卡是那個11g視訊記憶體的gtx 1080ti.這裡顯示卡定了,接下來就是主機板記憶體硬碟,顯示器。先報一下我配的機器配置 cpu 英特爾 intel i5 7500 酷睿四核 盒裝cpu處理器 1379元 主機板微星 msi...

紅外體溫計方案軟硬體開發

紅外體溫計方案軟硬體開發 紅外線額溫槍方案採用紅外線感測器 senser 收集物體發射的紅外線轉變為微弱的 uv mv 級電壓 訊號,再經過近百倍的電壓放大,進入本公司的 mcu,通過高精度高解析度 ad 轉 換器,得出的數碼訊號經過微控制器複雜的處理,得出實際的溫度通過 lcd 顯示 或者 語音報...