記憶體階層與效能
將上述兩個迴圈合併為一個(迴圈融合,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;
- A因為乘法與加法合併成一條指令,計算量減半
- B因為寫入a[i]後可立刻使用,不必從主記憶體重新讀取陣列a
- C因為迴圈的次數從N次增加為2N次,管線更容易被填滿
查看答案與解析
正確答案:B. 因為寫入a[i]後可立刻使用,不必從主記憶體重新讀取陣列a
若維持為分開的迴圈,當第一個迴圈所寫入的整個a大到快取放不下時,第二個迴圈每次從頭重新讀取都會發生未命中。融合之後,寫入a[i]後在同一次迭代中立刻使用,因此能在資料仍留在快取或暫存器的期間重複使用,減少與主記憶體的傳輸。計算量不變,迴圈的次數則從2N次減少為N次。
- A. 運算的數量不變,計算量不會減半。
- B. 正確。寫入後可立刻重複使用,不必重新讀取陣列a。
- C. 迴圈的次數是從2N次減少為N次。