Background
许多ARM系统都是由电池供电的移动设备,对续航和散热有很高要求。如果不是电池供电,其实也同样对节能和散热等环境有一定要求。因此低功耗对ARM系统来说是非常重要的设计约束。
功耗分为静态功耗和动态功耗。\(P_{total}=P_{static}+P_{dynamic}\)
- 静态功耗
静态功耗,也常称为泄漏电流,简称漏电,每当core logic或RAM block有供电就会产生。一般来说,泄漏电流与总硅面积成正比,这意味着芯片越大,泄漏越高。 - 动态功耗
动态功耗发生是因为晶体管翻转,与时钟频率有关,影响每个周期改变状态的晶体管数量。显然,更高的时钟频率和更复杂的core消耗更多的功率。
支持电源管理的操作系统通常会动态的改变core的电源状态来平衡计算能力到对应的工作负载。功耗技术主要有电源状态管理、调频调压技术。
- Power state
- core
on、standby、retention、sleep、off - device
on、clock-gating、off
- core
- DVFS
- core
- bus
- device
Idle management
core logic | cahce RAM | 备注 | |
---|---|---|---|
Standby | partional off | ON | 不复位,cache不丢失 |
Retention | partional off | ON | 不复位,cache不丢失,比standby,更省 |
Dormant (sleep) mode | OFF | ON | 复位,cache不丢失 |
Power down | OFF | OFF | 复位,cache丢失, |
Hotplug | OFF | OFF | 复位,cache丢失,显示命令 |
对应kernel cpuidle模块
当core空闲时,OSPM (Operating System Power Management)会将内核转换为低功耗状态。通常,每个低功耗状态具有不同的进入和退出延迟和不同的功耗级别。OSPM最终选用哪个低功耗状态通常取决于系统对core唤醒时间的要求。除了core,低功耗状态也可能取决于SoC中其他组件的活动。每个状态都是由一组组件定义的,这些组件进入状态时进行了时钟门控或电源门控。
从低功耗状态转移到运行状态在深度状态需要更长时间(称为唤醒延迟
)。尽管空闲电源状态是由core上的线程行为为依据来管理,但OSPM可以将platform置于除core本身也同样影响许多其他组件的低功耗状态
。如果cluster的最后一个core空闲,OSPM可以选择目标电源状态影响整个cluster。同样,如果SoC中的最后一个core变得空闲, OSPM可以选择影响整个SoC的电源状态。电源状态选择还取决于系统中其他组件的使用。一个典型的例子是,当所有core和任何其他总线master空闲时,将DDR内存置于在自我刷新状态。
OSPM必须提供必要的电源管理软件基础设施,以决定正确的低功耗状态。在空闲管理中,当核心或集群处于低功耗状态时,可以在任何时候通过核心唤醒事件重新激活它。OSPM不需要显式的命令来使核心或集群恢复运行。OSPM认为受影响的核心(或多个核心)在任何时候都是可用的,即使它们目前处于低功耗状态。
Power and clocking
降低功耗的方式通常有两种,电源门控和时钟门控(power-gating、clock-gating)
。电源门控是指关闭电源,没有了动态和静态电流。时钟门控是指关闭时钟输入,移除了动态功耗,还存在静态功耗。
ARM core通常支持几个级别的电源管理,如Standby、Retention、Power down、Dormant mode、Hotplug。对于某些操作,需要在断电之前和之后保存和恢复状态。保存和恢复所花费的时间,以及所消耗的电力,这些额外的工作可以成为电源管理活动中软件选择适当状态的一个重要因素。
Standby
描述
:在standby操作模式下,core仍处于通电状态,但它的大多数时钟都停止了,或时钟门控。这意味着,core的几乎所有部分都处于静止状态,但是还留有少量逻辑的时钟和电流,它们用于唤醒core。
各种形式的动态时钟门控也可以在硬件上实现。例如,SCU、GIC、计时器、指令管道或NEON块可以在检测到空闲状态时自动进行时钟门控,以节省功耗。
进入
:core执行WFI/WFE
指令进入standby模式。ARM建议在WFI/WFE之前使用一条DSB
指令来确保挂起的memory事务在改变状态前完成。
唤醒条件
:在调试状态下,core是活动状态的。
对于WFI,一个中断或外部调试请求可以唤醒core。对于WFE,存在许多指定的事件,包括cluster中另一个正在执行SEV指令的core。
来自Snoop控制单元(SCU)的请求也可以为多核系统中的缓存一致性操作唤醒core。这意味着处于待机状态的core的缓存将继续与其他core的缓存保持一致(但处于待机状态的核心不需要执行下一条指令)。猜测
:L1cache与core共用时钟,因此需要唤醒core。
core的复位
总是强制core退出待机状态。
standby模式进入和退出时延非常快,通常只需要两个cycle。因此团队内核的延迟和响应几乎没有影响。
Retention
core状态(包括调试设置)保存在低功耗结构中,使core能够部分关闭。当从低功耗保留状态切换到运行状态时,保存的core状态将自动恢复(硬件方式),不需要复位core
。从操作系统的角度来看,除了进入方法、延迟和使用相关的约束外,retention状态和standby状态之间没有区别。
但是,但是对于外部调试器和硬件实现来说区别是明显的。从外部调试器的角度来看,外部调试请求调试事件保持pending状态,而且无法访问core power域中的调试寄存器。简单来说,core的retention比standby关闭了更多的core logic block。
Power down
core是power off的。软件必须保存core的所有状态,当从power-down状态切换为running状态,必须1. 复位core 2. 恢复core状态。
power-down状态的典型特征是硬件上下文的破坏。
这个状态会影响所有关闭的组件(包括core),更深层次的会影响系统的其他组件,比如GIC或特定于平台的IP,这取决于power domain的划分。在某些关机状态下,调试和跟踪上下文可能会丢失。必须提供一种机制使操作系统能够对每个给定状态执行相关上下文保存和恢复。core从复位中断向量表开始执行,然后OS再逐步恢复其上下文。
Dormant (sleep) mode
休眠模式是power-down状态的一种特殊实现。在休眠模式下,core logic是关闭的,但cache ram是打开的。ram通常处于低功耗的retention状态
,它只是保持内容不丢失,没有其他功能。这个提供了比完全关闭更快的重新启动,因为数据和代码仍然保存在缓存中。同样,在多核系统中,单个核可以处于休眠模式。
在多核系统中,允许cluster中的单个core进入休眠模式,当core被移除时,就没有保持一致性的必要。因此core必须从想干域中分离出来之前,它们必须清除所有脏数据,并通常使用另一个核心信号唤醒外部逻辑重新应用电源。因为当内核处于休眠模式时,内存状态可能发生了变化,因此不得不使缓存失效。因此,休眠模式在单core环境中比在cluster中更有用,这是因为离开和重新加入相干域的额外开销。最常用的场景是在cluster中,当其他core已经关闭时,最后一个核心使用休眠模式。
Hotplug
CPU热插拔是一种可以动态开关core的技术。“Hotplug”可由OSPM根据当前计算需求修改可用的计算能力。热插拔有时也用于可靠性的原因。热插拔和power-down有许多不同:
- 当core被拔掉时,kernel会停止该core上所有的中断和任务。OS不能再调度该core。
- OSPM必须发出显示命令来使core重新online,即热插。这之后OS才能重新调度该core。
DVFS(Dynamic voltage and frequency scaling)
cpufreq模块
动态功耗公式,\(P=C*V^2*f\)。可以看到功耗P与电压V成指数关系,与频率成线性关系。
许多系统的工作负载是可变的。因此,如果能够减少或增加core性能,以匹配预期的core工作负载,可以减少动态功耗。
在较低的频率下,core也可以在较低的电压下工作。降低电源电压的优点是同时降低了动态功率和静态功率。
一个给定电路的工作电压和安全工作的频率范围之间有一个特定的关系。运行电压和频率的二元组合,被称为Operating Performance Point (OPP)。以高性能为目标的政策选择更高的频率,使用更多的能源。以节能为目的的策略选择的频率较低,因此性能较低。