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