我讀到了C++中關於緩存優化的內容以及現代CPU用於預測下一步需要什麼數據的機制,並將其複製到緩存中。但是,對於程序員來說,C++中有沒有直接的方法,他們知道接下來需要什麼,以確定哪些數據被複制到CPU緩存中?我可以控制在C++中複製到CPU緩存中的內容嗎?
2
A
回答
6
這與您使用的處理器和編譯器有所不同。
假設您使用的是Intel x86/x64或兼容(例如AMD)處理器,處理器會提供大量預取指令,大多數編譯器都包含內核來調用它們。使用VC++,您可以使用_m_prefetch
或_m_prefetchw
。有了gcc,你可以使用__builtin_prefetch
。同樣,ARM上的VC++提供了一個__prefetch
內在的用於同一目的(不,我真的不知道他們爲什麼不能使用與x86上相同的名稱;簽名和效果看起來完全相同)。
大多數其他合理的現代,高端的處理器可能提供類似的指令,並 我猜大多數編譯器提供內在函數來使它們可用,但就像這些,內部函數的名稱會有所不同。對於這個問題,儘管這些函數是編譯器固有的,但大多數需要包含一些頭來使用它們 - 頭的名稱也會有所不同。
1
Jerry提供的預取內在函數可以做到這一點。請記住,該函數的參數控制了多種風格,確定哪些級別的緩存(如果有)將用於保留該行。例如prefetch_NTA不會污染高速緩存,而是提供僅供立即使用的線路(並且在您要立即使用並且只使用一次的情況下使用)
另外請記住,這些說明基本上是對CPU(它本身也很好地猜測要預取哪些行)。因此,他們是而不是保證工作,他們可能在許多情況下失敗(如果內存子系統被加載,或地址交換出內存)。
相關問題
- 1. /dev/shm中的內存可以緩存在CPU緩存中嗎?
- 2. 我可以根據iframe中的內容來控制頁面嗎?
- 3. c#MailMessage:我可以控制回覆中的文本嗎?
- 4. ASP.Net緩存可以在MVC控制器中使用嗎?
- 5. 開發人員可以在什麼程度上控制緩存中的內容?
- 6. 我可以強制Universal Image Loader僅在內部緩存嗎?
- 7. 是否可以控制CPU內核?
- 8. 我可以依靠ETags進行緩存控制嗎
- 9. 我們可以將「普通」GPU內存複製到「統一」內存嗎?
- 10. 解決嵌套在重複節內容控制中的個別內容控制
- 11. 我可以保存控制檯窗口的緩衝區或內容以備將來使用嗎?
- 12. 我可以從NSString複製到NSMutableString嗎?
- 13. 我可以強制NSURLConnection從緩存中加載嗎?
- 14. 從C#中控制IIS7的緩存#
- 15. 在c/C++中的CPU緩存中分配靜態內存:是否有可能?
- 16. 我可以在Java中製作多個圖形控制檯嗎?
- 17. 在SharePoint中,我可以控制用戶在頁面上以編程方式看到的內容嗎?
- 18. Tomcat中的緩存控制
- 19. JSF中的緩存控制
- 20. 可以在控制器內使用$控制器嗎?
- 21. 在TSQL中複製內容
- 22. 控制緩存中文件的到期
- 23. 緩存控制C#ASP.NET
- 24. 我可以在vim中的塊註釋中抽出(複製)嗎?
- 25. 將內容控件中的圖片複製到不同的內容控件
- 26. 在我的Chrome擴展中報告了不可緩存的內容,如何製作「可緩存」?
- 27. 根據數據庫中存在的內容控制可見
- 28. 我可以從C#控制檯窗口獲得複製/粘貼功能嗎?
- 29. OpenGL ES可以渲染到CPU內存中嗎?
- 30. 我可以在控制器內知道當前的URL嗎?
_access_將被複制到緩存中。現在,調整會做一點,valgrind cachegrind來完成剩下的工作。 (沒有,沒有直接的控制,即使有,沒有理智的操作系統會暴露:)) – sehe
@sehe有處理器顯式控制;想起AltiVec。您可以定義一個輸入流,作爲預取器的強大粘性提示。但是如果OP沒有提及他的編程的話,最好不要進入這個。 – Potatoswatter