異構算力(大小核)處理器
Intel 2021 架構日活動中,首次公布了新一代處理器在 PC 平臺上使用大小異質核心(Intel 稱之為 P-Core 與 E-Core )的設計架構,類似 ARM 平臺的 Big.LITTLE 大小異質核心機制,Intel 將 “小核” 命名為效率核心(Efficient-Core),“大核” 稱為性能核心(Performance-Core),“小核” 會被用于處理后臺低運算量的任務,以此實現降低能耗,“大核” 用于前臺或高運算量的任務而保證性能。Windows 11 是最早適配該架構的 CPU,實現了相應的任務調度機制。之后 Linux 核心計劃在版本 5.16 也對此進行適配并修復部分異常問題。
此系列處理器采用英特爾第三代 10 納米制程制造,采用兩個全新的核心微架構,分別為高性能的大核心 Golden Cove 與高效能的小核心 Gracemont 的架構。Alder Lake 將取代上一代的 Tiger Lake 系列處理器。由英特爾在 2021 年 10 月 27 日發布,2021 年 11 月 4 日正式推出,非 K 系列處理器在 2022 年 1 月 4 日正式推出。
趨勢
隨著 Intel 與 ARM 相繼為不同市場推出大小核處理器產品,大小核架構已成普及化趨勢,國內方面:?飛騰 E2000 采用 “兩大兩小”?四核心異構算力簇設計,龍芯計劃推出的新一代處理器也將使用大小核架構設計。目前通用操作系統已經根據不同用途與場景設計了專門的調度器,而這些系統對大小核調度的實時性并無太多優化,如移動計算領域更多考慮的是電池續航能力,從而導致大小核系統關鍵任務實時性抖動較大。
而專業的商用實時操作系統目前尚未有一款具備滿足強實時性的同時支持大小核能耗與算力調度的產品發布,目前這種情況將成為歷史。近日翼輝發布 SylixOS V3.1.1 內核源代碼,此版本包含完整的異構多算力簇調度支持,同時滿足強實時性計算要求,成為全球首個支持大小核調度的強實時系統。?
實現
SylixOS 對大小核調度的支持分為兩部分:“核算力簇親和調度”與“算力感知自動調度適配器”, 簡單的說前者為后者的工作提供支撐。“內核算力簇親和調度”?實現了被調度任務與不同的算力核心可控親和度調度;“算力感知自動調度適配器”是一個內核模塊,它精確測量各任務對算力的使用與需求,實時對 CPU 總算力進行動態分配,使應用程序無感使用大小核架構處理器系統。?
內核算力簇親和調度
SylixOS 為每個任務提供了多種模式的可控親和度設置能力,?以大小核兩個算力簇為例:
如果一個 CPU 存在兩個以上算力簇, 例如: 某 ARM 處理器包括“大中小”?三個異構算力簇,SylixOS 也采用上述類似的方法支持:傾向使用中等算力核心?和?僅使用中等算力核心?。
?
以上幾種調度親和模型在 SylixOS 操作系統上是可以被用戶靈活設置的,SylixOS 為應用程序提供了以下 API 用于實時改變任務大小核調度模式:
?
#include特權態程序完全可以控制自己對 CPU 的算力親和,方便程序達到最佳狀態。其中?PTHREAD_HETRCC_STRONG_AFFINITY?類算力親和可以繼承給自己的子線程,例如任務如果使用?OpenMP?設計并行算法,可以使用此方法讓這些并行子線程運行在強算力核心上達到最佳計算性能。 ?#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?參數指定了不同的算力簇,編號從?0?開始,編號越小算力越低。可以使用以下 API 獲取當前處理器異構算力簇情況:
?
#includesysconf(_SC_HETRCC_CONF)?返回系統中算力簇的個數,例如兩個算力簇的大小核處理器將返回?2,sysconf(_SC_HETRCC_ONLN)?返回系統中在線 (激活) 的算力簇個數。#define _SC_HETRCC_CONF ... #define _SC_HETRCC_ONLN ... LW_API long ?sysconf(int name);
?
SylixOS 在提供算力簇親和的同時,也具備指定 CPU 親和設置的標準接口:?
?
#include需要說明的是?pthread_setaffinity_np?設置優先級高于?pthread_sethetrcc_np?,一旦某任務同時存在算力簇親和度設置與 CPU 核心親和度設置,SylixOS 會按照?pthread_setaffinity_np?指定的 CPU 進行 CPU 核心親和度調度而忽略算力簇親和度設置。#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);
?
為了滿足關鍵任務強實時性調度需求,SylixOS 也提供了指定 CPU 核心僅運行親和設置后任務的能力 (不運行自由調度屬性任務)。可保證關鍵實時任務可隨時得到指定 CPU 核心立即響應的能力:
?
#include以上 API 僅對?pthread_setaffinity_np?親和任務有效,對?pthread_sethetrcc_np?無效。用戶應用程序可適當使用這些 API 提供的組合調度邏輯實現對 CPU 核心算力調度的精確控制, 更好發揮 SylixOS 系統的可控強實時性特點。以上算法在 SylixOS 內核實現層面均為時間復雜度 O(1) 設計,擁有良好的時間確定性。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);
?
特點:?Windows, Linux 等操作系統將任務類型與其優先級作為親和調度策略的重要參數使用,而 SylixOS 與之設計不同,SylixOS 認為任務優先級與算力需求是兩個維度的需求,優先級代表任務的緊急程度,緊急的任務未必需要強大的算力,而需要強算力的任務,如 AI、多媒體、3D 等運算任務往往對實時響應要求并不太高,所以 SylixOS 大小核調度首要原則與實時系統要求保持不變:基于優先級的搶占調度,同時滿足不同算力需求的任務運行在合適的處理器核心上。
算力感知自動調度適配器
上面介紹的“內核算力簇親和調度”需要用戶手動調整任務算力親和,而 SylixOS 提供的 “算力感知自動調度適配器”則為用戶提供了全自動化的動態算力調度能力,用戶可無感的在大小核架構上運行各種應用程序。
“算力感知自動調度適配器”基本原則:
不降低實時性:自動調度不做核心限制,不向功耗妥協太多,必須保證高優先級任務有合適的 CPU 核心使用。
避免激進遷移:算力感知與遷移逐級遞進, 避免出現多算力簇顛簸, 盡量保證 CPU 核心 Cache 熱度。
避免 "小核有難大核圍觀":自動調度器實現了 “聯賽升降級”算法,保證在低算力簇利用率達極限時,算力閾值調度帶來的錯誤判斷問題。
使用以下命令注冊 “算力感知自動調度適配器”:?
?
>?insmod?/lib/modules/xhcesa.koxhcesa.ko??在初始化時會使用自己的方法動態測量 CPU 各算力簇實際算力情況,用戶可以在? /proc/kernel/cpu_hetrcc? 文件查看? xhcesa.ko? 測量的 CPU 各算力簇算力與?物理算力拓撲?情況。例如:?
> 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以上內容表示 CPU?0?號核心與?1?號核心屬于?0?號算力簇,算力為?400,CPU?2?號核心與?3?號核心屬于?1?號算力簇,算力為?810。 如果用戶認為?xhcesa.ko?測量的算力比例不準確,則可以在注冊此內核模塊之前,使用以下環境變量,精確標注 CPU 各算力簇算力指標,例如某處理器有兩個算力簇,?0?號算力簇算力為?400?,?1?號算力簇為?700?,?則可以進行如下設置:
>?HETRCC_COMPOW=400,700?
?
注意:?每個 CPU 算力簇算力標注不能超過?1024?,設置時可以按比例均減。
?xhcesa.ko?內核模塊一旦完成注冊,則算力感知自動調度就自動開始工作,實時工作情況可以通過?/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以上內容表示當前有三個任務被設置為算力簇?2?WEAK 親和,當算力簇?2?的 CPU 核心有機會運行這三個任務時,這三個任務會優先運行在算力簇?2?的 CPU 核心上,但 WEAK 親和僅僅是傾向性親和,如果這三個任務就緒了,當?2?號算力簇沒有執行條件時 (例如有更高優先級任務在運行),SylixOS 為保證實時性,會將這三個任務在小核心算力簇上按照優先級搶占原則進行調度。
?
隨著程序的運行,“算力感知自動調度適配器”?會對任務使用 CPU 算力情況進行實時測量,并根據相關算法進行動態調節,/proc/kernel/hetrcc?文件將會反應當前算力調度情況,需要說明的是:為了避免“算力感知自動調度適配器”與用戶自行設計的調度邏輯產生沖突,同時為保證每個任務的實時性,目前自動調度策略只會使用 WEAK 類親和,其他用戶可知的強算力需求任務,用戶可以使用 API 進行 STRONG 類型強親和設置,或者通過?hetrcc?命令進行設置:?
?
> hetrcc tid weak|strong cluster
?
SMT 同步多線程 (HT 超線程)
SylixOS 調度器可動態感知擁有超線程能力的處理器物理 CPU 拓撲,并進行相關優化調度,更加智能的將任務分配到物理核心進行處理,提高任務實時性。SylixOS 超線程優化調度器可以與 SylixOS 大小核動態調度器協同工作,更好的支持大型復雜 CPU 實時運算。
用戶可以查看?/proc/smp?文件獲取當前 CPU 物理核心拓撲結構:?
?
> 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 系統啟動參數?smt=yes?可開啟 SMT 架構處理器調度優化。
?
此處理器為 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 架構多核處理器
NUMA(Non-Uniform Memory Access,非統一內存訪問)架構是一種針對多處理器系統的內存組織方式。在這種架構中,處理器被分配到不同的節點,每個節點擁有自己的本地內存。處理器可以訪問本地內存和其他節點的內存,但訪問本地內存的速度要快于訪問其他節點的內存。
以飛騰 FT-S2500 64 核心 8 節點 NUMA 架構處理器為例,與近端內存訪問速度相比,遠端內存訪問性能將會下降 1/3,如果沒有特殊處理,則嚴重影響程序運行速度。
近日翼輝發布 SylixOS 3.2.7 版本,開始支持 NUMA 架構處理器,此版本 SylixOS 可支持將指定的用戶任務緊耦合在指定的 NUMA 節點上,同時支持緊耦合任務優先使用 NUMA 節點親和的物理內存,無論程序還是數據,都優先使用 NUMA 節點近端內存,從而提高內存訪問效率,極大的減少的遠端內存訪問的可能性,所以 SylixOS 在 NUMA 架構處理器上可同時保持強實時性和高吞吐率。
?
>?numago?node_id?program?...args使用以上命令可啟動一個指定 NUMA 節點運行的進程,簡單易用。
?
總結
SylixOS 經過多年發展,對于各種架構處理器以及先進的處理器特性支持非常健全,既能夠滿足關鍵任務實時性要求,同時又能充分發揮處理器的算力。SylixOS 目前支持的處理器架構包括:ARM32/64, x86/64, MIPS32/64, LoongArch32/64, RISCV32/64,?SPARC, PowerPC, C-SKY, Alpha, DSP?等。目前 SylixOS 已經成為全球最強大的大型實時操作系統之一,廣泛的應用在各行各業,領跑國內實時操作系統領域。
本次針對于異構算力大小核處理器 SylixOS 提供了靈活高效的調度器與調度策略,用戶既可以手動進行管理,也可以使用“算力感知自動調度適配器”進行自動調度,方便靈活,用戶可控性強。使用戶可以輕松應對各種復雜需求帶來的挑戰。
?
審核編輯:劉清
評論
查看更多