記憶體階層與效能

將上述兩個迴圈合併為一個(迴圈融合,loop fusion)後,當N很大時容易變快,其原因為下列何者?

for (i = 0; i < N; i++) a[i] = b[i] * 2;
for (i = 0; i < N; i++) c[i] = a[i] + 1;
  1. A因為乘法與加法合併成一條指令,計算量減半
  2. B因為寫入a[i]後可立刻使用,不必從主記憶體重新讀取陣列a
  3. C因為迴圈的次數從N次增加為2N次,管線更容易被填滿
查看答案與解析

正確答案:B. 因為寫入a[i]後可立刻使用,不必從主記憶體重新讀取陣列a

若維持為分開的迴圈,當第一個迴圈所寫入的整個a大到快取放不下時,第二個迴圈每次從頭重新讀取都會發生未命中。融合之後,寫入a[i]後在同一次迭代中立刻使用,因此能在資料仍留在快取或暫存器的期間重複使用,減少與主記憶體的傳輸。計算量不變,迴圈的次數則從2N次減少為N次。

  • A. 運算的數量不變,計算量不會減半。
  • B. 正確。寫入後可立刻重複使用,不必重新讀取陣列a。
  • C. 迴圈的次數是從2N次減少為N次。
練習這個領域 前往領域頁面

記憶體階層與效能的其他題目

  1. 在轉置大型矩陣的處理(b[j][i] = a[i][j])中,快取未命中容易增多的理由與代表性對策的組合,下列何者正確?
  2. 在一般電腦的記憶體階層中,越上層(越靠近CPU的一側)越成立的性質,下列何者正確?
  3. 評估快取效能時,不能只看未命中率,而必須以平均記憶體存取時間來比較,其理由下列何者正確?
  4. 讓兩個程式在同一個核心上交替執行時,有時會比各自單獨執行更慢。從快取的角度來看,下列何者是最恰當的說明?
  5. 下列何者最適合作為時間局部性的例子?

這個領域的比較