我想爲C/C++中的數組動態分配一個內存塊,並且這個數組將以高頻率訪問。所以我希望這個陣列在芯片上保持,即,在緩存中。我怎樣才能明確地用C/C++中的代碼來做到這一點?如何分配內存塊並將其放入緩存?
回答
沒有標準的C++語言功能可以讓你做到這一點。
根據您的編譯器和CPU,你可以在一個彙編塊使用一個特定的頭號CPU指令:
T* p = new T(...);
size_t n = sizeof(T);
asm {
"CACHE n bytes at address p"
}
...或一些內置的編譯器功能(「內在」),做這個。
您需要查閱您的CPU手冊和/或編譯器手冊。
例如,x86 CPU有一組以PREFETCH
開頭的指令。
而另一個例子,GCC有一個叫__builtin_prefetch
的功能。見GCC Data Prefetch Support
尼斯,我不知道這個內置的功能:)現在我很想使用它;) – Caladan 2013-04-21 15:28:58
你可能是對的,但有可能在OP是在支持鎖定下來或者一些線條或環境中工作所有的緩存。 – 2013-04-21 15:30:14
@CarlNorum:我同意,這只是我以爲他的意思是隻有C++或C – 2013-04-21 15:31:26
這取決於你的架構。例如,在某些ARM CPU上,「緩存」處於手動控制之下,您可以使用修改過的'new'操作符專門爲其分配/釋放內存。 'T * t = new(fastmem)T();' – 2013-04-21 15:42:38
首先,您必須知道要運行代碼的機器的體系結構。那麼你應該檢查它是否有一條指令來做這種事情。
實際上,大量使用內存會強制緩存控制器將此區域放入緩存中。
而且還有優化的三個規則,你可能需要先了解他們:) http://c2.com/cgi/wiki?RulesOfOptimization
我會盡量回答有點不同的角度來問。你真的需要這樣做嗎?即使這是一種方式,它會值得嗎?想象一下,有一個「魔術」void * malloc_and_lock_in_cache(int cacheLevel)函數。你將如何處理這些數據。如果它是一個應用程序,只限於while(1)從單線程隨機數組訪問的循環,則由於優化和CPU體系結構,無論如何你都會有這樣的行爲。如果你考慮更多的真實世界的解決方案,你總是有關於訪問的邏輯。例如鎖定多線程,某些條件等等。問題 - 其餘的應用程序算法是否如此完美,只剩下要做的就是在緩存中分配數組。
是否所有其他的訪問/排序/查找功能都是先進的邏輯,不能被審查,而是獲得非常有限的性能反彈,試圖覆蓋CPU優化。
你也考慮在原始硬件上運行沒有任何操作系統的應用程序,所以你不應該關心你的分配將如何影響操作系統的行爲,其餘的應用程序運行?
如果您的應用程序將在虛擬機或XEN等環境中運行,會發生什麼?
我記得15-18年前的一篇相似的熱門話題,關於物理內存使用和磁盤緩存實用程序。確實像MS-DOS smartdrive或類似的工具這樣的工具是非常有用的,並加速了很多事情。 Usenet充滿了「調優建議」和性能分析,例如直寫/回寫設置。
尤其是如果你的DOS應用程序正在處理大量數據並實現了一些內存交換邏輯(我正在談論時間,那麼4MB內存就是奢侈品),這大部分都是戲劇,從一個角度來看,你需要儘可能多的內存你可以,但是從另一個角度來看,你需要換,所以你實際上需要交換,但交換經歷高速緩存等。
但接下來發生的事。我們擁有VM386模式,集成到操作系統中的磁盤緩存/內存交換,以及誰在關注調整smartdrive/ramdisk等內容。總的來說,分配儘可能多的虛擬機然後實現自己的voodoo算法來交換物理內存塊(雖然這個功能仍然在WinAPI中)。
所以,我真的建議專注於算法和應用程序的設計工作而不是嘗試,直到你不開發一些新的微內核操作系統使用一些非常低的水平與特點真的不可預知的結果。
- 1. 如何使用Hadoop分佈式緩存將文件放入內存?
- 2. 如何將R對象放入手動分配的內存中?
- 3. 刪除Telerik緩存並釋放內存
- 4. 如何分配內存以及如何釋放內存?
- 5. 緩衝區內存分配
- 6. Ç - 內存分配和釋放內存
- 7. 內存分配和釋放內存
- 8. Netty如何直接分配和釋放緩衝區內存?
- 9. 如何將cacheItemUpdateCallBack分配給緩存
- 10. 如何釋放Swingworker分配的內存?
- 11. 將緩存注入模塊
- 12. 重分配內存塊
- 13. 內存分配和釋放
- 14. 釋放分配的內存
- 15. 分配和釋放內存
- 16. 內存分配釋放
- 17. C - 如何釋放在其他函數中分配的內存?
- 18. Air Native擴展:如何分配ByteArray並管理其內存?
- 19. 如何存儲常量表並將其緩存在rails中?
- 20. 如何保存輸入值並將值存入其他輸入?
- 21. Struts2 fileInputStream /讀取文件並將其放入內存
- 22. 如何將記錄寫入內存並將其恢復爲VHDL?
- 23. 進程從內核分配內存塊
- 24. 分佈式緩存系統及其如何分配數據
- 25. NSMutableData如何分配內存?
- 26. javascript如何分配內存?
- 27. hadoop寫入文件並放入分佈式緩存
- 28. 分配/釋放內存內循環
- 29. 內存釋放後,如何將Windows 7分頁內存換回內存?
- 30. 如何將分配的內存分解爲多個區域並分配進程?
什麼環境? C和C++在他們的標準形式中並沒有真正的緩存意識。 – 2013-04-21 15:20:31
你必須確定你的硬件和O/S,而任何機制將完全O/S特定的,你可能做不到在L1或L2高速緩存,你可能就不會想要麼。如果內存真正在高頻率使用,那麼它將被頻繁使用保存在緩存中。如果它沒有足夠頻繁地用於緩存,那麼如果你設法找到一種方法來顛覆緩存,那麼你會傷害系統的整體性能。 – 2013-04-21 15:21:38