[英]Memory Alignment vs Page Alignment
我們經常聽到將變量與內存中的N字節邊界對齊可以提高性能(通過防止CPU不得不將兩個單獨的“字”加載到緩存中來讀取變量)。
另一方面,我們還(很少)聽到將大塊內存(數組/緩沖區)與一個不錯的,2的整數次冪地址對齊可能是不好的,因為將內存地址分配給緩存地址的哈希函數是不再統一(這稱為頁面對齊)。
因此,我的問題是,關於何時應故意錯位數據以避免頁面對齊的問題是否存在某種規則或閾值點; 何時不使用,以獲得標准內存對齊的好處?
我認為您無法為此獲得一般規則。 這取決於您使用的處理器,即基礎系統的MMU和緩存實現。 這將因系統而異。 因此,如果要獲得最佳性能,則需要了解當前系統的所有底層細節。 通常,我希望將大內存塊對齊到2的冪的邊界的好處是有限的。
如果性能對於您的應用程序來說至關重要,並且您的應用程序通常在已知數據集(類型和大小)上進行迭代,那么了解和理解MMU,L緩存和緩存行的影響就很重要。 這不是因為您確實可以提前避免這些問題,而是因為您可能需要事后找出它們,同時盯着分析結果,並想弄清楚為什么事情花的時間比以前更長,或者“通常應該”。 而且-如果您很幸運,並且數據集在您的控制范圍內,則可以進行調整以解決某種CPU緩存性能問題。
不幸的是,大多數應用程序並不具有遍歷已知數據集並知道其目標硬件類型的奢侈性。 這是游戲和多媒體應用程序開發以及操作系統工程所獨有的。 對於世界上大多數其他應用程序,改善某個特定大小的特定數據集的緩存配置文件意味着減少另一個特定數據集的緩存配置文件。
最后,即使有關“將變量對齊到N字節邊界”的“經驗法則”也受底層硬件的約束。 大多數較新的台式機級x86架構(大多數在2011年左右之后制造)更喜歡打包數據而不是對齊數據,因為加載跨緩存行邊界打包的單詞的成本比必須加載更多總緩存行來表示同一數據集要便宜。 但是在運行ARM的移動設備上? 對齊仍然很關鍵。
您可以搜索更多關鍵字以進行進一步教育: 緩存顏色和緩存逐出 。 但是同樣,這都非常依賴於目標CPU,不幸的是很少有(或沒有)概括。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.