硬件調(diào)度器輔助服務(wù)干了些什么?

????我弄了很久的硬件調(diào)度器輔助服務(wù)大家都很感興趣,也可能想知道這個(gè)服務(wù)做了些什么來(lái)幫助windows進(jìn)行大小核調(diào)度,我這里就解釋一下里頭的原理,同時(shí)展示一下效果。我們知道Intel thread director會(huì)根據(jù)指令執(zhí)行的特征向windows提供對(duì)線程的調(diào)度建議,然后系統(tǒng)采用建議。但是呢,intel和微軟默認(rèn)定下了前后臺(tái)調(diào)度策略,就導(dǎo)致在出現(xiàn)前后臺(tái)情景時(shí)系統(tǒng)會(huì)忽略從調(diào)度器來(lái)的建議,就導(dǎo)致了調(diào)度錯(cuò)誤的問(wèn)題。實(shí)際上這并不是一個(gè)什么大不了的問(wèn)題,我們可以手動(dòng)關(guān)閉這個(gè)機(jī)制,讓系統(tǒng)始終采納調(diào)度器的建議。
????但是呢,調(diào)度器并不總是很智能,根據(jù)技術(shù)文檔,這個(gè)硬件調(diào)度器竟然是“猜測(cè)”不同線程類型會(huì)在大核與小核上的ipc的不同,而且這個(gè)猜測(cè)是以固件的形式固定在微碼中的,所以在大多數(shù)情況下,調(diào)度器只會(huì)給出“請(qǐng)調(diào)度給大核”的建議,如果完全按照調(diào)度器的建議調(diào)度線程,那么只有class3這個(gè)類型的線程,也就是busy waiting的線程會(huì)主動(dòng)去使用小核,其實(shí)這就是當(dāng)我們完全disable系統(tǒng)的core parking功能后發(fā)現(xiàn)的小核上面往往只有一個(gè)核心有一丁點(diǎn)負(fù)載的原因,除非大核滿了后才會(huì)被動(dòng)使用小核。此外,系統(tǒng)可以對(duì)大小核分別設(shè)定epp值,這就是我之前的版本做的事情,用戶可以分別設(shè)定這兩個(gè)epp的值,然后調(diào)度器就會(huì)按照固定的策略對(duì)線程進(jìn)行調(diào)度。但是系統(tǒng)的設(shè)定很固定,開(kāi)機(jī)后就不變了,所以線程調(diào)度也就固定下來(lái)了。
????后來(lái)我改進(jìn)了調(diào)度服務(wù),開(kāi)始引入更多的機(jī)制,把調(diào)度器底層的關(guān)于指令執(zhí)行的信息與系統(tǒng)關(guān)于線程負(fù)載的信息結(jié)合到一起,就成為了現(xiàn)在X版本的邏輯核心。具體而言,現(xiàn)在的X版本可以:1. 逐核心逐線程的識(shí)別最佳核心,找到在檢測(cè)期內(nèi)(一般設(shè)定為10ms)實(shí)時(shí)ipc最高的那個(gè)大核(不使用超線程的那個(gè)大核)動(dòng)態(tài)提升頻率,這樣可以在不動(dòng)其他大核的前提下實(shí)現(xiàn)高單線程性能的同時(shí)還能減少發(fā)熱;2. 識(shí)別大小核的指令負(fù)載的比重變化。以10ms的精度對(duì)大小核簇的指令負(fù)載進(jìn)行比較,并動(dòng)態(tài)地調(diào)整大小核的功耗分配,這樣可以針對(duì)主要負(fù)載進(jìn)行加速,提高能效的同時(shí)提高整體性能;3. 識(shí)別活動(dòng)線程數(shù),并根據(jù)活動(dòng)線程區(qū)分偏單線程的任務(wù)和偏多線程的任務(wù),并且在多線程負(fù)載條件下更加主動(dòng)的使用小核來(lái)承擔(dān)多線程任務(wù);4. 在使用超線程的時(shí)候會(huì)實(shí)時(shí)比較超線程與小核之間的負(fù)載和性能水平,在超線程負(fù)載較低或者其上的線程不重要時(shí)主動(dòng)降低其功耗,節(jié)省的功耗就能加在單線程大核以及多線程小核上,此時(shí)超線程大核可以看作兩個(gè)比小核還要小的微核。5. 總是確保在有單線程大核時(shí)優(yōu)先確保其單線程性能,這個(gè)在當(dāng)前的系統(tǒng)中默認(rèn)是做不到的,因?yàn)閣indows會(huì)在有大量負(fù)載時(shí)傾向于將功耗平均分配給大核,導(dǎo)致大家的頻率都不高。
????下面我選擇了幾個(gè)有代表性的游戲,用throttlestop來(lái)展示運(yùn)行不同游戲時(shí),調(diào)度服務(wù)如何根據(jù)不同游戲的負(fù)載有針對(duì)性的進(jìn)行優(yōu)化的過(guò)程,尤其注意各個(gè)核心的頻率和負(fù)載有什么不同。游戲?qū)膯尉€程向多線程過(guò)渡,關(guān)注其變化。
????1. 偏單線程
房車賽

注意到大部分的負(fù)載都集中core3和core4上,因此其他核心的功率也向這兩個(gè)大核傾斜。

這個(gè)是4個(gè)重負(fù)載,其他的中等負(fù)載在小核上,因此小核有較高的頻率來(lái)應(yīng)對(duì)多線程任務(wù)
2. 中等線程
控制control

3. 超多線程

失落大陸,一個(gè)比較冷門的游戲,這里最能體現(xiàn)調(diào)度服務(wù)的特點(diǎn),可以看到在觸發(fā)溫控下沒(méi)有使用超線程的大核核心仍然可以維持在很高的頻率,而使用超線程的大核與小核頻率都降下來(lái)把功耗轉(zhuǎn)移給物理大核,這樣我們就有了很高的單線程性能的同時(shí)也利用超線程和小核大量擴(kuò)展了多線程性能。而且這個(gè)游戲有個(gè)bug,它的重負(fù)載不會(huì)放到favored core也就是core3 和core4上,調(diào)度服務(wù)很好地識(shí)別到這一點(diǎn)并準(zhǔn)確的加速了core1和core2,可以看到輕松吃滿了gpu。
古墓麗影

這個(gè)游戲吃線程數(shù)吃的厲害,可以看到所有大核心的超線程都被使用了,調(diào)度服務(wù)識(shí)別到這一點(diǎn),將所有功耗都傾斜給超線程,因?yàn)樵跊](méi)有物理大核在場(chǎng)的情景下超線程有幾率實(shí)現(xiàn)更高的單線程性能,所以把小核功耗與負(fù)載都轉(zhuǎn)移給超線程是更加合理的決定。
總之,現(xiàn)在X版本還在不斷迭代中,主要是繼續(xù)優(yōu)化各種閾值條件參數(shù),繼續(xù)消除一些可能的bug。感謝大家的支持!