緩存抖動

《深入理解計算機系統(tǒng)》P431

沖突不命中在真實的程序中很常見,會導(dǎo)致令人困惑的性能問題。當程序訪問大小為2的冪的數(shù)組時,直接映射高速緩存中通常會發(fā)生沖突不命中。例如,考慮一個計算兩個向量點積的函數(shù):

對于 x 和 y 來說,這個函數(shù)有良好的空間局部性,因此我們期望它的命中率會比較高。不幸的是,并不總是如此。假設(shè)浮點數(shù)是4個字節(jié),×被加載到從地址0開始的32字節(jié)連續(xù)內(nèi)存中,而 y 緊跟在 x 之后,從地址32開始。為了簡便,假設(shè)一個塊是16個字節(jié)(足夠容納4個浮點數(shù)),高速緩存由兩個組組成,高速緩存的整個大小為32字節(jié)。我們會假設(shè)變量 sum 實際上存放在一個 CPU 寄存器中,因此不需要內(nèi)存引用。根據(jù)這些假設(shè)每個 x[i]和 y[i]會映射到相同的高速緩存組:

在運行時,循環(huán)的第一次迭代引用 x[0],緩存不命中會導(dǎo)致包含 x[0] ~ x[3]的塊被加載到組0。接下來是對 y[0]的引用,又一次緩存不命中,導(dǎo)致包含 y[O]~ y[3]的塊被復(fù)制到組0,覆蓋前一次引用復(fù)制進來的 x 的值。在下一次迭代中,對 x[1]的引用不命中,導(dǎo)致 x[O] ~ x[3]的塊被加載回組0,覆蓋掉 y[0]~ y[3]的塊。因而現(xiàn)在我們就有了一個沖突不命中,而且實際上后面每次對×和 y 的引用都會導(dǎo)致沖突不命中,因為我們在 x 和 y 的塊之間抖動( thrash )。術(shù)語“抖動”描述的是這樣一種情況,即高速緩存反復(fù)地加載和驅(qū)逐相同的高速緩存塊的組。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容