Tips 避免cache中的抖動問題

2021-07-09 01:52:57 字數 816 閱讀 4877

直接對映快取記憶體中的衝突不命中(confict miss):

衝突不命中在程式中很常見,會導致令人疑惑的問題。當訪問大小為2的冪的陣列時,直接對映高速緩衝中通常會發生衝突不命中。考慮以下計算兩個向量點積的函式:

float dotdrop(float x[8], float y[8])

return sum;

}

假設float是4個位元組,乙個塊是16位元組(容納4個浮點數),快取記憶體有兩個組,快取記憶體的大小為32位元組。根據這些假設,x[i]和y[i]會被對映到相同的快取記憶體組:

抖動(thrash)如下:

執行時,迴圈第一次迭代引用x[0],快取不命中導致x[0]~x[3]的塊被載入到組0。接下來呼叫y[0]時,又一次不命中,導致y[0]~y[3]的塊被拷貝至組0,覆蓋了x[0]~x[3]。在之後對x[1]、y[1]等的呼叫都會導致衝突不命中,我們就在x和y的塊之間抖動,即快取記憶體反覆地載入和驅動快取記憶體塊相同的組。

解決辦法如下:在沒個陣列的結尾放b位元組的填充,在以上**中,不是將x定義為float x[8],而是float x[12]。可以得到以下從陣列元素到組的對映:

對x結尾加了填充,從而將x[i]和y[i]對映到了不同的組,消除抖動。

Cache抖動的實驗

cache抖動的實驗 關於cpu中的cache抖動現象,簡單研究了一下,個人認為cache抖動分為三個階段 無抖動現象階段,劇烈抖動階段和穩定抖動階段。實驗環境 ubuntu17.04 valgrind模擬器 實驗硬體 cache 64組 4路組相聯 64b每路 實驗檔案 main.cpp 如下 i...

記憶體中的cache

在linux的記憶體管理中,這裡的buffer指linux記憶體的 buffer cache。這裡的cache指linux記憶體中的 page cache。翻譯成中文可以叫做緩衝區快取和頁面快取。什麼是page cache?page cache主要用來作為檔案系統上的檔案資料的快取來用,尤其是針對當...

Python程式設計中的幾個tips

1.在大數字中使用下劃線,增強 可讀性 普通 num1 100000000000 num2 100000000 res num1 num2 print res 使用下劃線 適用於python3以上 num1 1000 0000 0000 num2 1 0000 0000 res num1 num2 ...