編譯過程中的並行性優化(二):基本塊與全局代碼調度算法

上一篇:編譯過程中的並行性優化(一):概要

(浙江大學編譯原理課程的課程報告)

基本塊調度算法

基本塊是連續三地址狀態的最大序列,其中控制流只能在塊的第一個語句中輸入,並在最後一個語句中停留,而不會停止或分支。

對於一個由機器指令組成的基本塊中的指令進行調度以獲取最優解,這個時間複雜度是NP完全的。但在實踐中,由於基本塊之間的高度約束的運算較少,因此用簡單的調度算法是可行的。這裏介紹一個列表調度的算法。

數據依賴圖

數據依賴圖是調度算法中用到的一個重要工具。我們可以把每個由機器指令組成的基本塊標識成爲一個數據依賴圖(data-dependence graph), G = (N,E),其中節點集合N表示基本塊中機器指令的運算,而有向邊集合E表示運算之間的數據依賴約束。G的節點集合和邊及可以按照如下方式構造:

  1. 在N中的每個運算n爲一個節點,有個資源預約表RTn,其值就是n的運算類型所對應的資源預約表;
  2. E中的每條邊e有一個表示延時的標號de,表明目標節點必須在源節點發出後至少de個時鐘週期之後發出。

數據依賴圖的實例如下:

在這裏插入圖片描述

列表調度算法

從數據依賴圖和資源預約表就能清晰地看到指令之間的依賴關係,因此,我們可以採用簡單的方法,即使用帶優先級的拓撲排序訪問數據依賴圖的各個節點,就能得到基本塊調度的順序。換句話說,算法根據數據依賴圖中每個節點和之前已調度的節點之間的數據依賴約束,計算出能執行該節點的最早時間位置。

  • 輸入:一個機器資源向量 R = [ r1, r2 ... ], 其中ri是第i種資源的可用單元數目;以及一個數據依賴圖 G = (N,E)
  • 輸出:一個調度方案S, 將N中的每個運算映射到時間位置中。

算法僞代碼:

在這裏插入圖片描述

列表調度算法不進行回溯,對每個節點只進行一次指令調度,並使用一個啓發式的優先級函數函數從已就緒的節點中選擇下一個調度的節點。它具有如下性質:

  • 在不考慮資源約束的情況下,最短的調度方案根據關鍵路徑給出;
  • 如果運算都是獨立的,調度方案的長度受到可用資源的約束;
  • 可以使用源代碼中的順序決定運算之間難分先後的情況;

全局代碼調度

爲了更好地利用機器資源,我們還可以考慮將一些指令從一個基本塊移動到另一個基本塊的代碼調度,這種策略就稱爲全局調度。爲了正確地進行全局調度,除了數據依賴關係以外,我們也要考慮控制依賴關係。

我們需要保證以下兩點才能進行調度:

  1. 所有在源程序中執行的指令都會在優化後的程序中運行;
  2. 額外投機執行的指令不能產生任何副作用;

基本代碼移動

局部與全局代碼調動的例子:

在這裏插入圖片描述

就像上述調度,在全局代碼移動過程中,我們可以沿着一個執行路徑上下移動指令。可以根據基本塊之間的支配關係考慮指令移動的方式:

  • 如果每個從控制流圖入口處到達基本塊B1的路徑都經過一個基本塊B2,那麼就認爲B2支配B1;
  • 如果從基本塊B1到達控制流圖出口處的路徑都經過B2,那麼就認爲B2反向支配B1;
  • 如果B1支配B2且B2反向支配B1,則二者控制等價

在一條路徑上的一堆基本塊之間可能支配關係和反向支配關係都不具有。

對於可能的全局代碼移動方式,可以總結如下:

  • 在控制等價的基本塊之間移動指令最簡單且性價比最高;
  • 在沿着控制流路徑向上(向下)的代碼移動中,如果源基本塊不反向支配(支配)目標基本塊,可能需要執行額外的運算;
  • 在沿着控制流路徑向上(向下)的代碼移動中,如果目標基本塊不支配(反向支配)源基本塊,就可能需要補償一些相應的代碼;
  • 如果在沿着控制流路徑向上(向下)的代碼移動中,源和目的基本塊之中既不支配,也不反向支配,那麼可能既需要需要執行額外的運算又需要補償一些相應的代碼。

同時,代碼移動可能也會改變運算之間的數據依賴關係,因此每次代碼移動之後都必須更新它。

全局調動算法

  • 基於區域的調度算法:

    區域是一個控制流圖的子集,它只能ton過一個入口基本塊到達。對於一個簡單的全局調度器,可以採用基於區域的調度算法,它支持吧運算向上移動到控制等價的基本塊,或把運算向上移動一個分支,到一個支配前驅中:

    • 輸入:一個控制流圖和一個機器資源描述
    • 輸出:一個調度方案S
    • 僞代碼:

在這裏插入圖片描述

  • 循環展開:

    在代碼調度前少量地展開循環可以增加代碼移動的可能性,進而增加並行性,如下所示:

在這裏插入圖片描述

  • 相鄰壓縮:

    在基於區域的調度後可以再跟一個簡單的代碼處理過程,在這個過程中檢查各對相鄰的連續執行的基本塊是否有運算可以在他們之間上移或下移,以改進它們的執行時間。

動態調度

如果編程語言支持動態調度器,即可以根據運行時刻的情況產生新的調度方案,而不需要在運行之前對於所有的可能調度進行編碼,就能獲得更好的優化方案。


知識點總結:

  • 基本塊的數據依賴圖
  • 帶優先級的拓撲排序
  • 列表調度
  • 基本塊之間的代碼移動

參考資料

  • 《編譯原理》第二版,第十章、第十一章

我的GIS/CS學習筆記:https://github.com/yunwei37/myClassNotes
<一個浙大GIS/CS小白的課程學習筆記 >


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章