編譯器

上方迴圈難以使用SIMD指令向量化,其主要原因為何?

for (i = 1; i < n; i++)
    a[i] = a[i - 1] + b[i];
  1. A因為需要前一次重複的結果 a[i-1],無法同時計算
  2. B因為陣列元素的型別是整數,所以SIMD指令無法計算
  3. C因為若迴圈次數 n 在編譯時未知,就完全無法向量化
查看答案與解析

正確答案:A. 因為需要前一次重複的結果 a[i-1],無法同時計算

向量化是以一條SIMD指令同時進行例如4個元素的計算。在這個迴圈中,求 a[i] 需要前一個 a[i-1] 的結果,因此無法同時計算 a[1]~a[4]。像這樣橫跨重複的相依(迴圈攜帶相依)存在時,就無法直接向量化。整數也可以用SIMD計算,次數在執行時才決定的情況,也可以另外處理餘數部分來進行向量化。

  • A. 正確。因為相依於前一個結果,所以無法同時計算。
  • B. 整數的計算也可以用SIMD指令進行。
  • C. 即使次數在執行時才決定,只要另外處理餘數,仍可向量化。
練習這個領域 前往領域頁面

編譯器的其他題目

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

這個領域的比較