天天看點

編譯過程中的并行性優化(三):軟體流水線化與SIMD技術

浙江大學《編譯原理》課程報告

我的GIS/CS學習筆記:https://github.com/yunwei37/ZJU-CS-GIS-ClassNotes

<一個浙江大學大學生的計算機、地理資訊科學知識庫 >

上一篇:

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

軟體流水線化

軟體流水線化

也是一種重要的指令排程技術,就像硬體流水線的指令一樣,它通過并行執行來自不同循環體的指令來加快循環程式的執行速度, 在前一個循環體未結束前啟動下一個新的循環體,來達成循環體時間上的并行性。相比于簡單的展開循環(在提高性能的同時會導緻代碼的膨脹),軟體流水線提供了一個友善的優化方法,能夠在優化資源使用的同時保持代碼的簡潔。

對于循環之間沒有資料依賴的

do-all

循環,我們可以用一個簡單的對比來說明軟體流水線同簡單循環展開的不同,下圖為簡單的循環展開:

編譯過程中的并行性優化(三):軟體流水線化與SIMD技術

軟體流水線化通過将循環展開排程後中重複的部分進行循環,完成流水線。下圖為軟體流水線化的結果:

編譯過程中的并行性優化(三):軟體流水線化與SIMD技術

在開始階段(1-6行)用來填充流水線的指令序列被稱為

序言

;在穩定循環的部分(7-8行)被稱為

穩定狀态

;用來排空流水線的指令序列(9-14行)稱為

尾聲

在軟體流水中,相鄰循環體的啟動時間間隔稱為啟動間距。在軟體流水中再次應用循環展開,使同一時刻可以運作多個循環,可以使軟體流水實作分數值的啟動間距,同時基于展開的優化技術可以降低程式的資源需求和關鍵路徑的長度。但是,循環展開也會引起代碼量增長和寄存器需求增大,代碼量的增長會導緻緩存的性能變差,寄存器需求的增大則有可能使軟體流水失敗。是以,軟體流水的核心問題之一就是展開因子的确定。

對于各個疊代之間的存在資料依賴關系的循環,也稱

do-access

循環,軟體流水線化也可以起到一定的效果:

編譯過程中的并行性優化(三):軟體流水線化與SIMD技術

SIMD

  • 發掘:識别生成出 SIMD 指令,同時解決控制依賴對發掘的影響。SIMD 擴充部件可在不同的粒度進行識别向量化,包括面向基本塊内向量化、面向最内層循環或者循環嵌套的向量化以及面向函數級别的向量化。
  • 優化:首先減小輔助指令的開銷,同時考慮資料局部性、寄存器重用等工作。由于部分體系結構的 SIMD 指令隻能從記憶體中存取連續對齊的資料,是以當程式中存在不對齊或不連續記憶體引用時需要通過移位或者重組等輔助指令才能組成向量。減少輔助指令的數量和提高輔助指令的效率,是增加程式 SIMD 向量化收益的關鍵問題。
  • 代碼生成:考慮平台支援哪些資料類型和向量運算。直接面向特定平台的 SIMD 向量化代碼生成存在許多不足,通常分階段并行編譯優化和虛拟向量是解決面向多平台向量化的兩個方法。

繼續閱讀