記憶體階層與效能

以上述方式走訪C語言的二維陣列a[i][j]時,若內層迴圈使用j,會比內層使用i更容易變快。其原因為下列何者?

for (i = 0; i < N; i++)
    for (j = 0; j < N; j++)
        sum += a[i][j];
  1. A因為是以列為主(row-major)儲存,會依序讀取連續的位址,能有效利用快取行
  2. B因為編譯器會將迴圈中的加法合併消除,在執行時連計算本身都省略掉
  3. C因為內層使用j時完全不會參照TLB,不再需要將虛擬位址轉換為實體位址
查看答案與解析

正確答案:A. 因為是以列為主(row-major)儲存,會依序讀取連續的位址,能有效利用快取行

C語言的二維陣列以列為主(row-major)儲存,a[i][0]、a[i][1]……在記憶體上彼此相鄰。內層使用j時會依序讀取連續的位址,因此一次未命中所載入的64位元組快取行,其餘部分也會馬上被用到。內層使用i時,則會每次跳過一整列的距離、零散地讀取位址,在只用到快取行極小一部分時就容易被逐出。TLB仍會持續使用,並非不再需要位址轉換。

  • A. 正確。因為讀取連續的位址,所載入的整條快取行都能用上。
  • B. 加法不會被省略,無論哪種順序都進行相同的計算。
  • C. TLB仍會繼續使用,位址轉換也照常進行。
練習這個領域 前往領域頁面

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

  1. 位址為32位元、容量32 KB、快取行大小64位元組的直接映射(direct-mapped)快取,其標籤(tag)為幾位元?
  2. 位址為32位元、容量32 KB、快取行大小64位元組的4路組相聯(set-associative)快取,其組數為多少?
  3. 在全相聯(fully associative)快取中,位址之中用於索引(選擇組的部分)的位元數為下列何者?
  4. L1快取的命中時間為1 ns、未命中率為5%,L2快取的命中時間為10 ns、L2的區域未命中率為20%,主記憶體的存取時間為100 ns時,平均記憶體存取時間為多少?
  5. 在直接映射快取中,兩個陣列的元素對應到快取的同一個位置,每次交替存取時就互相把對方逐出。這種未命中屬於哪一類?

這個領域的比較