2012-03-28 45 views
0

我知道這是一個家庭作業問題,我不是要求答案。我只想了解這個問題,隨時可以使用其他示例來解釋。使用塊的直接映射緩存

,我需要答案是問題...

Each reference is a read of a 4-byte integer value and is described by the byte 
address of that integer. 

Assuming a 1KB, 16B block, direct-mapped cache, initially empty, fill in whether 
each reference is a hit or a miss. 

我們給出的是4個字節的引用列表。例如0x00000000,0x00000006,...

據我瞭解,有64塊(1024/16),每塊是16字節。當它看到第一個參考時,它會是一個錯過,它會將它帶入緩存。我知道它會引入下一個緩存的引用,因爲每個塊將保存16個字節。這是否意味着,在一個小姐,它會帶來4個參考,因爲每個參考是4個字節?

回答

1

是的,你所瞭解的是正確的。當從存儲器中讀取一個字節時,時間局部性表明接下來的幾個字節也隨後被讀取。所以緩存通常具有多於1個引用的塊大小,在這種情況下是4個引用。在下一次內存訪問期間,如果處理器請求下一次引用,則它已經存在於高速緩存中!

存儲器地址可以分爲兩部分:塊地址和塊偏移量。塊偏移將用於在高速緩存的相同塊上的這些引用之間進行選擇。另一部分,塊地址又分爲標籤和索引字段。索引字段用於選擇要訪問的集合(在直接映射緩存的情況下,每個緩存塊爲1集)。標記字段從集合內選擇高速緩存塊。

1

@shailesh是對的,但要注意這個詞,請參考參考模式取決於程序。想象一下,我們編寫一個C程序,以16Byte的步幅引用一個char數組。這裏是一個愚蠢的程序,將基本上是做:

void foo (char * x, int MAX) { 
    int i; 
    char a; 

    for (i = 0; i < MAX; i += 16) 
      a = x[i]; 
} 

假設x在地址0x00000000。然後該循環將參考地址 0x00000000,0x00000010,0x00000020,0x00000030等等。在這種情況下,在第一次參考x[0],x[0]x[15]之後,由於16B塊的大小,將被帶入緩存。但是下一個參考,這是x[16]還沒有。換句話說,對於這裏的緩存,在這個循環中的引用將導致緩存未命中。

您會發現,在優化性能時,考慮機器的緩存組織和行爲將有助於避免像這樣的糟糕內存訪問模式。