關(guān)注了就能看到更多這么棒的文章哦~
Synchronized GPU priority scheduling
By Jonathan Corbet
October 22, 2021
DeepL assisted translation
https://lwn.net/Articles/873334/
在 Unix 之類的系統(tǒng)很早期的時候,就已經(jīng)實現(xiàn)了
進程優(yōu)先級的概念,優(yōu)先級高的進程可以得到更多的 CPU 時間來完成它們的工作。如今這里的實現(xiàn)方式已經(jīng)發(fā)生了很大變化,開始有了一些替代方案(比如 deadline scheduling)可用在一些特殊場景,但其核心的優(yōu)先級概念(或者反序的 niceness)本質(zhì)上是沒有變化的。然而,如今的世界里越來越多的計算工作是在 CPU 之外完成的,那我們應(yīng)該如何改進這一點呢?Tvrtko Ursulin 已經(jīng)準備了一組 patch set,展示了如何將 nice 機制也擴展到 GPU 這邊來用起來。
正如 Ursulin 所描述的情況,"目前的處理方式似乎越來越多地由 pipeline 來構(gòu)成,計算工作是在多個硬件設(shè)備上來完成的"。內(nèi)核直接控制了那些需要依靠 CPU 計算來完成的工作的 CPU 時間的分配。但是,越來越多的計算工作被轉(zhuǎn)移(offload)到 GPU、AI 加速器或者用于加密貨幣挖掘的外設(shè)上。這些處理器雖然能力很強,但也可能會因為給它們的工作過多而超出了自己的能力。如果它們運行 workload 的方式與內(nèi)核對進程優(yōu)先級的想法不一致,那么就會出現(xiàn)用戶意料之外的結(jié)果。
Ursulin 舉了一個例子,Chrome 瀏覽器會把目前不在前臺(foreground)的 tab 的優(yōu)先級。但是,如果其中一個 background tab 在 GPU 中做了大量的渲染(render)工作,它可能會拖慢當前 foreground tab 的響應(yīng)速度,盡管 background 工作應(yīng)該還是要以低優(yōu)先級來運行。事實證明,至少其中一些 GPU (比如某些英特爾 i915 版本),可以在內(nèi)部根據(jù)優(yōu)先級進行調(diào)度。但這需要提前告知 GPU 相關(guān)的優(yōu)先級,而目前還沒有辦法將這些在用戶空間做出的決定傳達給 GPU。
Ursulin 的方案是在 i915 驅(qū)動中添加 "context nice" 的概念。這個值與提交這個 job 的進程的優(yōu)先級相關(guān)聯(lián),會在有相應(yīng)能力的 GPU 中使用,來影響該工作的調(diào)度情況。這種方法是有效果的,但如果 CPU 上的進程的優(yōu)先級發(fā)生變化了就不再準確了。如果瀏覽器切換到了一個新的 tab 并想提高其優(yōu)先級,那么繼續(xù)在 GPU 側(cè)以較低的優(yōu)先級來運行相關(guān)的工作,肯定會讓用戶不滿意的。為了避免這個問題,Ursulin 的 patch set 為調(diào)度器添加了一個新的 notifier 機制。這樣一來,每當一個進程的優(yōu)先級發(fā)生變化時,相關(guān)的內(nèi)核子系統(tǒng)就可以得到通知。然后,i915 驅(qū)動會跟這個 notifier 關(guān)聯(lián)起來,從而可以修改相應(yīng)的優(yōu)先級信息,這樣就能確保 GPU 上運行 job 的那些進程的 CPU 優(yōu)先級總是有效的。
notifier 目前看來是這組 patch set 中最有爭議的部分。Ursulin 指出,每當一個進程的優(yōu)先級發(fā)生變化時,從 scheduler 的代碼深處來調(diào)用設(shè)備驅(qū)動程序,可能會引入 security 問題。John Wangghui 建議可以增加一個單獨的 "I/O nice" 值來控制 GPU 上的優(yōu)先級,這個值跟現(xiàn)存的用于 block I/O 的 "ionice" 并不相同,但其功能類似。相反,Barry Song 抱怨說,使用簡單的 nice 值是不夠的,因為它沒有考慮 cgroup 或者之前累計運行的時間對占有 CPU 時間比例的影響。這可能導(dǎo)致 GPU 上的調(diào)度結(jié)果與 CPU 上的情況不一致。
Ursulin 基本上同意 Song 的批評,但也聲稱,即使只是使用進程的 nice 值,也比在 GPU 上完全不控制執(zhí)行優(yōu)先權(quán)要好。這個初版的實現(xiàn)可以在今后有必要的時候進行擴展來添加 cgroup 等支持。同時,他得出結(jié)論,也許 scheduler notifier 根本就是沒有必要的。直接使用提交 job 給 GPU 時當前的進程的優(yōu)先級也能得到類似的效果,主要的區(qū)別是,優(yōu)先級的改變將不會影響那些已經(jīng)交給 GPU 的 job。這個 patch set 的下一個版本中估計會放棄 notifier。
Ursulin 做了一些簡單的基準測試,其中一個圖形應(yīng)用程序與一個 "GPU hog"
進程一起運行。如果給
GPU hog 一個低優(yōu)先級,那么圖形應(yīng)用程序比起沒有優(yōu)先級控制時能生成更高的幀率。他總結(jié)說:"所以看起來這個功能確實可以改善用戶體驗"。因此,這項工作的未來版本應(yīng)該最終會進入 mainline 的。不確定的是,在進入 mainline 之前,它需要完成哪些改動。
全文完