抢占阈值调度的功率优化
0 原文
贺小川,贾焰.抢占阈值调度的功耗优化[J].计算机学报,2008(11):2060-2071.
1 背景
-
动态电压调整(Dynamic Voltage Scaling, DVS)机制
程序运行时动态调节处理器的电压和频率。
对于CMOS电路,功耗正比于时钟频率,正比于电压的平方。每个时钟周期能耗正比于电压平方。
对于任务,工作的总时钟周期固定,降低电压意味着降低时钟频率降低,任务执行所需总时钟周期不变,但总执行时间增加。 -
CMOS泄露电流会导致静态能耗
降低电压可以有效降低功耗,但延长任务时间会导致静态能耗增加
-
其他:
Scheduling fixed-priority tasks with preemption threshold 翻译
2 创新点
- 提出一种基于时间响应分析(Response Time Analysis)的任务可调度性判定方法。
- 证明了系统在最大阈值分配情况下功耗最低。
- 提出一种两阶段节能调度算法。
- 理论上算法所带来的能耗最多为最优调度的 max { 1 / ( U b d ) 2 , 2 } \max \left\{ 1/\left( U_{bd} \right) ^2,2 \right\} max{1/(Ubd)2,2}倍,其中 U b d U_{bd} Ubd是FPPT(Fixed-Priority tasks with Preemption Thresholds scheduling)调度策略的任务集合临界过载利用率(breakdown utilization)。
3 模型
-
周期性任务模型
任务集合 T = { τ 1 , τ 2 , . . . , τ n } T=\{\tau_1,\tau_2,...,\tau _n\} T={τ1,τ2,...,τn}。 τ i \tau_i τi表示任务,使用三元组 ( C i , T i , D i ) (C_i,T_i,D_i) (Ci,Ti,Di)表示,其中 C i C_i Ci表示任务所需时钟周期个数, T i T_i Ti表示任务 τ i \tau_i τi两个实例之间的最小间隔, D i D_i Di表示任务截止时限。
L L L表示任务的超周期,即所有任务的公倍数。
每个任务分配优先级 π i \pi_i πi和抢占阈值 γ i \gamma_i γi,满足 π i , γ i ∈ [ 1 , n ] , γ i ⩾ π i \pi_i,\gamma_i\in[1,n],\gamma_i\geqslant\pi_i πi,γi∈[1,n],γi⩾πi,任务优先级确定了竞争处理器或其他资源的能力,任务抢占阈值决定了被更高优先级任务抢占可能性的高低。 -
功耗模型
可变电压处理器动态功耗:
P d = C e f f V D D 2 f P_d=C_{eff}V_{DD}^{2}f Pd=CeffVDD2f
f = α k ′ ( V D D − V T H ) 2 V D D f=\alpha k^{\prime}\frac{\left( V_{DD}-V_{TH} \right) ^2}{V_{DD}} f=αk′VDD(VDD−VTH)2
静态功耗来自于处理器,IO和RAM的泄漏电流,表示为 P s P_s Ps。
总功耗 P = P s + P d P=P_s+P_d P=Ps+Pd。单个时钟周期的能耗 P ( f ) / f P(f)/f P(f)/f。
频率集合 { F L K 1 , F L K 2 , . . . , F L K s } \{FLK_1, FLK_2, ..., FLK_s\} {FLK1,FLK2,...,FLKs}分别对应电压集合 { v 1 , v 2 , . . . , v s } \{v_1, v_2, ..., v_s\} {v1,v2,...,vs}。
休眠模式功耗为0,睡眠进入活跃能耗为 E s w E_{sw} Esw。
空闲状态(醒着但没任务)功耗为 P I P_I PI,每个频率有固定的值
4 问题描述
4.1 泄露敏感的FPPT节能调度,简称LAEES-FPPT
由 n n n个在时刻0释放的任务组成的任务集合 T T T, T T T内每个任务 τ i \tau_i τi的执行需要 C i C_i Ci个时钟周期,每个 τ i \tau_i τi实例的最小释放间隔时间为 T i T_i Ti, τ i \tau_i τi实例自释放时刻起必须在 D i D_i Di之前完成.同时 T T T内每个任务 τ i \tau_i τi都分配了任务优先级 π i \pi_i πi和抢占阈值 γ i \gamma_i γi, π i \pi_i πi用于竞争处理器而 γ i \gamma_i γi用于 τ i \tau_i τi开始执行后保护 τ i \tau_i τi避免过多不必要的任务抢占.处理器功耗 P ( f ) P(f) P(f)是非递减的凸函数,而 P ( f ) / f P(f)/f P(f)/f只是凸函数.处理器具有一系列离散的频率/电压设置, { F L K 1 , F L K 2 , . . . , F L K s } \{FLK_1, FLK_2,...,FLK_s\} {FLK1,FLK2,...,FLKs}和 { v 1 , v 2 , . . . , v s } \{v_1,v_2,...,v_s\} {v1,v2,...,vs}.处理器从睡眠模式进入活跃模式的额外能耗为 E s w E_{sw} Esw,而处理器处于活跃模式和空闲状态时的功耗为 P I P_I PI.问题在于如何在保证 T T T可调度性的前提下使得超周期 L L L内的系统功耗最小。
4.2 节能调度的可能性
任务集合 T T T要保证每个任务在截止日期内为每个任务 τ i \tau_i τi分配频率 f i f_i fi,如果其没有影响每个任务的可调度性(不超过deadline),则这种节能调度是可行的。用 S ∗ S^* S∗表示最优调度。
4.3 空闲时段阈值
t θ = E s w / P I t_{\theta}=E_{sw}/P_I tθ=Esw/PI。其中 E s w E_{sw} Esw表示空闲能耗,就是说CPU闲置但是其在running,这个时候如果闲置能耗大于休眠+重启能耗,那么让CPU休眠就是有意义的,这个阈值就是 t θ t_{\theta} tθ。
4.4 超周期能耗
能耗
E
(
S
)
E(S)
E(S)包含两部分,即执行能耗
Φ
(
S
)
\varPhi(S)
Φ(S)和空闲能耗
ϵ
(
S
)
\epsilon(S)
ϵ(S)
执行能耗
Φ
(
S
)
\varPhi(S)
Φ(S):
ϕ
(
S
)
=
∫
0
L
P
(
v
(
t
,
s
)
)
d
t
\phi \left( S \right) =\int\limits_0^L{P\left( v\left( t,s \right) \right)}dt
ϕ(S)=0∫LP(v(t,s))dt
其中
v
(
t
,
s
)
v\left( t,s \right)
v(t,s)表示调度
S
S
S在
t
t
t时刻的处理器频率。
空闲能耗
ϵ
(
S
)
\epsilon(S)
ϵ(S):
E
s
w
E_{sw}
Esw乘以超周期
L
L
L内处理器重新开启次数和
P
I
P_I
PI乘以
L
L
L内处理器处于空闲状态的长度。
5 可调度性分析
f ∧ \overset{\land}{f} f∧是处理器功耗最低时的处理器频率。由于 P ( f ) / f P(f)/f P(f)/f是凸函数,其表示单位时钟周期内的能耗,为了其取得最小值,要使得 d ( P ( f ∗ ) / f ∗ ) / d f ∗ = 0 d(P(f^*)/f^*)/df^*=0 d(P(f∗)/f∗)/df∗=0, 最低频率 f ∧ \overset{\land}{f} f∧只要调整为 f ∗ f* f∗即可。
受平台限制,频率可以设为 f ∗ ∈ { F L K 1 , F L K 2 , . . . , F L K s } f^*\in \left\{ FLK_1,FLK_2,...,FLK_s \right\} f∗∈{FLK1,FLK2,...,FLKs},但分情况。
可调度性分析可以根据以往研究进行,根据level-i忙周期分析进行扩展,如论文Scheduling fixed-priority tasks with preemption threshold(翻译在此),具体这里不阐述了。
6 功耗最优的抢占阈值分配
用 γ ( T , Π ) \gamma \left( T,\varPi \right) γ(T,Π)表示已经使用 Π \varPi Π来分配优先级的任务集合 T T T,其可行的所有抢占阈值的集合。
最小阈值分配(Identity Preemption Threshold Assignment, IPTA)
在IPTA内,任务抢占阈值等于任务优先级。IPTA表示为 Γ I ∈ γ ( T , Π ) \varGamma ^I\in \gamma \left( T,\varPi \right) ΓI∈γ(T,Π)
若存在任意两个阈值分配, Γ , Γ ′ ∈ γ ( T , Π ) \varGamma,\varGamma^{\prime}\in \gamma( T,\varPi) Γ,Γ′∈γ(T,Π),有 ∀ i , γ i ⩾ γ i ′ \forall i,\gamma_i\geqslant \gamma _{i}^{\prime} ∀i,γi⩾γi′,则认为 Γ \varGamma Γ比 Γ ′ \varGamma^{\prime} Γ′更大,即 Γ ≽ Γ ′ \varGamma \succcurlyeq \varGamma ^{\prime} Γ≽Γ′
最大阈值分配(Maximal Preemption Threshold Assignment, MPTA)
最大阈值分配是使得每一个分配阈值最大化,满足 Γ max ≻ Γ ∈ γ ( T , Π ) \varGamma ^{\max}\succ \varGamma \in \gamma (T,\varPi ) Γmax≻Γ∈γ(T,Π)
定理1:给定实时系统 ( T , Γ , Π ) (T, \varGamma, \varPi) (T,Γ,Π)和 ( T , Γ ′ , Π ) (T, \varGamma^{\prime}, \varPi) (T,Γ′,Π),其中 Γ , Γ ′ ∈ γ ( T , Π ) \varGamma,\varGamma^{\prime}\in \gamma( T,\varPi) Γ,Γ′∈γ(T,Π),且 Γ ≻ Γ ′ \varGamma\succ \varGamma^{\prime} Γ≻Γ′,则功耗 P t o t a l ( T , Γ ′ , Π ) > P t o t a l ( T , Γ , Π ) P_{total}(T, \varGamma^{\prime}, \varPi) > P_{total}(T, \varGamma, \varPi) Ptotal(T,Γ′,Π)>Ptotal(T,Γ,Π)
证明:
先说明调小抢占阈值的影响。
根据Scheduling fixed-priority tasks with preemption threshold 定理4.1(翻译的定理5)所述,当任务 τ i \tau_i τi的抢占阈值从 γ i \gamma_i γi修改为 γ i ′ ( γ i ′ < γ i ) \gamma_i^{\prime}(\gamma_i^{\prime}<\gamma_i) γi′(γi′<γi)时,会有大概下面的变化:
τ i \tau_i τi的抢占阈值从 γ i \gamma_i γi修改为 γ i ′ \gamma_i^{\prime} γi′:
更新
πi γ'i <------- γi
|-------|-------|-----------|------------|
| | | |
不影响 不影响 | 不影响
有影响,但不会有更差的响应时间
图中不影响指的是不影响自身之外的任务 τ k \tau_k τk,不会有更差的响应时间指的是 τ k \tau_k τk的响应时间可能减少,但不会变差。但降低 τ i \tau_i τi的抢占阈值会降低 τ i \tau_i τi自身的计算时间(?存疑,这里只会增加响应时间),必须以增加 τ i \tau_i τi的频率 f i f_i fi来避免 τ i \tau_i τi不可调度。根据能量与频率的关系,提升频率就意味着功耗增加。也就是说,若阈值分配减少,即 γ i → γ i ′ \gamma_i \rightarrow \gamma_i^{\prime} γi→γi′,则 T T T的功耗增加,即 P t o t a l ( T , Γ ′ , Π ) > P t o t a l ( T , Γ , Π ) P_{total}(T, \varGamma^{\prime}, \varPi) > P_{total}(T, \varGamma, \varPi) Ptotal(T,Γ′,Π)>Ptotal(T,Γ,Π)。
在说明调小频率的影响。
若任务 τ i \tau_i τi执行频率从 f i f_i fi调为 f i ′ ′ ( f i ′ ′ < f i ) f_{i}^{''}(f_{i}^{''} < f_i) fi′′(fi′′<fi)。 τ i \tau_i τi的计算时间就被延长了,最长响应时间就被延长,这个延长值为 C i ( 1 / f i ′ ′ − 1 / f i ) C_i(1/f_{i}^{''}-1/f_i) Ci(1/fi′′−1/fi)。
对于 π k < π i \pi_k < \pi_i πk<πi的任务, τ k \tau_k τk延长执行时间会影响其可调度性。假设某个 τ j \tau_j τj受到其影响最大,其最长响应时间最接近 D j D_j Dj,要将 τ j \tau_j τj的调度优先级 γ j \gamma_j γj提升至 γ j ′ ′ \gamma^{''}_j γj′′才能使其重新可调度。
对于 π i < π k < γ i \pi_i < \pi_k < \gamma_i πi<πk<γi的任务 π k \pi_k πk而言, τ i \tau_i τi的计算时间增量可能影响到 τ k \tau_k τk,即使影响到也可以通过调高 γ k \gamma_k γk来降低其响应时间,然而,若 γ k \gamma_k γk达到最高等级仍旧无法调度,那调低 τ i \tau_i τi的频率就是不行的,只能保持其不变。
总之,阈值分配增大时,即 Γ → Γ ′ ′ \varGamma \rightarrow \varGamma^{''} Γ→Γ′′, Γ ′ ′ ≻ Γ \varGamma^{''} \succ \varGamma Γ′′≻Γ, P t o t a l ( T , Γ ′ ′ , Π ) < P t o t a l ( T , Γ , Π ) P_{total}(T, \varGamma^{''}, \varPi) < P_{total}(T, \varGamma, \varPi) Ptotal(T,Γ′′,Π)<Ptotal(T,Γ,Π)。
推论1:任务集合
T
T
T在MPTA获得最小功耗。
证明:很明显,根据定理1提高每个任务的抢占阈值,从而降低各个任务的处理器频率,降低系统功耗,达到MPTA,功耗最低。
7 两阶段节能调度算法
本文节能调度分为两阶段,第一阶段计算任务集合 T T T功耗最小时,各个任务所需频率, [ f 1 o p t , f 2 o p t , . . . , f n o p t ] [f_1^{opt}, f_2^{opt},...,f_n^{opt}] [f1opt,f2opt,...,fnopt],第二阶段在线决定合适关闭处理器。
7.1 最小化执行功耗的离线算法EE-FPPT
简单讲,最小化静态优先级系统的最小功耗的过程就是求取静态优先级最大抢占阈值MPTA的过程。
算法能从任务集合的最低优先级任务开始,尝试调低任务的执行速度(5~7行),而后检查受其影响的任务的可调度性,对于更低优先级的任务,如果由于当前任务执行速度的调低而使其不可调度,则提升这些低优先级任务的抢占阈值,以保持可调度性(8~21行);如果这些低优先级任务的抢占阈值无法再提高,就说明当前任务的执行速度无法调低,只好恢复其原有速度(17~19行);对于优先级高于当前任务,但是可能被当前任务所阻塞的其他任务而言,如果当前任务的速度调低使其不可调度,就只好以其原有速度(22~27行),因为提高这些任务的抢占阈值没有效果.
作者说是伪时间复杂度,但由于计算最差响应时间、可调度性的公式是迭代得到的,因此复杂度相当高。
利用EE-FPPT所获得算法结果用
S
e
=
[
f
1
o
p
t
,
f
2
o
p
t
,
.
.
.
,
f
n
o
p
t
]
S_e=[f_{1}^{opt},f_{2}^{opt},...,f_{n}^{opt}]
Se=[f1opt,f2opt,...,fnopt]
表示,令
C
i
=
C
i
/
f
o
p
t
i
\mathcal{C} _i=C_i/f_{opt}^{i}
Ci=Ci/fopti
表示其在获得的最优频率下的计算时长。
7.2 最小化空闲功耗的在线算法LA-FPPT
第一阶段给出了最优处理器频率 S e S_e Se,来降低系统执行功耗 ϕ ( S e ) \phi(S_e) ϕ(Se)。第二阶段则是在线判断合适关闭处理器来降低空闲功耗 ϵ ( S e ) \epsilon(S_e) ϵ(Se)。
基本思想:整合超周期 L L L内的零散空闲时段,让处理器尽可能处于空闲时段(至少大于 t θ t_{\theta} tθ)。通过推迟任务的释放时间,在保证可调度性前提下使得任务尽可能处于睡眠状态。
用
r
i
(
t
)
r_i(t)
ri(t)表示任务
τ
i
\tau_i
τi在时刻
t
t
t之后的第一个任务实例的释放时间,这个任务实例记为
J
i
,
t
J_{i,t}
Ji,t,满足:
r
i
(
t
)
=
⌈
t
/
T
i
⌉
⋅
T
i
r_i\left( t \right) =\lceil t/T_i \rceil \cdot T_i
ri(t)=⌈t/Ti⌉⋅Ti
令
d
i
(
t
)
d_i(t)
di(t)表示
J
i
,
t
J_{i,t}
Ji,t的截止时间,满足
d
i
(
t
)
=
r
i
(
t
)
+
D
i
d_i(t)=r_i(t) + D_i
di(t)=ri(t)+Di
T_i释放周期↘
|------------------------------------|
D_i截止时间↘
|---------------------------|
|----------|---------------------------|--------|-->
0 r_i(t) d_i(t) t
实例J_i,t释放 实例J_i,t结束
|--------|-----|---|-----|---|-----|------|-----|-->
0 忙 忙 闲 忙 闲 忙 t
首先考虑在时间间隔 [ t , d i ( t ) ) [t, d_i(t)) [t,di(t))内的最长可用时间间隔,如上图中,即为两个level-i闲周期的合并长度,即 S π i m a x ( t ) S_{\pi_i}^{max}(t) Sπimax(t)。
level-i忙周期受到2个因素影响:
- 低优先级但高抢占阈值的任务阻塞。
- 高优先级任务的抢占。
如下式所示是任务负载总量的推导公式, S π i ( t ) S_{\pi_i}\left( t \right) Sπi(t)是 t t t时刻起level-i的空闲周期起点, max ∀ k , π k < π i ⩽ γ k C k \underset{\forall k,\pi_k<\pi_i\leqslant \gamma_k}{\max}\mathcal{C}_k ∀k,πk<πi⩽γkmaxCk指的是低优先级但高优先级的最大阻塞时间, ∑ ∀ j , π j > π i ( ⌈ w π i m + 1 ( t ) − r j ( t ) T j ⌉ ⋅ C j ) \sum_{\forall j,\pi_j>\pi_i}{\left( \lceil \frac{w_{\pi _i}^{m+1}\left( t \right) -r_j\left( t \right)}{T_j} \rceil \cdot \mathcal{C}_j \right)} ∑∀j,πj>πi(⌈Tjwπim+1(t)−rj(t)⌉⋅Cj)指的是高优先级任务的抢占时间。
w π i m + 1 ( t ) = S π i ( t ) + max ∀ k , π k < π i ⩽ γ k C k + ∑ ∀ j , π j > π i ( ⌈ w π i m + 1 ( t ) − r j ( t ) T j ⌉ ⋅ C j ) w_{\pi_i}^{m+1}\left( t \right) =S_{\pi_i}\left( t \right) +\underset{\forall k,\pi_k<\pi_i\leqslant \gamma_k}{\max}\mathcal{C}_k+\sum_{\forall j,\pi_j>\pi_i}{\left( \lceil \frac{w_{\pi _i}^{m+1}\left( t \right) -r_j\left( t \right)}{T_j} \rceil \cdot \mathcal{C}_j \right)} wπim+1(t)=Sπi(t)+∀k,πk<πi⩽γkmaxCk+∀j,πj>πi∑(⌈Tjwπim+1(t)−rj(t)⌉⋅Cj)
这个递归方程定义了该level-i忙周期的长度(原文这么写的,但这个应该是忙周期的结束时间?),需要持续递归计算到 w π i m + 1 = w π i m w_{\pi_i}^{m+1}=w_{\pi_i}^{m} wπim+1=wπim或 w π i m + 1 ⩾ d i ( t ) w_{\pi_i}^{m+1} \geqslant d_i(t) wπim+1⩾di(t)为止,表示递归值不变或超过当前周期的截止时间。
l i ( t , w π i ( t ) ) l_i\left( t,w_{\pi_i}\left( t \right) \right) li(t,wπi(t))定义了level-i空闲周期的长度, d i − w π i ( t ) d_i-w_{\pi_i}\left( t \right) di−wπi(t)空闲周期在本周期任务中止时间之前结束。 ⌈ w π i ( t ) − r j ( t ) ⌉ T j ⋅ T j + r j ( t ) − w π i ( t ) \frac{\lceil w_{\pi_i}( t) -r_j(t) \rceil}{T_j} \cdot T_j+r_j(t) -w_{\pi _i}(t) Tj⌈wπi(t)−rj(t)⌉⋅Tj+rj(t)−wπi(t)表示更高优先级的任务在此忙周期内的执行需求。
l i ( t , w π i ( t ) ) = min [ d i − w π i ( t ) , min ∀ j , π j ⩾ γ i ( ⌈ w π i ( t ) − r j ( t ) ⌉ T j ) ⋅ T j + r j ( t ) − w π i ( t ) ] l_i\left( t,w_{\pi _i}\left( t \right) \right) =\min \left[ d_i-w_{\pi _i}\left( t \right) ,\underset{\forall j,\pi_j\geqslant \gamma_i}{\min}\left( \frac{\lceil w_{\pi_i}\left( t \right) -r_j\left( t \right) \rceil}{T_j} \right) \cdot T_j+r_j\left( t \right) -w_{\pi _i}\left( t \right) \right] li(t,wπi(t))=min[di−wπi(t),∀j,πj⩾γimin(Tj⌈wπi(t)−rj(t)⌉)⋅Tj+rj(t)−wπi(t)]
算法2的7-14行首先计算了 S π i m a x ( t ) S_{\pi_i}^{max}(t) Sπimax(t),即优先级为 π i \pi_i πi的任务的最长可利用的空闲长度,方法是不断递归计算忙周期的结束时间 w π i m + 1 ( t ) w_{\pi_i}^{m+1}\left( t \right) wπim+1(t),若寻找到有效的空闲周期(11行),则更新其空闲周期的结束时刻 S π i ( t ) S_{\pi_i}(t) Sπi(t),由于 w π i m + 1 ( t ) w_{\pi_i}^{m+1}\left( t \right) wπim+1(t)与 S π i ( t ) S_{\pi_i}(t) Sπi(t)相关,其也要更新 w π i m + 1 ( t ) w_{\pi_i}^{m+1}\left( t \right) wπim+1(t)。直至达到当前优先级下最大的截止时间 d i ( t ) d_i(t) di(t)为止。
随后将任务 τ i \tau_i τi的实例推迟到最长可用时间长度 S π i m a x ( t ) S_{\pi_i}^{max}(t) Sπimax(t)之后,如果说通过19行的比较式来判断将所有任务推迟后,其大于能用于节能的阈值 t θ t_{\theta} tθ,则关闭处理器。
作者称计算 S π i m a x ( t ) S_{\pi_i}^{max}(t) Sπimax(t)的时间复杂度为 O ( m n ) \mathcal{O}(mn) O(mn),算法2的时间复杂度为 O ( m n 2 ) \mathcal{O}(mn^2) O(mn2),但由于计算依赖迭代,所以是伪时间复杂度的。
8 性能证明
结果是
E
(
S
ψ
)
⩽
max
{
2
,
1
/
(
U
b
d
)
2
}
E
(
S
∗
)
E\left( S_{\psi} \right) \leqslant \max \left\{ 2,1/\left( U_{bd} \right) ^2 \right\} E\left( S^* \right)
E(Sψ)⩽max{2,1/(Ubd)2}E(S∗)
其中
E
(
S
ψ
)
E\left( S_{\psi} \right)
E(Sψ)是通过上述的两阶段调度算法得到的解的能耗,
E
(
S
∗
)
E\left( S^* \right)
E(S∗)是最优能耗。
原文写的比较清楚了,这里就不在赘述,都是一些数学推导。