什麼是迴圈展開
將迴圈本體重複寫出數次,以減少重複次數的最佳化。減少分支與次數判定的負擔,也更容易重新排列指令,但程式碼會變大。
日文名稱: ループ展開
「迴圈展開」出現在2領域的6道練習題中(編譯器, 記憶體階層與效能等)。
這個名詞所屬的領域: 編譯器
將迴圈本體重複寫出數次,以減少重複次數的最佳化。減少分支與次數判定的負擔,也更容易重新排列指令,但程式碼會變大。
日文名稱: ループ展開
「迴圈展開」出現在2領域的6道練習題中(編譯器, 記憶體階層與效能等)。
這個名詞所屬的領域: 編譯器
正確答案:A. 判斷次數與分支的開銷減少,指令也更容易重新排列
迴圈展開是一種最佳化,例如將迴圈主體並排寫出4次份,使重複次數成為原來的四分之一。判斷次數與分支的指令減少,而且並排的主體之間的指令可以組合後重新排列,因此較容易填補運算的等待時間。代價是程式碼變大,也可能擠壓指令快取。「主體剩一次份而使程式碼變小」是相反的說明,而將迴圈抽出成函式則是另一種轉換。
正確答案:B. 25次
將主體並排4次份後,一次重複就會進行原本4次份的處理,所以重複次數成為 100 ÷ 4 = 25次,次數的判斷與分支也減少為25次。與原本的100次相比,分支等開銷變成四分之一。若次數不能被4整除,就在後面追加一個處理剩餘部分的短迴圈。100次是不展開時的次數,400次則是誤把主體的處理數量相乘得到的值。
迴圈展開是一種最佳化,例如將迴圈主體並排寫出4次份,使重複次數成為原來的四分之一。
關於迴圈展開(loop unrolling)的主要效果,下列何者正確?整個函式通常由多個基本區塊構成,而並排迴圈主體的是迴圈展開。
關於基本區塊的說明,下列何者正確?並排迴圈主體的是迴圈展開,彙整函式呼叫則是另一種最佳化。
關於編譯器的常數摺疊(constant folding),下列哪個範例正確?將主體並排4次份的是迴圈展開。
對上方迴圈中的索引計算 i * 4 進行強度削減時,下列轉換何者正確?減少分支指令是迴圈展開(loop unrolling)的目的,所用的記憶體總量也不會改變。
矩陣乘法等所使用的迴圈分塊(loop blocking,亦稱tiling)的主要目的為下列何者?基本區塊 控制流程圖 常數摺疊 強度削減 迴圈分塊 中間表示法(IR) 共同子運算式消除 向量化 行內展開 抽象語法樹(AST)