迴圈排程有哪些型別?
迴圈是 ILP 處理器並行處理的重要來源。因此,控制結構的規律性可以加快計算速度。迴圈排程是為高度並行 ILP 處理器(包括 VLIW)開發的指令排程器的核心部分。
迴圈排程的型別
迴圈排程主要有以下兩種型別:

迴圈展開
迴圈展開的基本概念是多次重複迴圈體,並丟棄不必要的迭代間程式碼,包括遞減迴圈計數、驗證迴圈結束以及迭代間的條件分支。
這將縮短執行時間。當在編譯時已經確定多次迭代時,通常在“do”和“for”迴圈中出現,可以簡單地執行迴圈展開。
迴圈展開以程式碼長度為代價節省了效能時間,其方法與程式碼內聯或傳統的宏展開非常相似。程式碼內聯是標準的編譯器最佳化方法之一,用於簡短且偶爾使用的子程式。
如果需要,程式碼內聯表示每次在“呼叫點”知道子程式時都新增整個子程式體,而不是獨立儲存子程式體並在需要時從主程式碼呼叫它。
當迴圈必須執行大量次數,或迭代次數在編譯時未固定時,簡單的展開不適用。在這種情況下,必須擴充套件簡單的迴圈展開。通常的方法是展開迴圈一定次數,例如三次,併為生成的展開迴圈組設定一個迴圈。然後,遞減、測試迴圈結束和條件分支回程式碼僅對每一組展開迴圈都是必要的。
軟體流水線
軟體流水線是指連續的迴圈迭代如同硬體流水線一樣執行,如下表所示。讓我們看看週期 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 | 載入 | ||||||
| c+1 | fmul(浮點乘法) | 載入 | |||||
| c+2 | 遞減 | fmul(浮點乘法) | 載入 | ||||
| c+3 | nop(空操作) | 遞減 | fmul(浮點乘法) | 載入 | |||
| c+4 | 儲存 | nop(空操作) | 遞減 | fmul(浮點乘法) | 載入 | ||
| c+5 | 儲存 | nop(空操作) | 遞減 | fmul(浮點乘法) | 載入 | ||
| c+6 | 儲存 | nop(空操作) | 遞減 | fmul(浮點乘法) | 載入 | ||
| c+7 | 儲存 | nop(空操作) | 遞減 | fmul(浮點乘法) | |||
| c+8 | 儲存 | nop(空操作) | 遞減 | ||||
| c+9 | 儲存 | nop(空操作) | |||||
| c+10 | 儲存 | ||||||
週期 c+4 到 c+6 具有重複的排程設計。它可以透過等效迴圈來恢復。這個新迴圈的每次迭代都包含與初始迴圈的多次迭代相關的幾個操作。
loop:storei;decri+2;fmuli+3;loadi+4;bc loop; //the loop has to be executed for i = 1 to 3
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP