2016-07-31 85 views
2

當我們要寫數據項時,包含數據的塊首先被帶入緩存,數據項被寫入緩存。這可能會導致緩存污染。爲了避免這種情況,英特爾沒有推出臨時指令。當mmap()

如果我打算使用mmap()將數據寫入文件並且永遠不會再讀取,是否可以避免爲此創建TLB條目?是否有類似於非暫時指令的指令?

+1

不,我很確定沒有,因爲你不能使用巨大的頁面文件支持的映射。使用'write'的緩衝區大小可能爲1/2 L2高速緩存大小或類似的可能實際上表現更好;你應該測試。 (儘管在將緩衝區複製到頁面緩存時內核概率不會使用NT存儲)。如果通過使用madvise(MAD​​V_DONTNEED)來鼓勵內核在將內容寫入磁盤後將內容從RAM中刪除,那麼文件數據很可能不會被長時間引用,這樣可以避免頁面緩存污染。 –

+2

根據您的訪問模式,pwrite()可能比write()更合適。但是,是的,你一定要測試。另一個建議是儘量確保所有的文件修改都發生在同一個CPU上以減輕污染。當文件未映射時,也不要忘記衡量任何最終TLB擊落的成本。 – Pseudonym

回答

1

TLB條目是CPU需要從虛擬地址映射到物理地址的,因此無法通過mmap()或任何類似的API來避免它們。

即使有可能避免將映射存儲在TLB中,每訪問映射的內存也需要重新加載頁表中的相應條目,因此性能會更差。 非暫時性訪問僅適用於商店,但頁表條目爲請閱讀

+1

你可以想象一個TLB條目的非時間提示,所以也許他們會被趕出去,或者只能呆在L1 TLB中,而不是在從L1 DTLB驅逐時轉移到L2 TLB。這與PREFETCHNTA僅將數據帶入L1中相似,而不會污染較大的L2。對於x86上的TLB條目,沒有任何類似的機制,但這並不是因爲不可能對非時間提示進行加載。 (好處是,TLB條目緩存加載,但不是商店,但)。 –