2016-10-05 79 views
0

我要試圖找出危險廢物,在這裏我需要看錯過多少緩存出現以下嵌套循環全關聯緩存

for i=0; i < 32 ; i++ 
    for j=0; j < 32; j++ 
     sum += arr[i][j]; 

我有一個具有16個高速緩存行的全相聯高速緩存問題,每個緩存行可以存儲32個字。緩存最初是空的,並且arr [0] [0]映射到第一個緩存行

現在根據我的理解,總共會有32個未命中。最初,當請求被創建時,緩存是空的,計算爲未命中,並根據完全關聯的緩存填充所有塊,然後應用LRU。

我這裏有點糊塗,可以使用這裏

+0

如果'arr'是一個普通的多維數組(而不是指針數組或其他東西),那麼你的循環只是對內存塊的一個順序讀取。假設i,j和sum不會泄漏到內存中,緩存關聯性在這裏不會產生差異;即使是直接映射的緩存也會執行相同的操作。 –

+0

是的ARR是多維數組 – RRP

回答

2

一定的指導意義。假設一個整數存儲在一個字。

讓我們開始使用1 st內存訪問即。 arr[0][0]。這將導致一個錯過的義務錯過。這將帶來32個整數到緩存中。 爲了我們的利益,我們將在我們的進一步訪問中訪問這些確切的內存位置。這是從arr[0][0]arr[0][31]

現在當我們訪問arr[1][0]我們正在訪問第33個位置,這不在我們的緩存中。所以這又是一個小姐。

一般而言,對於您訪問的每32個值,您都會錯過一次。請不,這只是對你已經表現出了一種循環:

for i=0; i < 32 ; i++ 
    for j=0; j < 32; j++ 
     sum += arr[i][j]; 

這裏的內存訪問是連續的。更進一步,正如@Peter Cordes在評論中所說的那樣,完全關聯緩存的行爲與您在特定情況下的直接映射緩存完全相同。

+0

這個問題並沒有說整數。它們可以是字號「浮動」,或者其他任何東西。儘管這個問題並不排除雙字「double」,或每字4個「char」,或者(因爲這是C++),但是你假設每個數組元素是一個單詞,帶有重載'operator ++'的大類。 –

+0

@PeterCordes是的。我認爲元素大小是一個字。但我給出的想法足以計算任何大小的數據 – PRP

+0

是的,當然:)我想我主要只是想抱怨一些問題質量。 –