RTSS-2023: Co-Optimizing Cache Partitioning and Multi-Core Task Scheduling: Exploit Cache Sensitivity or Not?
目录
可调度性分析(Schedulability Analysis)
外层、中间层和内层(Outer Layer, Middle Layer, and Inner Layer)
计算任务的忙时周期(Busy Period Calculation)
计算任务的响应时间(Response Time Calculation)
可调度性验证(Schedulability Verification)
四、多层混合优化(Multi-Layer Hybrid Optimization)
算法1:中间层和内层优化(Algorithm 1: Middle and Inner Optimization Layers)
算法2:外层优化(Outer Layer Optimization)
一、文章核心
- 缓存分区技术已经被成功采用来减少多核处理器上并发执行的实时任务之间的干扰。
- 对于缓存敏感任务,其执行时间严重依赖于可用的缓存量,因此联合优化缓存分区和任务分配可以提高系统的可调度性。
- 这篇文章提出了一种混合多层设计空间探索技术来解决这一多资源管理问题。
- 我们通过系统地交替三个优化层来探索缓存分区和可调度性之间的相互作用:
- 外层:广度优先搜索结合主动修剪进行缓存分区。
- 中间层:利用首次适应启发式算法将任务分配到核上。
- 内层:使用递推关系对单处理器设置中的非抢占式固定优先级(NP-FP)任务进行可调度性分析。
缓存分区技术:是指将共享缓存划分为多个独立的分区,每个分区只分配给特定的任务或任务组使用。这种技术可以减少任务之间因共享缓存引起的干扰,从而更准确地估计任务的最坏情况下执行时间(WCET)。
多核处理器上并发执行的实时任务之间的干扰原因
- 多核处理器上,多个任务同时运行时,它们会共享硬件资源(如缓存、内存带宽等),导致资源竞争。
- 这种资源竞争会导致任务执行时间的不确定性,增加任务的WCET。
- 特别是缓存资源,当多个任务共享同一个缓存时,任务之间的缓存冲突(即缓存未命中增加)会显著增加任务的执行时间,导致不可预测的执行时间变化。
具体来说,缓存敏感任务的特点包括:
执行时间依赖于缓存大小
缓存命中率高
对缓存配置变化敏感
例子:
- 图像处理任务:例如图像滤波或图像分割,这些任务需要反复访问图像数据块,如果这些数据块可以被缓存,它们的执行速度会显著提高。
- 矩阵乘法:在科学计算中,矩阵乘法是一种常见操作。如果中间结果和操作数可以被缓存,则计算速度会快很多。
- 数据挖掘任务:如k-means聚类算法,需要频繁访问数据集中的点,如果这些点可以被缓存,则算法的执行时间会大大减少。
二、文章背景
1. 异构多处理器系统芯片(MPSoC)的背景
- 现代的MPSoC平台被广泛应用于需要高性能、实时能力以及有限尺寸和功耗的工作负载中。这些应用包括自主驾驶、智能机器人和无人机等领域。
- 这些平台对内存层次结构的管理提出了前所未有的挑战,因为这些平台的核心复杂性(即多个核心共享缓存)使得对任务进行独立分析变得困难。
2. 缓存分区技术的需求
- 在MPSoC平台上,共享缓存会阻止任务的独立分析,从而复杂化任务最坏情况下执行时间(WCET)的准确估计。
- 为了缓解这个问题,已经采用了多种软件和硬件的缓存分区技术。缓存分区技术可以将共享缓存分成多个部分,分别分配给不同的任务或任务组,以减少任务之间的干扰。
3. 缓存分区技术的影响
- 虽然缓存分区技术有效,但它会限制实时任务组可用的缓存量。这会显著影响缓存敏感任务的WCET,因为这些任务的执行时间依赖于可用的缓存量。
- 例如,图1展示了四个基准应用程序在不同缓存分区大小下的执行减速情况,当可用缓存从1024KB减少到256KB时,某些应用程序的执行时间几乎变慢了两倍。
4. 研究的问题
- 本文研究了如何将实时任务分配到各个核上,并为每个核上的任务保留适当的缓存,以确保任务的可调度性,即每个任务能够满足其实时要求(如截止时间)。
- 主要关注非抢占式固定优先级(NP-FP)调度,同时评估框架在支持其他调度策略(如抢占式EDF和非抢占式EDF)方面的灵活性。
二、相关工作(Related Works)
1. 预先任务-缓存联合分配
- 为了充分利用多处理器平台,需要联合分配任务和内存资源(例如缓存)。
- 研究表明,可调的最坏情况下执行时间(WCETs)可以根据共享资源分配和仲裁方法弹性调整。
- 例如,使用混合整数线性规划(MILP)来分配任务、缓存和带宽,以最小化整体系统利用率。
2. 缓存分区的具体方法
- 在P-EDF调度下,通过MILP公式和背包算法的启发式方法解决任务、缓存和带宽的联合分配问题。
- 其他研究也探讨了在分区P-EDF调度下,执行时间对可用缓存分区数的依赖关系,使用k-means聚类和首次适应启发式算法进行缓存分区和任务分配。
3. 非抢占式任务-缓存联合分配
- 对于非抢占式调度,由于没有有效的多项式时间利用率界限来检查可调度性,问题变得更加复杂。
- 时间触发的非抢占式调度的多资源分配问题自然适合整数线性规划(ILP)公式。
- 例如,干扰感知分配算法(IA3)和周期驱动任务与缓存分区算法(PDPA)被提出用于NP-EDF调度。
4. 缓存相关抢占延迟(CRPD)
- 在多任务系统中,分区共享缓存并允许每个任务使用特定的分区可以减少CRPD,但可能会增加缓存未命中。
- 其他研究提出了在分区多核平台上共享缓存分区的任务和缓存分配的方法,以优化任务集利用率和缓存使用。
5. 其他方法
- 还有研究提出,不是将共享缓存分配给各个核,而是通过整数线性规划(ILP)来上限跨核缓存干扰,并提出基于干扰上限的任务分配算法。
- 动态资源分配也被探索,例如根据程序阶段动态调整资源分配,或者在模式转换时动态分配资源。
三、问题描述(Problem Description)
本文的研究问题包括三个部分:(i) 将软件任务分配到处理器核,(ii) 确定每个任务可以使用的最大缓存分区数,以及 (iii) 确保任务能够在其截止时间内完成。
- τ:任务集合,包括所有需要调度的任务。
- :处理器集合,包括所有可用的处理器核。
- :缓存分区的总数。
- :任务 τi的周期。
- :任务 τi在使用 μ个缓存分区时的执行时间。
- :分配给处理器核的任务集合。
- :分配给处理器核的缓存分区数。
- :任务 τi的缓存敏感性。
- :任务 τi 的基本利用率。
- :初始空解。
- :新的部分解。
- :新的部分解集合。
- :搜索深度为 xxx 时的部分解集合。
- :剩余需要分配的任务集合。
- :排序后的剩余需要分配的任务集合。
- :剩余任务的调度需求。
任务分配(Task Allocation)
- 任务集合:我们考虑一组个软件任务,用 T={τ1,τ2,…,τnτ} 表示。
- 处理器集合:这些任务需要在 个处理器核上运行,用 表示。
- 任务分配:我们需要确定每个任务应该分配到哪个处理器核上,即确定。任务分配是静态的,一旦分配后任务始终由同一个核执行。
缓存分区(Cache Partitioning)
- 共享缓存:假设任务在共享缓存中运行,缓存大小为 M。
- 缓存分区:为了防止内存干扰,将共享缓存分成 个等大小的分区。每个处理器核上的任务只能使用分配给该核的缓存分区。
- 缓存分配:我们需要确定为每个处理器核分配缓存分区,以确保任务的执行时间尽可能短,并满足实时要求。
- 约束条件:总的缓存分区数不能超过,即。
任务规格(Task Specification)
- 任务周期:每个非抢占式任务 τi以间隔时间不定期地启动。
- 截止时间:任务的截止时间与其周期相等,即任务必须在其周期内完成。
- 执行时间与缓存分区数的关系:任务的执行时间依赖于可用的缓存分区数,用离散函数 表示。当任务使用个缓存分区时,执行时间为。
可调度性分析(Schedulability Analysis)
- 目标:验证分配给每个处理器核的任务集合在给定的缓存分区数下是否可调度,即是否所有任务都能在其截止时间前完成。
- 任务优先级:根据速率单调调度策略,每个任务有固定优先级,优先级高的任务先执行。如果两个任务的周期相同,执行时间较长的任务优先级较高。
- 最坏情况响应时间:使用递推关系计算任务的最坏情况响应时间,确保每个任务在其周期内完成。
外层、中间层和内层(Outer Layer, Middle Layer, and Inner Layer)
外层(Outer Layer):
- 任务:缓存分区。
- 操作:使用广度优先搜索结合主动修剪,初步决定每个处理器核的缓存分区大小。选择一个核心的缓存分区大小,并调用中间层从剩余任务中分配任务到该核心。
- 目标:防止搜索树的指数增长,初步确定每个核心的缓存分区大小。
中间层(Middle Layer):
- 任务:任务分配。
- 操作:利用首次适应启发式算法,将任务合理地分配到各个核心上。提供两种策略:聚类兼容的任务以便共同调度,或者联合分配具有相似缓存敏感性潜力的任务。
- 目标:尽量提高系统的可调度性,即所有任务都能在其截止时间前完成。
内层(Inner Layer):
- 任务:可调度性分析。
- 操作:使用递推关系对任务集进行详细的可调度性分析,确保分配方案的可行性。具体步骤包括计算任务的忙时周期和任务实例的响应时间,确保任务能够在截止时间内完成。
- 目标:确保已经分配好的任务集在给定的缓存大小下是可调度的。
具体的算法步骤
计算任务的忙时周期(Busy Period Calculation)
对于每个任务 τi分配给处理器核 ,我们需要计算任务的忙时周期(忙时周期的计算帮助我们了解在最坏情况下,处理器核在多长时间内会一直被当前任务和其他高优先级任务所占用。)使用以下递推关系:
其中:
- ,表示任务 τi 可能被低优先级任务阻塞的最大时间。LPi,j⊂Tj 是低于任务 τi 优先级的任务集合。由于任务是非抢占式的,低优先级任务可能会在高优先级任务执行前占用处理器核,从而阻塞高优先级任务。
- 是高于或等于任务 τi 优先级的任务集合。
- 是低于任务 τi优先级的任务集合。
- ei′ 是高优先级任务 τi′的执行时间。
- pi′ 是高优先级任务 τi′的周期。
我们从开始,递推计算直到为止。
计算任务的响应时间(Response Time Calculation)
在忙时周期内,任务 τi可能会多次执行。我们需要计算任务实例的响应时间。对于每个任务实例,我们计算最长的响应时间:
其中:
- 是高于任务 τi优先级的任务集合。
- δ>0 是一个很小的数。
任务第 q 个实例的响应时间计算如下:
任务的最坏情况响应时间 计算如下:
其中
可调度性验证(Schedulability Verification)
如果每个任务的最坏情况响应时间 满足 ,则任务集合是可调度的。
四、多层混合优化(Multi-Layer Hybrid Optimization)
本文提出了一个三层嵌套的优化框架,以解决缓存分区和任务调度的问题。这三层分别是:
- 外层(Outer Layer):负责缓存分区。
- 中间层(Middle Layer):负责任务分配。
- 内层(Inner Layer):负责可调度性分析。
算法1:中间层和内层优化(Algorithm 1: Middle and Inner Optimization Layers)
我们先来详细解释算法1,该算法描述了中间层和内层的优化过程。
输入
- 一组剩余任务及其时间属性:包括周期、最短执行时间(即当整个缓存可用时的执行时间)。
输出
- 选定的任务集合 T。
-
初始化(Line 1):
- 令 T 为一个空集合,用于存储选定的任务。
-
任务排序(Line 2):
- 对任务集合进行排序。可以使用不同的排序标准,如基于缓存敏感性潜力(CASE)或任务的互相兼容性(COMP)。
-
任务分配循环(Lines 3-5):
- 遍历排序后的任务集合 ,对于每个任务:
- 调用内层方法
isSchedulable(T, τi)
检查将当前任务 τi添加到已选任务集合 T 中后,任务集合是否仍可调度。 - 如果可调度,则将任务 τi添加到集合 T 中。
- 调用内层方法
- 遍历排序后的任务集合 ,对于每个任务:
-
返回结果(Line 6):
- 返回选定的任务集合 T。
算法1的两个排序标准
排序标准1:缓存敏感性潜力(CASE)
缓存敏感性潜力是指任务在不同缓存分区条件下的执行时间变化程度。
-
基本利用率(Base Utilization):
- 当整个缓存可用时,任务的执行时间与周期的比值。
-
调度需求(Scheduling Demand):
- 剩余任务集合 的调度需求定义为这些任务的基本利用率之和:
- 我们希望最小化
-
缓存敏感性潜力(Cache Sensitivity Potential):
- 是任务被选中后实际的利用率。
- 越小,任务的缓存敏感性潜力越低。
排序标准1:CASE:
- 根据缓存敏感性潜力将任务按从小到大的顺序排序。
- 目标是优先分配缓存敏感性潜力低的任务,以减少整体调度需求。
排序标准2:互相兼容性(COMP)
互相兼容性是指任务能否在同一个处理器核上调度而不违背可调度性约束。
例子:
- 两个任务周期相同但利用率不同,它们的调度可能会影响其他任务的调度。
- 例如,一个周期为10ms,执行时间为5ms的任务,与另一个周期为25ms,执行时间为5ms的任务,可能会导致调度问题,因为一个任务可能会阻塞另一个任务。
排序标准2:COMP:
- 根据任务周期将任务按从小到大的顺序排序。
- 短周期任务优先分配,有助于后续处理长周期任务时避免互相阻塞,提高调度成功率。
具体示例
假设我们有以下任务集合 :
任务 τi | 周期 pi | 执行时间 ei | 缓存敏感性潜力 γi |
---|---|---|---|
τ1 | 10 | 2 | 0.1 |
τ2 | 20 | 4 | 0.2 |
τ3 | 15 | 3 | 0.05 |
CASE排序:
- 根据缓存敏感性潜力排序:τ3, τ1, τ2。
- 按照排序顺序尝试分配任务:
- 检查 τ3 是否可调度,若可调度则添加到 T 中。
- 检查 τ1 是否可调度,若可调度则添加到 T 中。
- 检查 τ2 是否可调度,若可调度则添加到 T 中。
COMP排序:
- 根据周期排序:τ1, τ3, τ2。
- 按照排序顺序尝试分配任务:
- 检查 τ1 是否可调度,若可调度则添加到T 中。
- 检查 τ3是否可调度,若可调度则添加到 T 中。
- 检查 τ2 是否可调度,若可调度则添加到 T 中。
文章好像没有提及这两个排序都出问题了怎么办?
算法2:外层优化(Outer Layer Optimization)
外层优化主要负责缓存分区。大致思路如下:
- 根据系统总的缓存资源,初步划分每个处理器核的缓存分区大小。
- 计算每个核的缓存需求和任务分配方案,以提高整体系统的可调度性。
目标:在多核处理器上,将任务分配到各个核心,并为每个核心分配适当数量的缓存,使任务能够按时完成。最终目标是找到一个任务和缓存分配方案,最大化系统的整体性能。
输入
- 任务集合 T
- 处理器核数量 nc
- 缓存分区数量 np
输出
- 任务分配集合 {T1,T2,…,Tnc}
- 每个核的缓存分区数 {μ1,μ2,…,μnc}
-
初始化(Line 1):
- 创建根节点并将其加入到初始集合中。
- 根节点 的属性包括:任务分配为空集合、缓存分区为空集合、剩余任务为完整任务集 T、剩余缓存分区为 。
-
遍历每个处理器核(Line 2):
- 从第1个核到第 个核进行遍历,每次遍历表示为第 x 次迭代。
-
初始化当前深度的节点集合(Line 3):
- 初始化当前深度 x的节点集合 为空集合。
-
遍历上一层的节点(Lines 4-13):
- 对上一层深度 中的每个节点 ω进行遍历。
- 检查当前节点 ω 是否还有剩余任务未分配(Line 5)。
- 对当前节点 ω 的剩余缓存分区进行遍历(Line 6)。
-
调用算法1进行任务分配(Line 7):
- 调用算法1(allocTask)为当前核分配任务,参数为当前节点的剩余任务和缓存分区 μ。
- 得到分配到第 x 个核的任务集合。
-
扩展父节点到新部分解(Lines 8-11):
- 如果不为空(表示有任务被成功分配),则创建一个新的部分解节点。
- 检查新部分解是否可以扩展到一个完整的解(Line 10)。
- 如果可以扩展到完整解,则将其加入 中(Line 11)。
- 如果 不能扩展到完整解,则将父节点 ω 加入 中(Line 13)。
-
移除被支配的部分解(Line 14):
- 在每次深度遍历后,移除被支配的部分解,以控制搜索树的大小和复杂性。
- 支配关系:如果一个节点在使用相同或更多缓存分区的情况下,调度需求更高,则被视为被支配。
-
返回结果(Lines 15-18):
- 如果在第 nc 层找到非支配的完整解,则返回任务分配和缓存分区方案。
- 如果没有找到完整解,则返回空集。
算法复杂度分析(详见原文,略)
五、COMP 和 CASE 的示例对比
背景信息
在这部分,我们使用两个例子来说明两种启发式方法(COMP 和 CASE)在找到可调度解决方案方面的表现。这些例子展示了哪种启发式方法在某些情况下更有效。
A. COMP 有效,CASE 失效
示例设置
- 4 个任务:τ1,τ2,τ3,τ4
- 4 个缓存分区
- 2 个处理器核
任务周期和在不同缓存分区数量下的执行时间如表 II 所示:
任务 τi | 周期 pi | 执行时间 ϵi,1 | 执行时间 ϵi,2 | 执行时间 ϵi,3 | 执行时间 ϵi,4 |
---|---|---|---|---|---|
τ1 | 100 | 36 | 35 | 34 | 34 |
τ2 | 100 | 75 | 55 | 45 | 27 |
τ3 | 150 | 77 | 48 | 35 | 25 |
τ4 | 150 | 85 | 82 | 81 | 79 |
COMP 启发式方法
- 任务分配结果:
- 核1:μ1=2; T1={τ1,τ2}
- 核2:μ2=; T2={τ3,τ4}
- 观察到的现象:具有相同周期的任务被分配到同一个处理器核。
CASE 启发式方法
- 在搜索深度为1时,有两个节点:
- 节点 ω1:τ1 分配到第一个核,使用1个缓存分区。
- 节点 ω2:τ1和 τ3分配到第一个核,使用2个缓存分区。
- ω1节点:τ1 在周期为100,执行时间为36的情况下是可调度的。
- ω2 节点:τ1 和 τ3\ 的可调度性计算结果表明这两个任务是可调度的。
- CASE 失败的原因:
- CASE 无法将 τ1 和 τ4分配到同一个核,因为它们不兼容。
- 由于 γ3=0.1533 小于 γ2=0.28,CASE 优先选择了 τ3 而不是 τ2。
- 在 ω1 的情况下,其余3个任务共享3个分区的利用率超过1,因此不可调度。
- 在 ω2 的情况下,τ2和 τ4 的利用率之和也超过1,因此不可调度。
B. CASE 有效,COMP 失效
示例设置
- 4 个任务:τ1,τ2,τ3,τ4
- 4 个缓存分区
- 2 个处理器核
任务周期和在不同缓存分区数量下的执行时间如表 III 所示:
任务 τi | 周期 pi | 执行时间 ϵi,1 | 执行时间 ϵi,2 | 执行时间 ϵi,3 | 执行时间 ϵi,4 |
---|---|---|---|---|---|
τ1 | 200 | 35 | 33 | 31 | 26 |
τ2 | 200 | 177 | 172 | 168 | 165 |
τ3 | 250 | 324 | 178 | 119 | 80 |
τ4 | 250 | 65 | 63 | 62 | 60 |
初始情况
- 假设缓存分区平均分配,即每个核分配2个缓存分区:
- 执行时间固定为:ϵ1,2,ϵ2,2,ϵ3,2,ϵ4,2。
- 任务利用率:
由于 τ2 的利用率为0.86,其他任务无法与其分配到同一核,因为这样会导致利用率超过1。相反,如果将 τ1,τ3 和 τ4 分配到同一核,利用率总和为1.129,大于1,因此也是不可行的。
CASE 启发式方法
- 任务分配结果:
- 核1:μ1=3; T1={τ1,τ3,τ4}
- 核2:μ2=1; T2={τ2}
COMP 启发式方法
- 在搜索深度为1时,有两个节点:
- 节点 ω1:τ1和 τ4 分配到第一个核,共享1个缓存分区。
- 节点 ω2:τ1 和 τ2 分配到第一个核,共享3个缓存分区。
- ω1 节点:两个任务 τ1 和 τ4 是可调度的。
- ω2节点:两个任务 τ1 和 τ2 是可调度的。
- COMP 失败的原因:
- 在 ω1的情况下,剩余的两个任务 τ2 和 τ3 利用率之和大于1,不可调度。
- 在 ω2 的情况下,剩余的两个任务 τ3和 τ4 利用率之和也大于1,不可调度。
六、结论
在非抢占调度中,低优先级的非抢占任务可能会阻塞高优先级任务,从而显著影响任务集的可调度性。此外,直观上,将具有相似缓存敏感性的任务聚类可以最大化缓存利用率,并提高可调度性。本文提供了关于在多核处理器上确定NP-FP任务可调度性时,阻塞和缓存敏感性之间权衡的有用见解。我们提出了一种多层混合设计空间探索框架,解决缓存分区和任务分配的联合问题。与最新算法的广泛实验评估表明,即使任务的缓存敏感性不能完全利用,我们的框架也能显著提高实时可调度性。尽管框架的某些优化策略是专门为NP-FP任务设计的,该框架对于抢占和非抢占的EDF任务也能取得良好的可调度性结果。