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...