指令cache 為什麼比數據cache失效率低?

計算機系統結構


因為指令Cache的 locality (局部性) 更好啊。

首先指令內存的訪問順序性比較強。其次比較重要的一點就是,一個程序的大部分的 runtime 都是消耗在循環里的,而循環兼具了temporal locality (每個循環後還會回來) 和 spatial locality (指令都是在這個循環的範圍內的),這對cache的工作機制是非常友好的。而且很多cache還有prefetch機制——在訪問之前就把下一個block 取進來,則更加減少了cache miss的可能。

對數據的訪問,比指令複雜多了。訪問一個比較大的array還好,還算比較有規律。但很多情況下你要處理的是pointer,一個pointer指向哪裡幾乎是不可預測的,尤其是動態分配(在heap里)的情況下,基本是隨機的,談何locality。遇到pointer chasing這種情況 (比如圖的遍歷,很常見吧?)更是一跪到底。。所以miss的概率當然就會大很多。


指令訪問模式更加線性吧。雖然有跳轉,但總的來說是線性的。

數據訪問模式是完全隨機的。


剛開始還真的以為是locality...還以為這兩年飯碗都白吃了....

你認真告訴我write-invalidation coherence protocol那個invalidation是幹什麼的?

還不是為了那些synchronization primitive弄出來的額外的miss...

cold start是有可能的,但是那個說pointer是不可預測的,我反對哦。pointer位置也是機器算出來的,比如int *a;

肯定會有先寫入再讀取的(read after write), 所以你跟我說根本緩存不知道在哪裡.....緩存的prefetch想知道在哪裡就知道在哪裡(就是演算法的複雜度問題嘛),因為機器在寫入內存前一定會先寫入緩存,內存不知道的,緩存不一定不知道。緩存不知道的,內存(還有on-chip MMU)知道個屁....

綜上,data cache miss rate高首先不排除是cold start,但是warm up之後colde start的比率就低很多了,最主要的原因是write-invalidation。最常見的就是各種調用各種multithreading API, kernel critical section write, global function......


推薦閱讀:

TAG:計算機系統 | 緩存 | 計算機監控系統 | 指令 | ARM指令 |