什麼是迴圈展開

將迴圈本體重複寫出數次,以減少重複次數的最佳化。減少分支與次數判定的負擔,也更容易重新排列指令,但程式碼會變大。

日文名稱: ループ展開

「迴圈展開」出現在2領域的6道練習題中(編譯器, 記憶體階層與效能等)。

這個名詞所屬的領域: 編譯器

練習迴圈展開的題目

關於迴圈展開(loop unrolling)的主要效果,下列何者正確?

  1. A判斷次數與分支的開銷減少,指令也更容易重新排列
  2. B迴圈主體只剩一次份,程式的程式碼變小
  3. C將迴圈抽出成函式,使其能從其他地方呼叫
查看答案與解析

正確答案:A. 判斷次數與分支的開銷減少,指令也更容易重新排列

迴圈展開是一種最佳化,例如將迴圈主體並排寫出4次份,使重複次數成為原來的四分之一。判斷次數與分支的指令減少,而且並排的主體之間的指令可以組合後重新排列,因此較容易填補運算的等待時間。代價是程式碼變大,也可能擠壓指令快取。「主體剩一次份而使程式碼變小」是相反的說明,而將迴圈抽出成函式則是另一種轉換。

將重複100次的迴圈,改寫成將主體並排4次份的迴圈展開,次數的判斷與分支會變成幾次?(假設100可被4整除)

  1. A100次
  2. B25次
  3. C400次
查看答案與解析

正確答案:B. 25次

將主體並排4次份後,一次重複就會進行原本4次份的處理,所以重複次數成為 100 ÷ 4 = 25次,次數的判斷與分支也減少為25次。與原本的100次相比,分支等開銷變成四分之一。若次數不能被4整除,就在後面追加一個處理剩餘部分的短迴圈。100次是不展開時的次數,400次則是誤把主體的處理數量相乘得到的值。

解析中的「迴圈展開」

出現「迴圈展開」的題目(6題)

  1. 關於迴圈展開(loop unrolling)的主要效果,下列何者正確?
  2. 將重複100次的迴圈,改寫成將主體並排4次份的迴圈展開,次數的判斷與分支會變成幾次?(假設100可被4整除)
  3. 關於基本區塊的說明,下列何者正確?
  4. 關於編譯器的常數摺疊(constant folding),下列哪個範例正確?
  5. 對上方迴圈中的索引計算 i * 4 進行強度削減時,下列轉換何者正確?
  6. 矩陣乘法等所使用的迴圈分塊(loop blocking,亦稱tiling)的主要目的為下列何者?

相關名詞

基本區塊 控制流程圖 常數摺疊 強度削減 迴圈分塊 中間表示法(IR) 共同子運算式消除 向量化 行內展開 抽象語法樹(AST)

前往名詞解釋列表