多核心系統上具多個可平行化片段任務之 排程機制
3.1 任務分配機制
本節說明任務分配機制為離線(Offline)方式,也就是在系統執行任務前,需要先將 每個任務或其衍生之子任務分配到適當的處理器上,並計算每個處理器上分配到的(子) 任務所需的負載使用密度總和,當系統開始執行工作時每個處理器以自己負載的使用密 度和設定處理器執行速度,執行屬於自己的任務。
任務分配的整體流程大致上如Algorithm 1 所示,為分配任務集合𝑇,一開始將會定 義並初始化幾個變數:新(子)任務集合Γ將會作為每個任務𝜏𝑖 ∈ 𝑇經處理過後存放(子)任 務的新集合;每個處理器𝑃𝑟𝑗(1 ≤ 𝑗 ≤ 𝑀)有(子)任務集合𝐺𝑗用於儲存分配到𝑃𝑟𝑗的(子)任務 之集合;每個處理器𝑃𝑟𝑗(1 ≤ 𝑗 ≤ 𝑀)有變數∆𝑗儲存分配到𝑃𝑟𝑗的任務之使用率與子任務使 用密度總和;𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑗,𝑖,𝑘為記錄可平行化任務𝜏𝑖第 k 個片段的子任務在(子)任務集 合𝐺𝑗中的個數,同時也可視為𝐺𝑗中有𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑗,𝑖,𝑘個k 片段的子任務已加入了共享集 合;𝑚𝑎𝑥𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑗,𝑖為在𝐺𝑗中,屬於可平行化任務𝜏𝑖的所有片段之中最大的子任務個 數,同時也可視為𝐺𝑗中屬於𝜏𝑖的共享集合目前的數量。關於子任務的使用密度(Density) 與共享機制將於本章3.2 節進行定義。
定義並初始化必要變數後,會依任務之類型處理每個任務𝜏𝑖 ∈ 𝑇,當𝜏𝑖為循序任務 時,無須經過處理,直接將其加入系統新(子)任務集合Γ;當𝜏𝑖為可平行化任務時,首先 判斷該可平行化任務是否需要進行平行化,若所有的平行片段的平行度皆為1 時,執行 時所需之最短執行時間超過其週期,一定無法在截限時間之前完成,則將任務𝜏𝑖以函式
13
𝐷𝑒𝑟𝑖𝑣𝑒_𝑆𝑢𝑏𝑡𝑎𝑠𝑘(. ) 處 理 ; 若 為 循 序 任 務 , 則 直 接 加 入 新 ( 子 ) 任 務 集 合 Γ 。 函 式 𝐷𝑒𝑟𝑖𝑣𝑒_𝑆𝑢𝑏𝑡𝑎𝑠𝑘(. )將會對可平行化任務𝜏𝑖的平行片段進行平行度的選擇,找出適當的平 行度組合〈1, 𝑥̅𝑖,2, … , 𝑥̅𝑖,𝐾𝑖−1, 1〉,並衍生出此任務的子任務集合Γ𝑖。若𝐷𝑒𝑟𝑖𝑣𝑒_𝑆𝑢𝑏𝑡𝑎𝑠𝑘(. )回 傳 空 集 合 , 代 表 該 任 務 平 行 化 失 敗 , 無 法 找 到 適 當 的 平 行 度 組 合 滿 足 𝐸̂𝑖(1, 𝑥̅𝑖,2, … , 𝑥̅𝑖,𝐾𝑖−1, 1) ≤ 𝑃𝑖,故宣告任務集合排程失敗;若回傳值非空集合,則將子任 務集合Γ𝑖加入集合Γ。關於函式𝐷𝑒𝑟𝑖𝑣𝑒_𝑆𝑢𝑏𝑡𝑎𝑠𝑘(. )細節將在 3.2 節進一步的詳細說明。
當每個任務𝜏𝑖 ∈ 𝑇皆處理完成後,令(子)任務集合Γ內的所有(子)任務依使用率(與使 用密度)由大到小排序。最後,依排序結果順序將循序任務𝜏𝑖與子任務𝜏𝑖,𝑘,𝑥逐一分配至處 理器,以函式𝐹𝑖𝑡_𝑡𝑜_𝑃𝑟𝑜𝑐𝑒𝑠𝑠𝑜𝑟(. )將(子)任務依採用的分配機制回傳適合的處理器𝑝∗, 之後並將此任務𝜏𝑖或子任務𝜏𝑖,𝑘,𝑥分配給該處理器。若𝐹𝑖𝑡_𝑡𝑜_𝑃𝑟𝑜𝑐𝑒𝑠𝑠𝑜𝑟(𝜏𝑖/𝜏𝑖,𝑘,𝑥, 𝐺, ∆)的 回傳值為-1,代表每個處理器皆無法再負荷下此(子)任務,故宣告排程失敗;若回傳值 1 ≤ 𝑝∗ ≤ 𝑀,則將此(子)任務加入𝐺𝑝∗,並更新其使用率與使用密度總和∆𝑝∗。關於函式 𝐹𝑖𝑡_𝑡𝑜_𝑃𝑟𝑜𝑐𝑒𝑠𝑠𝑜𝑟(𝜏𝑖/𝜏𝑖,𝑘,𝑥, 𝐺, ∆)將在 3.3 節進一步的詳細說明。
14 Algorithm 1 分配任務至處理器
1: Function Assign _Task_to_Processor(T)
2: 定義衍生的(子)任務集合Γ,並初始化為空集合;
3: 定義每個處理器Prj(1 ≤ 𝑗 ≤ 𝑀)的未來將執行的(子)任務集合 Gj,並初始 化為空集合;
4: 定義每個處理器Prj(1 ≤ 𝑗 ≤ 𝑀)所分配到的任務使用率與子任務使用密 度之總和∆𝑗,並初始化為0;
5: 定義在(子)任務集合 Gj(1 ≤ 𝑗 ≤ 𝑀)中,已放置屬於𝜏𝑖的第k 個片段之子 任務個數𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑗,𝑖,𝑘,並初始化為0;
6: 定義在(子)任務集合 Gj(1 ≤ 𝑗 ≤ 𝑀)中,已放置屬於𝜏𝑖的所有片段中的子 任務最大個數𝑚𝑎𝑥𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑗,𝑖,並初始化為0;
7: for 𝜏𝑖 ∈ 𝑇 do
8: if 𝜏𝑖 ∈ 𝑇𝑠 then //若屬於循序任務 9: Γ ← Γ ∪ 𝜏𝑖;
10: else if 𝜏𝑖 ∈ 𝑇𝑝 then //若屬於可平行化任務 11: if 𝐸̂𝑖(1, … ,1) > 𝑃𝑖 then
12: if (Γ𝑖 ← 𝐷𝑒𝑟𝑖𝑣𝑒_𝑆𝑢𝑏𝑡𝑎𝑠𝑘(𝜏𝑖)) = ∅ then //衍生子任務 13: return FALSE;
14: else
15: Γ ← Γ ∪ Γ𝑖; 16: else
17: Γ ← Γ ∪ 𝜏𝑖;
18: 將Γ依使用率(密度)由大到小排序;
19: for 𝜏𝑖(/𝜏𝑖,𝑘,𝑥) ∈ Γ do
20: if (𝑝∗ ← 𝐹𝑖𝑡_𝑡𝑜_𝑃𝑟𝑜𝑐𝑒𝑠𝑠𝑜𝑟(𝜏𝑖((/𝜏𝑖,𝑘,𝑥), 𝐺, 𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚, 𝑚𝑎𝑥𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚, ∆)) = −1 then
21: return FALSE;
22: else
23: 將𝜏𝑖(或𝜏𝑖,𝑘,𝑥)分配至處理器𝑝∗,也就是𝐺𝑝∗ ← 𝐺𝑝∗ ∪ 𝜏𝑖(或𝜏𝑖,𝑘,𝑥);
24: 將𝜏𝑖的使用率或是𝜏𝑖,𝑘,𝑥的使用密度累加至∆𝑝∗; 25: return TRUE;
26: Function end
15