• 沒有找到結果。

多核心系統上具多個可平行化片段任務之 排程機制

3.3 為(子)任務尋找適合的處理器

在處理完所有任務的平行度組合設定後,接著就將開始進行(子)任務分配至處理器,

不同的分配方式對於(子)任務集合的可排程率與其耗電量的都有一定程度的影響,例如:

將所有(子)任務集中分配到某一個處理器,直到已無足夠能力執行其他(子)任務,再開 始進行分配到下一個處理器的動作,像這樣的作法雖然使得可排程率較高;但若是將所 有(子)任務平均分配到每個處理器,分散對處理器的計算能力需求,由於負載平衡,將 可以達到降低電能的效果。因此,根據不同的優勢將探討幾種不同的分配方式,為(子) 任務找到適合的處理器。此外,我們也將同時考慮處理器計算能力共享的機制,分配機 制可以有以下三種方式[8]:

1. Best Fit (BF):將(子)任務分配至剩餘計算能力最少的處理器。

2. First Fit (FF):將(子)任務分配給有足夠計算能力且處理器編號最小者。

3. Worst Fit (WF):將(子)任務分配至剩餘計算能力足夠且最多的處理器。

定理 11. [14]任務集合排程於多核心處理器系統時,若每個處理器核心所分配到的任務 之使用率及子任務之使用密度總和皆未超過1,則任務集合將可排程。□

於 3.1 節 所 提 到 的 為 ( 子 ) 任 務 𝜏𝑖(/𝜏𝑖,𝑘,𝑥) 尋 找 適 合 的 處 理 器 之 函 式 𝐹𝑖𝑡_𝑡𝑜_𝑃𝑟𝑜𝑐𝑒𝑠𝑠𝑜𝑟(. ),此函式會考慮到處理器計算能力共享的機制,另外,因 BF、FF 與 WF 分配法其演算方式相似,故只採用 WF 分配法呈現,整體的演算法流程如 Algorithm 4 所示。一開始會先做以下變數定義:∆𝑡𝑚𝑝為假設(子)任務𝜏𝑖(/𝜏𝑖,𝑘,𝑥)分配到某 個處理器後的使用密度總和;𝑝為𝜏𝑖(/𝜏𝑖,𝑘,𝑥)最終會分配到的目標處理器,預設上為-1 表 示仍未找到; ∆𝑚𝑖𝑛為針對WF 分配法的變數,暫存目前最小的∆𝑡𝑚𝑝之值,而處理器𝑝 即為有此值之處理器。由於此變數在演算法中用於求得∆𝑡𝑚𝑝的最小值,且此值最大等於 1,故在預設上給予∞。

要將(子)任務𝜏𝑖(/𝜏𝑖,𝑘,𝑥)分配到最適合的處理器上,需要比較如果將此(子)任務

28

𝜏𝑖(/𝜏𝑖,𝑘,𝑥)分配到每個處理器後的變化情形,過程分成兩個階段。為了能夠維護處理器上

的子任務共享集合,在確定子任務分配後,需額外給子任務一個所屬的共享集合編號,

在某個處理器上若同一任務之子任務有相同的共享集合編號則屬於同一共享集合。同一 任務之相同片段的多個子任務被分配到同一個處理器,其共享集合編號皆不會相同。

第一階段主要針對子任務,進行呼叫函式 𝐶ℎ𝑒𝑐𝑘_𝑆ℎ𝑎𝑟𝑒𝑑_𝑆𝑒𝑡(. ) ,其演算法如 Algorithm 5 所示。將為子任務𝜏𝑖,𝑘,𝑥尋找所有處理器中是否可加入的共享集合,也就是可 以一起共享處理器計算能力的子任務。將逐一檢視𝜏𝑖,𝑘,𝑥於每個處理器時的狀況,並且每 個處理器只會測試一個共享集合。於一開始會先暫定𝜏𝑖,𝑘,𝑥在處理器𝑃𝑟𝑗的共享集合編號 為(𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑗,𝑖,𝑘 + 1),並且比較是否小於等於𝑚𝑎𝑥𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑗,𝑖,若是,則代表該 處理器有𝜏𝑖,𝑘,𝑥可以加入的共享集合,但需逐一尋找𝐺𝑗中與𝜏𝑖,𝑘,𝑥屬於同任務且共享集合編 號相同的子任務𝜏𝑎,𝑏,𝑐,若有則代表𝜏𝑎,𝑏,𝑐所在的共享集合為𝜏𝑖,𝑘,𝑥可能會加入的其中一個集 合,因此需要比較過加入哪個共享集合是最適合的,判斷基準為加入共享集合後其子任 務最大使用密度增加幅度𝑖𝑛𝑐𝑟𝑒𝑚𝑒𝑛𝑡為最小的。我們的做法是將𝜏𝑖,𝑘,𝑥之使用密度減去所 有符合條件的子任務𝜏𝑎,𝑏,𝑐之使用密度,此方法等同是𝜏𝑖,𝑘,𝑥與要加入的共享集合中的所有 子任務比較過,此時的結果有兩種:一種是在比較過所有子任務之前,遇到了比自己使 用密度還大的子任務,因此可以確定加入此共享集合不會有任何的增加幅度;另一種是 比較過所有子任務,而其中也必定包含目前該共享集合最大使用密度的子任務,因此

𝜏𝑖,𝑘,𝑥加入該共享集合後,其子任務最大使用密度所增加的幅度與目前增加幅度之最小值

𝑖𝑛𝑐𝑟𝑒𝑚𝑒𝑛𝑡會比較過,若小於𝑖𝑛𝑐𝑟𝑒𝑚𝑒𝑛𝑡則會將其取代,並記錄此時的處理器於𝑝。於是 重複上述的流程,直到找到不會增加幅度的共享集合並加入,該共享集合所在的處理器 即為最合適;或是檢視完所有處理器的共享集合,增加幅度𝑖𝑛𝑐𝑟𝑒𝑚𝑒𝑛𝑡為最小的共享集 合所在的處理器𝑝即為所求。若子任務找不到任何可以加入的共享集合,𝑝值會保持-1 並進入下個階段。

第二階段將依照 WF 分配法,將(子)任務分配至目前計算能力剩餘最多的處理器。

首先會計算𝜏𝑖(/𝜏𝑖,𝑘,𝑥)分配至目前處理器後,該處理器中的(子)任務之使用率(密度)總和

29

𝑡𝑚𝑝,在∆𝑡𝑚𝑝值未超過上限值 1 前提下,只要此∆𝑡𝑚𝑝小於目前暫定的最小值∆𝑚𝑖𝑛,則

𝑡𝑚𝑝值取代∆𝑚𝑖𝑛,並將目前的處理器紀錄於𝑝,也就是說,從所有處理器中尋找∆𝑡𝑚𝑝為 最小的處理器。順便一提,在條件不變的情況下,若使用BF 法,則變更為尋找∆𝑡𝑚𝑝為 最大的處理器;若使用 FF 法,只需要找到第一個令∆𝑡𝑚𝑝≤ 1的處理器即可。而在確定 即將分配的目標處理器之後,會判斷𝜏𝑖,𝑘,𝑥是否為子任務,若是則設定𝜏𝑖,𝑘,𝑥加入𝐺𝑝後的 共享編號為(𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑝,𝑖,𝑘+ 1),並將𝐺𝑝中屬於可平行化任務𝜏𝑖的共享集合之最大數 𝑚𝑎𝑥𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑝,𝑖增加 1,代表𝜏𝑖,𝑘,𝑥於第一階段找不到可以加入的共享集合,因此自 己成立一個新的共享集合。

經過兩個階段的判斷後,最後處理器𝑝即為𝜏𝑖(/𝜏𝑖,𝑘,𝑥)將被分配到的目標處理器。若 𝑝仍為初始值-1,則代表所有處理器的計算能力都無法滿足該(子)任務的即時需求,宣 告排程失敗。

30

Algorithm 4 以 WF 機制為基礎尋找適合任務𝜏𝑖的處理器 1: Function 𝐹𝑖𝑡_𝑡𝑜_𝑃𝑟𝑜𝑐𝑒𝑠𝑠𝑜𝑟(𝜏𝑖(/

𝜏𝑖,𝑘,𝑥), 𝐺, 𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚, 𝑚𝑎𝑥𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚, ∆)

2: 定義如果將𝜏𝑖(/𝜏𝑖,𝑘,𝑥)分配給某一個處理器後該處理器上之(子)任務之使 用密度總和∆𝑡𝑚𝑝,並初始化為0;

3: 定義暫定目標處理器𝑝 ← −1;

4: 定義使用密度之最小值∆𝑚𝑖𝑛← ∞;

5: if 𝜏𝑖,𝑘,𝑥為某個可平行化任務之子任務then

6: 𝑝 ← 𝐶ℎ𝑒𝑐𝑘_𝑆ℎ𝑎𝑟𝑒𝑑_𝑆𝑒𝑡(𝜏𝑖,𝑘,𝑥, 𝐺, 𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚, 𝑚𝑎𝑥𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚, ∆);

7: if 𝑝 = −1 then //沒有可共享的集合 8: for 𝑗 = 1 to 𝑀 do

9: ∆𝑡𝑚𝑝← ∆𝑗+ σ𝑖(/σ𝑖,𝑘);

10: if ∆𝑡𝑚𝑝≤ 1 且 ∆𝑡𝑚𝑝< ∆𝑚𝑖𝑛 then 11: ∆𝑚𝑖𝑛← ∆𝑡𝑚𝑝;

12: 𝑝 ← 𝑗;

13: if 𝜏𝑖,𝑘,𝑥為某個可平行化任務之子任務then

14: 設定𝜏𝑖,𝑘,𝑥加入𝐺𝑝後的共享集合編號為𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑝,𝑖,𝑘+ 1;

15: 𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑝,𝑖,𝑘 ← 𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑝,𝑖,𝑘+ 1

16: 𝑚𝑎𝑥𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑝,𝑖 ← 𝑚𝑎𝑥𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑝,𝑖+ 1;

17: return 𝑝; 18: Function end

31

Algorithm 5 尋找適合子任務𝜏𝑖,𝑘,𝑥的共享集合(處理器)

1: Function 𝐶ℎ𝑒𝑐𝑘_𝑆ℎ𝑎𝑟𝑒𝑑_𝑆𝑒𝑡(𝜏𝑖,𝑘,𝑥, 𝐺, 𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚, 𝑚𝑎𝑥𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚, ∆)

2: 定義𝜏𝑖,𝑘,𝑥加入某個共享集合後,其最大使用密度增加的幅度之最小值

𝑖𝑛𝑐𝑟𝑒𝑚𝑒𝑛𝑡 ← ∞;

3: 定義∆𝑡𝑚𝑝為暫存𝜏𝑖,𝑘,𝑥之使用密度−要加入的共享集合之最大使用密度之差

值,並初始化為0;

4: 定義暫定目標處理器𝑝 ← −1;

5: for 𝑗 = 1 to 𝑀 do

6: if (𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑗,𝑖,𝑘+ 1) ≤ 𝑚𝑎𝑥𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑗,𝑖 then

7: for 每個子任務𝜏𝑎,𝑏,𝑐 ∈ 𝐺𝑗 do //檢查該處理器中的每個(子)任務 8: if 𝜏𝑎,𝑏,𝑐與𝜏𝑖,𝑘,𝑥為同任務不同片段之子任務,且子任務𝜏𝑎,𝑏,𝑐

之共享集合編號 = (𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑗,𝑖,𝑘+ 1) then

9: ∆𝑡𝑚𝑝← (𝜏𝑖,𝑘,𝑥之使用密度 − 𝜏𝑎,𝑏,𝑐之使用密度);

10: if ∆𝑡𝑚𝑝≤ 0 then

11: 設定𝜏𝑖,𝑘,𝑥於𝐺𝑗的共享編號為(𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑗,𝑖,𝑘 + 1);

12: 𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑝,𝑖,𝑘 ← 𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑝,𝑖,𝑘+ 1;

13: return 𝑝 ← 𝑗;

14: else

15: if (∆𝑗+ ∆𝑡𝑚𝑝) ≤ 1 且 ∆𝑡𝑚𝑝< 𝑖𝑛𝑐𝑟𝑒𝑚𝑒𝑛𝑡 then 16: 𝑖𝑛𝑐𝑟𝑒𝑚𝑒𝑛𝑡 ← ∆𝑡𝑚𝑝:

17: 𝑝 ← 𝑗;

18: 設定𝜏𝑖,𝑘,𝑥加入𝐺𝑝後的共享集合編號為(𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑝,𝑖,𝑘+ 1);

19: 𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑝,𝑖,𝑘 ← 𝑆ℎ𝑟𝐺𝑟𝑝𝑁𝑢𝑚𝑝,𝑖,𝑘+ 1;

20: return 𝑝; 21: Function end

32

在此,我們將分析演算法的時間複雜度。Algorithm 1 為整個機制的主體,輸入至 Algorithm 1 的任務集合 T 有 n 個任務,在最糟情況(Worst Case)下,假設 n 個任務皆為 可平行化任務,並且最高有𝐾𝑖個片段。Algorithm 1 主要分為三個階段,第一階段為 7 至 17 行,流程中呼叫了 Algorithm 2,而 Algorithm 2 又呼叫了 Algorithm 3;第二階段為 18 行的(子)任務的排序;第三階段為 19 至 24 行,流程中呼叫了 Algorithm 4,而 Algorithm 4 又呼叫了 Algorithm 5。

第一階段主要分類處理 n 個任務,其中針對可平行化任務將再進行呼叫 Algorithm 2,該演算法為處理單個可平行化任務之演算法,目的為確立可平行化組合並衍生其子 任務,此演算法最高需測試M 種平行度組合。而 Algorithm 2 之中會進行 Algorithm 3,

主要計算所有共享集合的使用密度總和,而最多需要計算 M 個共享集合,並且每個共 享集合最多需要檢查任務之所有可平行片段。因此第一階段的時間複雜度為:𝑂(𝑛𝑀2𝐾̂),

𝐾̂ = 𝑀𝑎𝑥{𝐾𝑖}為所有任務之最多可平行片段個數。由於循序片段只會衍生 1 個子任務,

而可平行化片最高衍生M 個子任務,因此在第一階段結束後最多會產生𝑛 × (𝐾̂−1

2 × 𝑀 +

𝐾̂+1

2 )個子任務。

第二階段,在任務分配前需要將所有(子)任務進行使用密度由大到小的排序,因此 時間複雜度為:𝑂 ((𝑛 × (𝐾̂−1

2 × 𝑀 +𝐾̂+1

2 )) 𝑙𝑜𝑔 (𝑛 × (𝐾̂−1

2 × 𝑀 +𝐾̂+1

2 ))) = 𝑂 ((𝑛 × 𝐾̂ × 𝑀)𝑙𝑜𝑔(𝑛 × 𝐾̂ × 𝑀))。

第三階段,此階段為分配所有的(子)任務至處理器,在 Algorithm 4 中又可分為兩個 小階段,第一小階段為呼叫Algorithm 5,此演算法最多需要檢查過所有子任務;而第二 小階段,(子)任務最多需要檢查配對過 M 個處理器。因此,第三階段的時間複雜度為:

𝑂 ((𝑛 × (𝐾̂−1

2 × 𝑀 +𝐾̂+1

2 ))

2

) = 𝑂 ((𝑛 × 𝐾̂ × 𝑀)2)。

綜合以上三個階段,Algorithm 1 的時間複雜度為:

𝑂 (((𝑛 × 𝐾̂ × 𝑀)𝑙𝑜𝑔(𝑛 × 𝐾̂ × 𝑀)) + (𝑛 × 𝐾̂ × 𝑀)2) = 𝑂 ((𝑛 × 𝐾̂ × 𝑀)2)。

33

相關文件