記憶體階層練習題 (Practice - Memory Hierarchy)


Question 1 - SRAM vs DRAM [recall]

你的同事宣稱:「SRAM 與 DRAM 都是 volatile,所以兩者都需要週期性 refresh。」
請指出這句話對錯,並比較兩者的 cell 結構、相對速度、相對成本與典型用途。


Question 2 - DRAM RAS/CAS 讀取 [recall]

Memory controller 要從一顆 conventional DRAM 讀出 supercell (2, 1)。
請依序說明兩步驟定址流程,並解釋 DRAM 為何採二維陣列組織、其代價為何。


Question 3 - Nonvolatile Memory 分類 [recall]

PROM、EPROM、EEPROM 三種 ROM 的差異在於「可重寫次數」與「重寫機制」。
請分別說明,並解釋 firmware 一詞的意義與 flash memory 的定位。


Question 4 - 磁碟存取時間計算 [application]

一顆磁碟轉速 7,200 RPM、T_avg seek = 9 ms、平均每 track 有 400 個 sector。
請計算讀取一個 sector 的平均存取時間 T_access,並指出哪些成分主宰整體時間。


Question 5 - SSD 讀寫特性 [recall]

SSD 以 page 與 block 組織 flash memory。
請說明讀寫與 erase 的單位分別是什麼,以及隨機寫入比讀取慢的兩個原因。


Question 6 - 區域性辨識 [recall]

以下函式循序加總向量:

int sumvec(int v[N]) {
    int i, sum = 0;
    for (i = 0; i < N; i++)
        sum += v[i];
    return sum;
}

請分別分析 sumv[i] 各具有哪種 locality,並判斷整體區域性好壞。


Question 7 - 迴圈重排求 stride-1 [application]

三維陣列走訪(改編自 Practice 6.7):

int productarray3d(int a[N][N][N]) {
    int i, j, k, product = 1;
    /* 迴圈順序待定 */
    product *= a[j][k][i];
    return product;
}

C 為 row-major。請給出使空間區域性最佳的三層迴圈排列,並說明判斷原則。


Question 8 - Miss 三分類 [recall]

請為以下三種情境各標上正確的 cache miss 類型並說明成因:
(a) 剛開機、cache 全空,第一次存取任何資料必 miss;
(b) cache 容量明明裝得下,但交替存取 block 0 與 block 8(皆映到同一位置)每次都 miss;
(c) 迴圈的 working set 大於 cache 總容量。


Question 9 - 快取參數計算 [application]

一個快取:m = 32 位元位址、C = 32 KB、B = 64 bytes、E = 8(8-way set associative)。
請求出 S、b、s、t,並說明 C 的計算是否包含 tag bits 與 valid bit。


Question 10 - Direct-mapped 位址判讀 [application]

Direct-mapped cache:(S, E, B, m) = (4, 1, 2, 4),初始所有 valid bit = 0。
CPU 依序讀取位址 0、1、13、8、0。請切割位址欄位,逐步判斷各次存取是 hit 或 miss,並說明第 5 次存取的 miss 屬於哪一類。


Question 11 - 寫入策略 [recall]

快取寫入有兩個獨立決策點:write hit 時與 write miss 時。
請說明 write-through / write-back 與 write-allocate / no-write-allocate 的作法、典型配對,以及程式設計者應假設哪種模型、為什麼。


Question 12 - Fully Associative 與 TLB [recall]

某快取的位址欄位只有 tag 與 block offset,完全沒有 set index。
這是哪種快取組織?為何它只適合小型快取?請舉一個實際應用。


Question 13 - Thrashing 分析與修復 [analysis]

快取:direct-mapped、C = 32 bytes、B = 16 bytes(2 sets)。float x[8] 從位址 0 起、float y[8] 緊接於位址 32 起連續放置:

float dotprod(float x[8], float y[8]) {
    float sum = 0.0;
    for (int i = 0; i < 8; i++)
        sum += x[i] * y[i];
    return sum;
}

此程式空間區域性良好,實測卻每次引用都 miss。請解釋原因、指出 miss 類型,並提出不改變演算法的修復方法。


Question 14 - 矩陣乘法迴圈順序 [analysis]

n×n double 矩陣乘法 C = AB 的三重迴圈有 6 種排列,總浮點運算量相同。假設 B = 32 bytes(裝 4 個 double)、n 大到一列塞不進 L1、區域變數放暫存器。
已知三等價類每迭代的統計:class AB (ijk/jik) 2 loads、1.25 misses;class AC (jki/kji) 3 memory ops、2.00 misses;class BC (kij/ikj) 3 memory ops、0.50 misses。
請排序三類的效能、指出哪個指標更能預測效能,並解釋大 n 時 class BC 效能為何不隨 n 惡化。


Question 15 - Memory Mountain 結構 [recall]

Memory mountain 把 read throughput(n/s,MB/s)畫成 size 與 stride 的二維函數。
請說明兩個軸各對應哪種 locality、垂直 size 軸的四條稜線代表什麼,以及「時間區域性差時空間區域性仍能救援」的證據。