天天看點

《現代體系結構上的UNIX系統:核心程式員的對稱多處理和緩存技術(修訂版)》——2.11 高速緩存的性能

本節書摘來自異步社群《現代體系結構上的unix系統:核心程式員的對稱多處理和緩存技術(修訂版)》一書中的第2章,第2.11節,作者:【美】curt schimmel著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

雖然全面讨論高速緩存的性能超出了本書的範圍,但還是可以做以下一些觀察。首先,高速緩存的性能不僅取決于高速緩存的設計,而且取決于應用程式的引用模式。是以,必須謹慎地通過測試基準程式來判定高速緩存的性能以及一般化測試結果。雖然很容易編寫一個獲得100%命中率的基準程式,但是把它們運用到實際應用中的時候,這樣的結果是毫無意義的。例如,下面的程式會獲得100%的高速緩存命中率:

循環執行一次之後,所有的指令引用都會在高速緩存中命中。相反,下面的代碼片段給一個數組中的每個元素都乘以常數c,因而會得到相當低的高速緩存命中率(假定數組要比高速緩存大)。

因為在c語言中,數組是按行來儲存的,在使用高速緩存的時候,如果數組中一行的大小超過了高速緩存行的長度(假定一開始數組沒有被高速緩存),那麼每次執行最裡面的語句就會出現一次缺失。這樣的情形尤其糟糕,因為行很長的高速緩存會讀取大量從來都不會用到的資料。互換兩層for循環會因為空間局部性而提高性能。即使每個元素隻讀取一次,高速緩存每次都要讀取整整一行的事實也意味着引用連續的元素可能會産生一次命中。例外的情況是那些行很小的高速緩存,像mips r2000/r3000,它們的每個高速緩存行隻有4位元組。如果數組matrix的每個元素也是4位元組,那麼就沒有空間局部性的好處了。

即使高速緩存的性能是依賴于應用的,在直覺上還是可以有下面的結論(雖然對于所有應用來說,它們并不一定都對,但是對于包括典型unix指令在内的許多應用來說,它們都是正确的)。首先,寫回政策比寫直通政策更可取,因為程式一般會因為時間局部性而多次修改變量。即使它們沒有多次修改變量,寫回高速緩存機制也往往不會增加任何性能開銷,因為寫直通一行或者在以後替換行的時候再寫回都要花費一個存儲器周期。為每一行維護一個修改位并處理寫回雖然增加了複雜性,但這樣做是值得的。在最差的情況下,沒有時間或者空間局部性可言,有寫配置設定能力的寫回政策隻會多讀一次高速緩存行。完全沒有局部性的情形是非常少見的,是以它們不會對性能造成明顯的影響。

接下來,增加組的大小一般也會有幫助。對于小規模的高速緩存(1 kb或者更小)來說這樣的做法特别有用,因為即便多個位址産生了相同的索引,它也能利用更多的高速緩存。對于非常大的高速緩存(1 mb或者更多)來說,增加組的大小就沒那麼重要了,因為随着行數的增加,出現一段資料替換現有的高速緩存資料的可能性也逐漸減小。

由于空間局部性,增加高速緩存行的大小一般也會對高速緩存性能有幫助。高速緩存行太長的缺點是在缺失處理期間讀取資料需要開銷。在小規模高速緩存的組織結構中找不到很長的高速緩存行,因為這就意味着高速緩存中的行數會更少。是以出現替換的頻率就更高了。

高速緩存的性能也會受到作業系統的影響。不同的高速緩存組織結構需要不同情況的沖洗機制。有若幹種技術可以用來減少必須發生的沖洗量。這很重要,因為頻繁的沖洗很花時間,并且減少了有用的資料被高速緩存的時間。

繼續閱讀