什麼是軟體流水線?
軟體流水線是一種編譯時排程技術,它重疊後續迴圈迭代以公開操作級並行性。開發足夠的軟體流水線演算法的一個必要問題是如何處理包含條件分支的迴圈。條件分支透過提供少量可能的執行路徑到排程機會,增加了複雜性並降低了軟體流水線演算法的效能。
為了演示其基本思想,讓我們看一下在具有多個並行操作執行單元的ILP處理器上迴圈的最可行的並行執行。讓我們假設迴圈體採用類似RISC的中間程式碼,例如:
load r100, b(i); fmul r100, 2.0, r100; store a(i), r100;
在演示軟體流水線的原理時,我們只關注迴圈體,忽略一些序言和結語程式碼。
它可以對ILP處理器做出以下假設:它具有獨立的FP、FX、載入和儲存指令執行單元,所有這些單元都能夠並行操作。所有執行單元都應允許每個週期啟動一個新操作。最後,我們假設FP單元在例如三個週期內提供fmul指令的結果,而載入和儲存的執行延遲為一個週期。
現在讓我們尋找最可行的並行執行。當我們儘可能並行地展開迴圈和後續迭代時,就可以實現它。讓我們從第一次迭代開始。它可以按如下方式執行:
週期 | 指令 | 註釋 |
---|---|---|
c | load r101, b(1); | // 載入 b(1) |
c+1 | fmul r101, 2.0, r101, | |
c+2 | decr r200; | // 遞減迴圈計數 |
c+3 | Nop | // 等待fmul的結果 |
c+4 | store a(i) +, r101; | // 儲存 a(i),自動遞增 i。 |
在這裡,我們注意到假設的最終操作延遲為三個週期,因此在週期 c + 3 中其結果尚未可用,並且必須插入“nop”。根據所做的假設,可以透過載入第二個資料項 b(2) 在週期 c+1 中啟動第二次迭代。
它可以避免與第一次迭代的干擾,即避免在第二次迭代中使用 r101 的WAW衝突,r101必須重新命名,例如為 r102。隨後,兩次迭代可以並行實現。這可以接收以下執行序列:
週期 | 1.迭代 | 2.迭代 |
---|---|---|
c | load r101, b(1); | |
c+1 | fmul r101, 2.0, r101, | load r102, b(2); |
c+2 r102, | decr | fmul r102, 2.0, |
c+3 | Nop | Decr |
c+4 | store a(i) +, r101; | Nop |
c+5 | store a(2) +, r102; |
在下表中,它可以顯示迴圈的整個執行過程。讓我們看看週期 c+4、c+5 和 c+6。這些週期顯示了軟體流水線的真正優勢。重要的是,對於這些週期,後續迴圈迭代之間的可用並行性得到了充分利用。例如,在週期 c+4 中,並行操作如下:
它可以儲存迭代 1 的結果(即 a(1)),自動遞增索引。
它可以將由 r200 保持的迴圈計數遞減 1。
它可以使用屬於週期 4 的運算元執行浮點乘法,即 (2.0 * b(4));
它可以載入迭代 5 的運算元,即 b(5)。
在具有多個流水線執行單元的ILP處理器上給定迴圈的最並行執行
週期 | 迭代編號 | ||||||
---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | |
c | load | ||||||
c+1 | fmul | load | |||||
c+2 | decr | fmul | Load | ||||
c+3 | nop | decr | fmul | Load | |||
c+4 | store | Nop | Decr | Fmul | load | ||
c+5 | store | Nop | Decr | fmul | load | ||
c+6 | store | Nop | decr | fmul | Load | ||
c+7 | store | nop | decr | fmul | |||
c+8 | store | nop | Decr | ||||
c+9 | store | Nop | |||||
c+10 | store |