异构算力(大小核)处理器
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 提供了灵活高效的调度器与调度策略,用户既可以手动进行管理,也可以使用“算力感知自动调度适配器”进行自动调度,方便灵活,用户可控性强。使用户可以轻松应对各种复杂需求带来的挑战。
审核编辑:刘清
评论
查看更多