編譯器

對上方迴圈中的索引計算 i * 4 進行強度削減時,下列轉換何者正確?

for (i = 0; i < n; i++)
    sum += a[i * 4];
  1. A將 i * 4 替換為在編譯時計算好的常數
  2. B將迴圈次數減為四分之一,並將主體並排4次份
  3. C另外準備一個變數,每次重複就加4
查看答案與解析

正確答案:C. 另外準備一個變數,每次重複就加4

強度削減是將較重的運算替換為較輕的運算的最佳化。與其在迴圈中每次以乘法求 i * 4,不如從 j = 0 開始,每次重複做 j += 4,乘法就變成了加法。由於 i 一改變值就會跟著改變,所以不能替換為常數。此外,乘以4也可替換為位移指令(i << 2),這也是強度削減的一種。將主體並排4次份的是迴圈展開。

  • A. 值會隨 i 改變,所以不能替換為常數。
  • B. 並排主體的是迴圈展開。
  • C. 正確。將乘法替換為每次重複的加法。
練習這個領域 前往領域頁面

編譯器的其他題目

  1. 上方迴圈難以使用SIMD指令向量化,其主要原因為何?
  2. 在上方函式中,編譯器無法直接進行把 *b 的讀取移到迴圈之外的最佳化,其原因為何?
  3. 在編譯器的暫存器配置中,使用對干涉圖著色(染色)的方法時,圖中的節點與邊所代表的事物,下列組合何者正確?
  4. 在暫存器配置中發生「溢出(spill)」時,所產生的程式碼會變成怎樣?
  5. 編譯器的指令排程,其主要目的為何?

這個領域的比較