close

整體來說Win10是不錯系統,雖然我們戲稱它為Bug 10,但不可否認從推出以來,開發團隊就一直努力為它加入新功能,有不少是相當實用,比如說在1709這版中,為工作管理員加入了GPU效能監視,用戶可經過工作管理員直接看GPU使用率,比以往要開GPU-Z等程式方便了,但很多人實際用的時候也發現,這對GPU效能監視好像不準確,顯卡全力計算的時候,工作管理員裡的GPU使用率怎麼還是很低?

比如開挖礦程式,顯卡的佔用其實是滿的,在GPU視窗中顯示的使用率只有3%

GPU使用率是怎麼算_01.PNG

為了找出答案,找了當年引入這項功能開發者論壇Blog,由於是圖形相關內容,這篇文被歸入DirectX Developer Blog。

  首先論壇給我們講述了工作管理員是怎麼知道GPU的使用情況,在Win10上GPU經過Windows Display Driver Model(WDDM,Windows顯示驅動模型)抽象,它的核心——圖形內核——負責抽象、管理和在所有進程分配GPU資源。它含有一個GPU事務器(VidSch)和一個視頻內存管理器(VidMem),前者負責將GPU的各種引擎分配給想要使用它們的進程,並對訪問進行裁判和優先等級排序,後者則是負責管理GPU可調用的內存——包括專用顯存和共享系統內存。

  工作管理員就是通過VidSch和VidMem回報的數據,來計算GPU的使用情況,這樣一來,不管程式用了什麼API(DX、OpenGL、OpenCL,甚至CUDA、Mantle這種專有API都可以監控),它也能準確收集GPU的佔用情況,另外由於兩者是負責分配GPU資源,位於驅動層面,它回報數據精準度也要比很多第三方工具高,使得工作管理員有很高準確度。

  既然有很高的準確度,那它為什麼還是不能準確告訴我GPU佔用率呢?這關係到GPU引擎的問題。

  當今的GPU除了用在圖形、通用計算的統一計算單元外,會內建一些其它電路,比如說視頻的編、解碼專用模組。它們之間關係是同步的,GPU可同時跑圖形計算和視頻編碼工作,在驅動層面不同模組就化身成不同引擎(Engine),一個典型GPU有以下這些(Engine):
GPU使用率是怎麼算_02.PNG
  在執行任務時不同任務會在不同的引擎上執行,比如說我玩遊戲就用到3D引擎;用顯卡加速Premiere Pro,就用到CUDA引擎;用NVENC編碼視頻就用到視頻編碼引擎。

一張RTX 2060顯卡被系統抽像出的引擎

GPU使用率是怎麼算_03.PNG
  由於部分引擎之間重複使用關係,比如說3D引擎和CUDA引擎會重複用CUDA Cores進行計算,如果是單純的加法來計算使用率,那這使用率有可能會超過100%,開發者考慮過使用平均利用率來表示,但也不可靠。那3D引擎不是被用最多就僅僅參考它會怎麼樣?也不行!比如視頻引擎滿載而3D引擎空載的情況,它會顯示0%使用率,也不準確的,最後開發者是把當前最忙的引擎使用率,當成整體GPU使用率的代表。

目前這功能上線有段時間了,具體表現到底是怎樣?讓我們看開頭的那張圖,在GPU的CUDA引擎滿載情況,左邊整體佔用率仍很低,顯然沒達到開發團隊所說的。

GPU使用率是怎麼算_04.PNG

又測了一下別種情況,這裡用NVENC對視頻進行編碼,此時可看到左邊視窗中,GPU佔用率又跑到滿載。

GPU使用率是怎麼算_05.PNG

而在跑典型的3D應用程式的時候,它也很正常。

GPU使用率是怎麼算_06.PNG

最後嘗試了OpenCL負載,這次工作管理員又能反應出CUDA引擎的佔用率了。

  如此看來,工作管理員GPU佔用率的不穩定情況,可能又是Win10的Bug所引起,在大部分情況下,它都能反應出負載最大引擎的使用率,但在某些情況下,又無法顯示當前最繁忙的引擎使用情形。

 


來源
謝謝收看

arrow
arrow
    創作者介紹

    john pan 發表在 痞客邦 留言(0) 人氣()