異構(gòu)算力(大小核)處理器
Intel 2021 架構(gòu)日活動中,首次公布了新一代處理器在 PC 平臺上使用大小異質(zhì)核心(Intel 稱之為 P-Core 與 E-Core )的設(shè)計(jì)架構(gòu),類似 ARM 平臺的 Big.LITTLE 大小異質(zhì)核心機(jī)制,Intel 將 “小核” 命名為效率核心(Efficient-Core),“大核” 稱為性能核心(Performance-Core),“小核” 會被用于處理后臺低運(yùn)算量的任務(wù),以此實(shí)現(xiàn)降低能耗,“大核” 用于前臺或高運(yùn)算量的任務(wù)而保證性能。Windows 11 是最早適配該架構(gòu)的 CPU,實(shí)現(xiàn)了相應(yīng)的任務(wù)調(diào)度機(jī)制。之后 Linux 核心計(jì)劃在版本 5.16 也對此進(jìn)行適配并修復(fù)部分異常問題。
此系列處理器采用英特爾第三代 10 納米制程制造,采用兩個全新的核心微架構(gòu),分別為高性能的大核心 Golden Cove 與高效能的小核心 Gracemont 的架構(gòu)。Alder Lake 將取代上一代的 Tiger Lake 系列處理器。由英特爾在 2021 年 10 月 27 日發(fā)布,2021 年 11 月 4 日正式推出,非 K 系列處理器在 2022 年 1 月 4 日正式推出。
趨勢
隨著 Intel 與 ARM 相繼為不同市場推出大小核處理器產(chǎn)品,大小核架構(gòu)已成普及化趨勢,國內(nèi)方面:?飛騰 E2000 采用 “兩大兩小”?四核心異構(gòu)算力簇設(shè)計(jì),龍芯計(jì)劃推出的新一代處理器也將使用大小核架構(gòu)設(shè)計(jì)。目前通用操作系統(tǒng)已經(jīng)根據(jù)不同用途與場景設(shè)計(jì)了專門的調(diào)度器,而這些系統(tǒng)對大小核調(diào)度的實(shí)時性并無太多優(yōu)化,如移動計(jì)算領(lǐng)域更多考慮的是電池續(xù)航能力,從而導(dǎo)致大小核系統(tǒng)關(guān)鍵任務(wù)實(shí)時性抖動較大。
而專業(yè)的商用實(shí)時操作系統(tǒng)目前尚未有一款具備滿足強(qiáng)實(shí)時性的同時支持大小核能耗與算力調(diào)度的產(chǎn)品發(fā)布,目前這種情況將成為歷史。近日翼輝發(fā)布 SylixOS V3.1.1 內(nèi)核源代碼,此版本包含完整的異構(gòu)多算力簇調(diào)度支持,同時滿足強(qiáng)實(shí)時性計(jì)算要求,成為全球首個支持大小核調(diào)度的強(qiáng)實(shí)時系統(tǒng)。?
實(shí)現(xiàn)
SylixOS 對大小核調(diào)度的支持分為兩部分:“核算力簇親和調(diào)度”與“算力感知自動調(diào)度適配器”, 簡單的說前者為后者的工作提供支撐?!皟?nèi)核算力簇親和調(diào)度”?實(shí)現(xiàn)了被調(diào)度任務(wù)與不同的算力核心可控親和度調(diào)度;“算力感知自動調(diào)度適配器”是一個內(nèi)核模塊,它精確測量各任務(wù)對算力的使用與需求,實(shí)時對 CPU 總算力進(jìn)行動態(tài)分配,使應(yīng)用程序無感使用大小核架構(gòu)處理器系統(tǒng)。?
內(nèi)核算力簇親和調(diào)度
SylixOS 為每個任務(wù)提供了多種模式的可控親和度設(shè)置能力,?以大小核兩個算力簇為例:
如果一個 CPU 存在兩個以上算力簇, 例如: 某 ARM 處理器包括“大中小”?三個異構(gòu)算力簇,SylixOS 也采用上述類似的方法支持:傾向使用中等算力核心?和?僅使用中等算力核心?。
?
以上幾種調(diào)度親和模型在 SylixOS 操作系統(tǒng)上是可以被用戶靈活設(shè)置的,SylixOS 為應(yīng)用程序提供了以下 API 用于實(shí)時改變?nèi)蝿?wù)大小核調(diào)度模式:
?
#include特權(quán)態(tài)程序完全可以控制自己對 CPU 的算力親和,方便程序達(dá)到最佳狀態(tài)。其中?PTHREAD_HETRCC_STRONG_AFFINITY?類算力親和可以繼承給自己的子線程,例如任務(wù)如果使用?OpenMP?設(shè)計(jì)并行算法,可以使用此方法讓這些并行子線程運(yùn)行在強(qiáng)算力核心上達(dá)到最佳計(jì)算性能。 ?#define PTHREAD_HETRCC_NON_AFFINITY ... #define PTHREAD_HETRCC_WEAK_AFFINITY ... #define PTHREAD_HETRCC_STRONG_AFFINITY ... LW_API int pthread_sethetrcc_np(pthread_t thread, int mode, unsigned int cluster); LW_API int pthread_gethetrcc_np(pthread_t thread, int *mode, unsigned int *cluster);
?
cluster?參數(shù)指定了不同的算力簇,編號從?0?開始,編號越小算力越低??梢允褂靡韵?API 獲取當(dāng)前處理器異構(gòu)算力簇情況:
?
#includesysconf(_SC_HETRCC_CONF)?返回系統(tǒng)中算力簇的個數(shù),例如兩個算力簇的大小核處理器將返回?2,sysconf(_SC_HETRCC_ONLN)?返回系統(tǒng)中在線 (激活) 的算力簇個數(shù)。#define _SC_HETRCC_CONF ... #define _SC_HETRCC_ONLN ... LW_API long ?sysconf(int name);
?
SylixOS 在提供算力簇親和的同時,也具備指定 CPU 親和設(shè)置的標(biāo)準(zhǔn)接口:?
?
#include需要說明的是?pthread_setaffinity_np?設(shè)置優(yōu)先級高于?pthread_sethetrcc_np?,一旦某任務(wù)同時存在算力簇親和度設(shè)置與 CPU 核心親和度設(shè)置,SylixOS 會按照?pthread_setaffinity_np?指定的 CPU 進(jìn)行 CPU 核心親和度調(diào)度而忽略算力簇親和度設(shè)置。#define CPU_SET(n, p) ? ... #define CPU_CLR(n, p) ? ... #define CPU_ISSET(n, p) ... #define CPU_ZERO(p) ? ? ... LW_API int ?pthread_setaffinity_np(pthread_t ?thread, size_t setsize, const cpu_set_t *set); LW_API int ?pthread_getaffinity_np(pthread_t ?thread, size_t setsize, cpu_set_t *set);
?
為了滿足關(guān)鍵任務(wù)強(qiáng)實(shí)時性調(diào)度需求,SylixOS 也提供了指定 CPU 核心僅運(yùn)行親和設(shè)置后任務(wù)的能力 (不運(yùn)行自由調(diào)度屬性任務(wù))??杀WC關(guān)鍵實(shí)時任務(wù)可隨時得到指定 CPU 核心立即響應(yīng)的能力:
?
#include以上 API 僅對?pthread_setaffinity_np?親和任務(wù)有效,對?pthread_sethetrcc_np?無效。用戶應(yīng)用程序可適當(dāng)使用這些 API 提供的組合調(diào)度邏輯實(shí)現(xiàn)對 CPU 核心算力調(diào)度的精確控制, 更好發(fā)揮 SylixOS 系統(tǒng)的可控強(qiáng)實(shí)時性特點(diǎn)。以上算法在 SylixOS 內(nèi)核實(shí)現(xiàn)層面均為時間復(fù)雜度 O(1) 設(shè)計(jì),擁有良好的時間確定性。LW_API int ?sched_cpuaffinity_set_np(size_t setsize, const cpu_set_t *set); LW_API int ?sched_cpuaffinity_get_np(size_t setsize, cpu_set_t *set);
?
特點(diǎn):?Windows, Linux 等操作系統(tǒng)將任務(wù)類型與其優(yōu)先級作為親和調(diào)度策略的重要參數(shù)使用,而 SylixOS 與之設(shè)計(jì)不同,SylixOS 認(rèn)為任務(wù)優(yōu)先級與算力需求是兩個維度的需求,優(yōu)先級代表任務(wù)的緊急程度,緊急的任務(wù)未必需要強(qiáng)大的算力,而需要強(qiáng)算力的任務(wù),如 AI、多媒體、3D 等運(yùn)算任務(wù)往往對實(shí)時響應(yīng)要求并不太高,所以 SylixOS 大小核調(diào)度首要原則與實(shí)時系統(tǒng)要求保持不變:基于優(yōu)先級的搶占調(diào)度,同時滿足不同算力需求的任務(wù)運(yùn)行在合適的處理器核心上。
算力感知自動調(diào)度適配器
上面介紹的“內(nèi)核算力簇親和調(diào)度”需要用戶手動調(diào)整任務(wù)算力親和,而 SylixOS 提供的 “算力感知自動調(diào)度適配器”則為用戶提供了全自動化的動態(tài)算力調(diào)度能力,用戶可無感的在大小核架構(gòu)上運(yùn)行各種應(yīng)用程序。
“算力感知自動調(diào)度適配器”基本原則:
不降低實(shí)時性:自動調(diào)度不做核心限制,不向功耗妥協(xié)太多,必須保證高優(yōu)先級任務(wù)有合適的 CPU 核心使用。
避免激進(jìn)遷移:算力感知與遷移逐級遞進(jìn), 避免出現(xiàn)多算力簇顛簸, 盡量保證 CPU 核心 Cache 熱度。
避免 "小核有難大核圍觀":自動調(diào)度器實(shí)現(xiàn)了 “聯(lián)賽升降級”算法,保證在低算力簇利用率達(dá)極限時,算力閾值調(diào)度帶來的錯誤判斷問題。
使用以下命令注冊 “算力感知自動調(diào)度適配器”:?
?
>?insmod?/lib/modules/xhcesa.koxhcesa.ko??在初始化時會使用自己的方法動態(tài)測量 CPU 各算力簇實(shí)際算力情況,用戶可以在? /proc/kernel/cpu_hetrcc? 文件查看? xhcesa.ko? 測量的 CPU 各算力簇算力與?物理算力拓?fù)?/strong>?情況。例如:?
> cat /proc/kernel/cpu_hetrcc CPU ID HETRCC ?COMPOW ?ACTIVE ------ ------ -------- ------ ? ? 0 ? ? ?0 ? ? ?400 YES ? ? 1 ? ? ?0 ? ? ?400 YES ? ? 2 ? ? ?1 ? ? ?810 YES ? ? 3 ? ? ?1 ? ? ?810 YES以上內(nèi)容表示 CPU?0?號核心與?1?號核心屬于?0?號算力簇,算力為?400,CPU?2?號核心與?3?號核心屬于?1?號算力簇,算力為?810。 如果用戶認(rèn)為?xhcesa.ko?測量的算力比例不準(zhǔn)確,則可以在注冊此內(nèi)核模塊之前,使用以下環(huán)境變量,精確標(biāo)注 CPU 各算力簇算力指標(biāo),例如某處理器有兩個算力簇,?0?號算力簇算力為?400?,?1?號算力簇為?700?,?則可以進(jìn)行如下設(shè)置:
>?HETRCC_COMPOW=400,700?
?
注意:?每個 CPU 算力簇算力標(biāo)注不能超過?1024?,設(shè)置時可以按比例均減。
?xhcesa.ko?內(nèi)核模塊一旦完成注冊,則算力感知自動調(diào)度就自動開始工作,實(shí)時工作情況可以通過?/proc/kernel/hetrcc?文件查看:?
?
> cat /proc/kernel/hetrcc NAME TID PID PRI CPU HETRCC AFFINITY ---------------- ------- ----- --- --- ------ -------- app??????????????4010031?????2?200???8??????2?WEAK app??????????????4010032?????3?200??11??????2?WEAK app??????????????4010033?????4?200??10??????2?WEAK以上內(nèi)容表示當(dāng)前有三個任務(wù)被設(shè)置為算力簇?2?WEAK 親和,當(dāng)算力簇?2?的 CPU 核心有機(jī)會運(yùn)行這三個任務(wù)時,這三個任務(wù)會優(yōu)先運(yùn)行在算力簇?2?的 CPU 核心上,但 WEAK 親和僅僅是傾向性親和,如果這三個任務(wù)就緒了,當(dāng)?2?號算力簇沒有執(zhí)行條件時 (例如有更高優(yōu)先級任務(wù)在運(yùn)行),SylixOS 為保證實(shí)時性,會將這三個任務(wù)在小核心算力簇上按照優(yōu)先級搶占原則進(jìn)行調(diào)度。
?
隨著程序的運(yùn)行,“算力感知自動調(diào)度適配器”?會對任務(wù)使用 CPU 算力情況進(jìn)行實(shí)時測量,并根據(jù)相關(guān)算法進(jìn)行動態(tài)調(diào)節(jié),/proc/kernel/hetrcc?文件將會反應(yīng)當(dāng)前算力調(diào)度情況,需要說明的是:為了避免“算力感知自動調(diào)度適配器”與用戶自行設(shè)計(jì)的調(diào)度邏輯產(chǎn)生沖突,同時為保證每個任務(wù)的實(shí)時性,目前自動調(diào)度策略只會使用 WEAK 類親和,其他用戶可知的強(qiáng)算力需求任務(wù),用戶可以使用 API 進(jìn)行 STRONG 類型強(qiáng)親和設(shè)置,或者通過?hetrcc?命令進(jìn)行設(shè)置:?
?
> hetrcc tid weak|strong cluster
?
SMT 同步多線程 (HT 超線程)
SylixOS 調(diào)度器可動態(tài)感知擁有超線程能力的處理器物理 CPU 拓?fù)?,并進(jìn)行相關(guān)優(yōu)化調(diào)度,更加智能的將任務(wù)分配到物理核心進(jìn)行處理,提高任務(wù)實(shí)時性。SylixOS 超線程優(yōu)化調(diào)度器可以與 SylixOS 大小核動態(tài)調(diào)度器協(xié)同工作,更好的支持大型復(fù)雜 CPU 實(shí)時運(yùn)算。
用戶可以查看?/proc/smp?文件獲取當(dāng)前 CPU 物理核心拓?fù)浣Y(jié)構(gòu):?
?
> cat /proc/smp LOGIC CPU PHYSICAL CPU NON IDLE STATUS CURRENT THREAD MAX NESTING IPI VECTOR --------- ------------ -------- ------ -------------- ----------- ---------- 0 0 0 ACTIVE t_idle0 1 126 1 0 0 ACTIVE t_idle1 1 127 2 1 0 ACTIVE t_idle2 1 128 3 1 0 ACTIVE t_idle3 1 129 4 2 0 ACTIVE t_idle4 1 130 5 2 0 ACTIVE t_idle5 1 131 6 3 0 ACTIVE t_idle6 1 132 7 3 0 ACTIVE t_idle7 1 133 8 4 0 ACTIVE t_idle8 1 134 9 4 0 ACTIVE t_idle9 1 135 10 5 0 ACTIVE t_idle10 1 136 11 5 0 ACTIVE t_idle11 1 137 12 6 0 ACTIVE t_idle12 1 138 13 6 0 ACTIVE t_idle13 1 139 14 7 0 ACTIVE t_idle14 1 140 15 7 0 ACTIVE t_idle15 1 141 16 8 0 ACTIVE t_idle16 1 142 17 9 0 ACTIVE t_idle17 1 143 18 10 0 ACTIVE t_idle18 1 144 19 11 1 ACTIVE t_tshell 1 145以 12th Gen Intel?Core?i7-12700KF 為例,SylixOS 自動探測出該處理器有?0?~?11?十二個處理器物理核心,0?~?7?每個物理核心包含兩個邏輯處理器核心,8?~?11?每個物理核心只包含一個邏輯處理器,共 20 個邏輯處理器核心。?SylixOS 系統(tǒng)啟動參數(shù)?smt=yes?可開啟 SMT 架構(gòu)處理器調(diào)度優(yōu)化。
?
此處理器為 Intel 大小核處理器,各算力簇算力如下:?
?
> cat /proc/kernel/cpu_hetrcc CPU ID HETRCC ?COMPOW ?ACTIVE ------ ------ -------- ------ ? ? 0 ? ? ?1 ? ? ?840 YES ? ? 1 ? ? ?1 ? ? ?840 YES ? ? 2 ? ? ?1 ? ? ?840 YES ? ? 3 ? ? ?1 ? ? ?840 YES ? ? 4 ? ? ?1 ? ? ?840 YES ? ? 5 ? ? ?1 ? ? ?840 YES ? ? 6 ? ? ?1 ? ? ?840 YES ? ? 7 ? ? ?1 ? ? ?840 YES ? ? 8 ? ? ?1 ? ? ?840 YES ? ? 9 ? ? ?1 ? ? ?840 YES ? ?10 ? ? ?1 ? ? ?840 YES ? ?11 ? ? ?1 ? ? ?840 YES ? ?12 ? ? ?1 ? ? ?840 YES ? ?13 ? ? ?1 ? ? ?840 YES ? ?14 ? ? ?1 ? ? ?840 YES ? ?15 ? ? ?1 ? ? ?840 YES ? ?16 ? ? ?0 ? ? ?290 YES ? ?17 ? ? ?0 ? ? ?290 YES ? ?18 ? ? ?0 ? ? ?290 YES ? ?19 ? ? ?0 ? ? ?290 YES
?
NUMA 架構(gòu)多核處理器
NUMA(Non-Uniform Memory Access,非統(tǒng)一內(nèi)存訪問)架構(gòu)是一種針對多處理器系統(tǒng)的內(nèi)存組織方式。在這種架構(gòu)中,處理器被分配到不同的節(jié)點(diǎn),每個節(jié)點(diǎn)擁有自己的本地內(nèi)存。處理器可以訪問本地內(nèi)存和其他節(jié)點(diǎn)的內(nèi)存,但訪問本地內(nèi)存的速度要快于訪問其他節(jié)點(diǎn)的內(nèi)存。
以飛騰 FT-S2500 64 核心 8 節(jié)點(diǎn) NUMA 架構(gòu)處理器為例,與近端內(nèi)存訪問速度相比,遠(yuǎn)端內(nèi)存訪問性能將會下降 1/3,如果沒有特殊處理,則嚴(yán)重影響程序運(yùn)行速度。
近日翼輝發(fā)布 SylixOS 3.2.7 版本,開始支持 NUMA 架構(gòu)處理器,此版本 SylixOS 可支持將指定的用戶任務(wù)緊耦合在指定的 NUMA 節(jié)點(diǎn)上,同時支持緊耦合任務(wù)優(yōu)先使用 NUMA 節(jié)點(diǎn)親和的物理內(nèi)存,無論程序還是數(shù)據(jù),都優(yōu)先使用 NUMA 節(jié)點(diǎn)近端內(nèi)存,從而提高內(nèi)存訪問效率,極大的減少的遠(yuǎn)端內(nèi)存訪問的可能性,所以 SylixOS 在 NUMA 架構(gòu)處理器上可同時保持強(qiáng)實(shí)時性和高吞吐率。
?
>?numago?node_id?program?...args使用以上命令可啟動一個指定 NUMA 節(jié)點(diǎn)運(yùn)行的進(jìn)程,簡單易用。
?
總結(jié)
SylixOS 經(jīng)過多年發(fā)展,對于各種架構(gòu)處理器以及先進(jìn)的處理器特性支持非常健全,既能夠滿足關(guān)鍵任務(wù)實(shí)時性要求,同時又能充分發(fā)揮處理器的算力。SylixOS 目前支持的處理器架構(gòu)包括:ARM32/64, x86/64, MIPS32/64, LoongArch32/64, RISCV32/64,?SPARC, PowerPC, C-SKY, Alpha, DSP?等。目前 SylixOS 已經(jīng)成為全球最強(qiáng)大的大型實(shí)時操作系統(tǒng)之一,廣泛的應(yīng)用在各行各業(yè),領(lǐng)跑國內(nèi)實(shí)時操作系統(tǒng)領(lǐng)域。
本次針對于異構(gòu)算力大小核處理器 SylixOS 提供了靈活高效的調(diào)度器與調(diào)度策略,用戶既可以手動進(jìn)行管理,也可以使用“算力感知自動調(diào)度適配器”進(jìn)行自動調(diào)度,方便靈活,用戶可控性強(qiáng)。使用戶可以輕松應(yīng)對各種復(fù)雜需求帶來的挑戰(zhàn)。
?
審核編輯:劉清
評論
查看更多