Cache抖動的實驗

2021-08-14 13:07:13 字數 2548 閱讀 4040

cache抖動的實驗

關於cpu中的cache抖動現象,簡單研究了一下,個人認為cache抖動分為三個階段:無抖動現象階段,劇烈抖動階段和穩定抖動階段。

實驗環境:ubuntu17.04+valgrind模擬器

實驗硬體:cache 64組*4路組相聯*64b每路 

實驗檔案:main.cpp ,**如下:

#include #define column 16

#define row 1000//row的值需要不斷進行改變,從而觀察miss數

int matrix[row][column];

int main()

{ for(int i=0; i主要原理:

1.陣列的每一行恰好對應cache的每一路,以此簡化操作;

2.通過更改row的數量,觀察寫操作過程中的miss數量,從而分析各個階段的特點;

3.(1)無抖動階段:當row<=64*4時,所有資料都能放到cache中,不會發生抖動現象;

(2)劇烈抖動階段:當row>64*4 並且row <=64*4+64時,由於cache的迴圈使用,發生劇烈抖動現象;

第一次cache抖動應當發生在,64組×4路的cache被裝滿之後(column =16,row=256),row增加1(row=257)到row增加64(row=320)之間。

例如:當row增加1時(row=257),訪問第257行時,由於陣列的第0行到第3行已經儲存在cache第0組,將會替換掉第0組的第0路,之後再替換掉第0組第1行、第0組第2行、第0組第3行,進行迴圈。

可見,在訪問第0行、第1行、第2行、第3行和第256行時,會一直出現miss,總共會出現5*16=80次miss。當row=256時,只有256行,只有在訪問第一次的時候miss,剩下的資料訪問都可以hit。

所以,由row=256到row=257時,miss的增加數為5*16-4=76次。

進而,推導出這一階段cache增加的miss數量公式為n=n*(k+1)*i-k*i。

其中n為miss的增加數,n為每一行的元素的數量,k+1為該階段的特徵值,其大小為組內行數k+1,k為組內行數,i為訪問的陣列增加的行數(以i=0作為比較基準,row=256)。

(3)穩定抖動階段:當row>64*4+64時,抖動現象仍然出現,不過趨勢比較平穩;

第二次cache抖動應當發生在,64組的cache都出現第二階段所示的抖動現象(row=320)之後,即row>320時,會出現第二次抖動現象。

例如:當row相對第二階段的臨界值增加1時(row=321),訪問第321行時,由於陣列的第257行、第1行到第3行已經儲存在cache第0組,將會替換掉第0組的第1路,之後再替換掉第0組第2行、第0組第3行,進行迴圈。

可見,在訪問第0組的第0行、第1行、第2行、第3行、第256行和第321行時,會一直出現miss,總共會出現6*16=96次miss。當row=320時,訪問第0組的第0行、第1行、第2行、第3行和第256行,會一直出現miss,總共會出現5*16=80次miss。

所以,由row=320到row=321時,miss的增加數為6*16-5*16=16次。

進而,推導出這一階段cache增加的miss數量公式為n=n*i。

其中n為miss的增加數,n為每一行的元素的數量,i為訪問的陣列增加的行數(以i=0作為比較基準,row=320)。

實驗過程和結果:

(1)無抖動階段:將row依次更改為100,101,102,103,發現miss數隨著row的增加而增加步長為1。

(2)劇烈抖動階段:將row依次更改為256,257,260,320。結果如表所示: 行數

miss數

miss相對增加數

折合公式

16*5*0-4*0

16*5*1-4*1

16*5*4-4*4

16*5*64-4*64

故第二階段,cache的增加數符合n=n*(k+1)*i-k*i的規律。第一階段和第二階段的臨界值為256。

(3)穩定抖動階段:將row依次更改為320,321,330,420,1320。結果如表所示:

行數320

321330

4201320

miss數

7024

7040

7184

8624

23024

miss相對增加數016

1601600

16000

折合公式

16*0

16*1

16*10

16*100

16*1000

故第三階段,cache的增加數符合n=n*i的規律。第二階段和第三階段的臨界值為30。

抖動臨界值:

通過以上實驗,對於本cpu,發現cache抖動的臨界值分別時256和320。

Tips 避免cache中的抖動問題

直接對映快取記憶體中的衝突不命中 confict miss 衝突不命中在程式中很常見,會導致令人疑惑的問題。當訪問大小為2的冪的陣列時,直接對映高速緩衝中通常會發生衝突不命中。考慮以下計算兩個向量點積的函式 float dotdrop float x 8 float y 8 return sum 假...

實驗六 按鍵防抖動實驗

若要使用開發板上面的四個sw按鍵來做計數輸入,就需要知道一共按了幾下按鍵。在這種情況下不能像以前設計電路中,簡單地使用輸入時鐘的上公升沿來檢測按鍵是否按 下。因為,如果分頻以後的時鐘頻率是10hz,按鍵一下按了1 秒鐘,那麼如果簡單地 以時鐘的上公升沿來檢測按鍵,程式就會認為實際一共按了十下按鍵。我...

視窗的簡單抖動

用乙個對話方塊來實現類似qq的視窗抖動。1.建立乙個基於對話方塊的工程 2.在.h檔案中新增兩個成員變數。crect m originrect 儲存當前對話方塊所在的矩形 int m index 對話方塊移動到第幾個位置 3.在對話方塊上建立乙個按鈕,標題為 抖動 id為idc movewindow...