2015-01-14 137 views
0

我們經常聽到將我們的變量與內存中的N字節邊界對齊可以提高性能(通過阻止CPU必須將兩個單獨的單詞加載到緩存中以讀取我們的變量)。另一方面,我們也聽到(較不經常)將大塊內存(數組/緩衝區)與一個很好的二舍五入冪的地址對齊可能是不好的,因爲散列函數分配內存地址以緩存地址不再統一(這稱爲頁面對齊)。內存對齊與頁面對齊

因此,我的問題是,是否存在某種規則或閾值時間點,我們應該故意忽略數據以避免頁面對齊問題;什麼時候不去,以獲得標準內存對齊的好處?

+0

「緩存關聯性」是一個很好的搜索術語。希望你可以用你想要避免的特定事物的更好模型替換你的大腦中的第二段。 – tmyklebu

+0

這肯定與C#,C++或C沒有關係,尤其不是C#。 – abligh

+0

我選擇了這些語言,因爲它們是您通常需要考慮的有關這些問題的語言。是的,我認爲你也是用C#做的。 – Xenoprimate

回答

1

如果性能對您的應用程序來說特別重要,而且您的應用程序通常會對已知數據集(類型和大小)進行迭代,那麼知道並理解MMU,L緩存和緩存行的效果非常重要。不是因爲您可以提前避免這些問題,而是因爲您可能需要在事實後識別它們,同時盯着分析結果,並試圖弄清楚爲什麼某些事情比以前更長,或者「通常應該「。而且 - 如果你很幸運並且數據集足夠在你的控制之內 - 你可以調整一些東西來解決某種CPU緩存性能問題。

不幸的是,大多數應用程序並沒有遍歷已知數據集,並且知道它們的目標硬件類型。這對於遊戲和多媒體應用程序開發以及操作系統工程來說是相當獨特的。對於世界上大多數應用程序的其他應用程序而言,改進某個特定大小的特定數據集的緩存配置文件意味着將其降低爲另一個特定大小。

最後,即使是「將我們的變量與N字節邊界對齊」的「經驗法則」也會受到底層硬件的影響。大多數更新的桌面級x86架構(大部分是在2011年左右製造的)更喜歡打包的數據而不是對齊的數據,因爲加載跨緩存線邊界的單詞的成本比加載更多總緩存線來代表相同數據集要便宜。但在運行ARM的移動設備上?對齊仍然非常關鍵。

更多關鍵字,您可以搜索上,進一步教育:緩存着色高速緩存收回。但是,這一切都非常依賴於目標CPU,不幸的是,很少有(或沒有)概括。

2

我不認爲你可以得到這個通用的規則。它取決於您使用的處理器,即底層系統的MMU和緩存實現。這將因系統而異。因此,如果您想要最佳性能,您需要了解當前系統的所有低級別細節。一般來說,我認爲將大內存塊對齊到2的冪次邊界的好處是有限的。