編譯器

在上方迴圈中,哪個計算會成為迴圈不變運算式搬移(搬到迴圈外)的對象?(假設 x、y 在迴圈內不會被更動)

for (i = 0; i < n; i++)
    a[i] = b[i] * (x * y);
  1. Ab[i] * (x * y) 整體
  2. Bx * y
  3. C對 a[i] 的指派
查看答案與解析

正確答案:B. x * y

迴圈不變運算式搬移是一種最佳化,會把每次重複都得到相同值的計算移到迴圈之前,只計算一次。x 與 y 在迴圈中不會改變,因此 x * y 在每次重複中都是相同的值,可以在迴圈前計算 t = x * y,再寫成 a[i] = b[i] * t。b[i] 隨 i 而有不同的值,所以 b[i] * (x * y) 整體無法搬移。對 a[i] 的指派每次重複都是寫入不同的元素,所以留在迴圈內。

  • A. b[i] 每次重複都會改變,所以整體無法搬移。
  • B. 正確。x * y 在每次重複中都是相同的值。
  • C. 每個元素都需要指派,所以留在迴圈內。
練習這個領域 前往領域頁面

編譯器的其他題目

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

這個領域的比較