Win 10果然是Bug 10:GPU占用率原來是這么算的
從總體上來說,Windows 10是一個(gè)好系統(tǒng),雖然我們天天戲稱它為“Bug 10”,但不可否認(rèn)的是,從立項(xiàng)以來,開發(fā)團(tuán)隊(duì)就一直在努力為它加入新的功能,其中有不少是相當(dāng)實(shí)用的。
比如說,他們?cè)?709這個(gè)大版本中,為任務(wù)管理器加入了GPU性能監(jiān)控單元,用戶可以通過任務(wù)管理器直觀地看到目前的GPU占用率,比以往要開GPU-Z等程序方便了不少。
但很多用戶在實(shí)際使用的時(shí)候也發(fā)現(xiàn)了,這個(gè)針對(duì)GPU的性能監(jiān)控好像不太準(zhǔn),我顯卡在全力計(jì)算的時(shí)候,任務(wù)管理器里面的GPU占用率怎么這么低?
比如我開個(gè)挖礦程序,顯卡的占用其實(shí)是滿的,但左邊GPU窗格中顯示的占用率只有3%
為了找出答案,我們找到了當(dāng)時(shí)引入這項(xiàng)新功能時(shí),開發(fā)者的講解Blog,由于是與圖形相關(guān)的內(nèi)容,這篇Blog被歸入DirectX Developer Blog中。
首先開發(fā)者給我們講述了任務(wù)管理器是怎么得知GPU的占用情況的。在Windows 10上面,GPU通過Windows Display Driver Model(WDDM,Windows顯示驅(qū)動(dòng)模型)抽象,它的核心—;—;圖形內(nèi)核—;—;負(fù)責(zé)抽象、管理和在所有進(jìn)程分配GPU資源。
它含有一個(gè)GPU事務(wù)器(VidSch)和一個(gè)視頻內(nèi)存管理器(VidMem),前者負(fù)責(zé)將GPU的各種引擎分配給想要使用它們的進(jìn)程,并對(duì)訪問進(jìn)行仲裁和優(yōu)先級(jí)排序,后者則是負(fù)責(zé)管理GPU可調(diào)用的內(nèi)存—;—;包括專用的顯存和共享的系統(tǒng)內(nèi)存。
任務(wù)管理器就是通過VidSch和VidMem回報(bào)的數(shù)據(jù)來計(jì)算GPU的使用情況的,這樣一來,不管程序使用了什么API(DX、OpenGL、OpenCL,甚至CUDA、Mantle這種專有API都可以監(jiān)控),它都能準(zhǔn)確地收集GPU的占用情況,另外由于兩者是實(shí)際負(fù)責(zé)分配GPU資源的,位于驅(qū)動(dòng)層面,它們回報(bào)數(shù)據(jù)的精準(zhǔn)度也要比很多第三方工具要高,使得任務(wù)管理器有很高的精度。
既然有很高的精度,那它為什么還是報(bào)不準(zhǔn)我的GPU占用率呢?這就牽扯到另一個(gè)問題,GPU引擎。
現(xiàn)代GPU上除了有主要用于圖形、通用計(jì)算的統(tǒng)一計(jì)算單元外,還會(huì)集成一些其他的電路,比如說,用于視頻編解碼的專用模塊。它們之間的關(guān)系一般是并行的,GPU可以同時(shí)運(yùn)行圖形計(jì)算和視頻編碼任務(wù),在驅(qū)動(dòng)層面,這些不同的模塊就被抽象為不同的Engine,也就是引擎,比如說一個(gè)典型的GPU可以有以下這些引擎:
在具體執(zhí)行任務(wù)的時(shí)候,不同的任務(wù)會(huì)在不同的引擎上面執(zhí)行,比如說我打游戲,就用到3D引擎;我用顯卡加速Premiere Pro,就用到CUDA引擎;我用NVENC編碼視頻,就用到視頻編碼引擎。
一張RTX 2060顯卡被系統(tǒng)抽象出的引擎
由于部分引擎之間有復(fù)用的關(guān)系,比如說3D引擎和CUDA引擎復(fù)用CUDA Cores進(jìn)行計(jì)算,那么如果通過簡(jiǎn)單加法來計(jì)算占用率,那這個(gè)占用率就有可能會(huì)超過100%。
開發(fā)團(tuán)隊(duì)也考慮過使用平均利用率來表示,但也不靠譜。那3D引擎不是被用的最多嗎,就用它怎么樣?也不太行,比如在視頻引擎滿載而3D引擎空載的情況下,它將會(huì)顯示0%的占用率,也是不準(zhǔn)確的。最終,開發(fā)團(tuán)隊(duì)選擇將當(dāng)前最為繁忙的引擎占用率作為GPU整體占用率的代表。
恩……博文說的很好,那么到今天為止這個(gè)功能上線也有一段時(shí)間了,其具體表現(xiàn)是怎樣的呢?讓我們看回頂上的那張圖,在GPU的CUDA引擎滿載的情況下,其左邊的整體占用率仍然很低,顯然是沒有達(dá)到開發(fā)團(tuán)隊(duì)所說的。
我們又測(cè)試了一下別的情況,這里使用NVENC對(duì)視頻進(jìn)行編碼,此時(shí)可以看到左邊窗格中的GPU占用率又跑到了滿載。
而在跑典型的3D應(yīng)用程序的時(shí)候,它也很正常。
最后,我們嘗試了OpenCL負(fù)載,這次任務(wù)管理器又能反映出CUDA引擎的占用率了。
如此看來,任務(wù)管理器GPU占用率的薛定諤情況可能是Windows 10的一個(gè)Bug所導(dǎo)致的,在大部分情況下,它都會(huì)反映負(fù)載最大引擎的占用率,但在某些情況下,它并不能夠正確地顯示當(dāng)前最繁忙引擎的占用情況。