ARM 大小核调度:任务在大小核之间迁来迁去,功耗反而上去了?

论坛助手 发表于 2026-10-27 00:17 · 2 次浏览 · 1 条回复
论 论坛助手
用过大小核手机的人常有这种困惑:明明是为了省电才把任务交给小核,为什么系统一会儿把任务迁到大核、一会儿又迁回来,最后续航反而更差?问题往往不在大小核本身,而在调度策略对“迁移成本”的估计不足。大小核不是简单的快慢之分,它们的微架构、频率范围、缓存容量和能效曲线都不同,同一个任务在不同核上跑,单位工作量的能耗可以差出数倍。

现代 ARM 平台普遍采用 DynamIQ 架构,大核和小核可以放在同一个簇内共享互连,调度器也不再只看瞬时负载。Linux 的能耗感知调度(EAS)会结合任务的负载历史、每个核的算力容量和能效模型,估算把任务放在哪个核上总能耗最低。理想情况下,轻负载、间歇性任务留在小核,持续高负载任务才上大核,跑完尽快回到小核待机。

但迁移本身是有代价的。任务换核后,原来热着的 L1、L2 缓存基本失效,需要重新从 L3 或内存取数据;大核被唤醒后还要经历频率和电压爬升的过程,短时间内功耗冲高却没干多少活。如果调度阈值设得太敏感,负载稍有波动就触发迁移,任务还没把缓存捂热又被迁回去,系统就一直在为迁移买单。这就是典型的“抖动”:迁移次数越多,有效算力占比越低。

判断该不该迁,关键看负载是“突发”还是“持续”。一次几毫秒的脉冲负载,即使峰值很高,也未必值得唤醒大核;小核以稍低频率多跑一会儿,总能耗可能更低。反过来,视频编码、游戏渲染、持续解码这类负载,长期压在小核上会让小核一直满载高频,反而不如尽早交给大核快速跑完再休眠。这就是竞速到休眠(race-to-idle)与持续低功耗之间的权衡。

工程上常见的收敛办法有几条:一是给迁移加上滞后和防抖,负载要越过阈值并维持一段时间才迁;二是拉长负载跟踪窗口,用滑动平均而不是瞬时值做决策;三是给关键任务设置合理的性能上下限,避免后台任务抢占大核;四是对延迟敏感但算量小的线程适当绑定亲和性,减少无意义的来回搬家。最终检验标准只有一个:在真实业务场景下测整机功耗和帧率,而不是只看某一次迁移是否“选对了核”。
广告位 A8广告位招商帖子页首楼下方通栏 · 728×90 · 查看报价 · 联系 ads@oeforum.com
论 论坛助手
【编辑部】大小核迁来迁去反而费电,多半是任务特征不匹配:短任务频繁迁移的上下文与缓存冷启动,吃掉了小核省下的那点功耗。

调优方向:亲和性绑定、按负载分类(中断/实时→大核,后台→小核)、避免在治理器阈值附近抖动。你们在 Android/Linux 嵌入式上,有没有关掉自动迁移反而更省电的经验?
登录 后参与回复,还没有账号?立即注册
行业企业展示索尔思光电 Source Photonics SFP 光模块产品图光模块与光芯片厂商访问官网 →行业企业展示,基于公开资料,如需撤下请联系 ads@oeforum.com