我們知道內存層次結構中存在多個級別, 緩存,主存儲和輔助存儲。 我們可以使用c程序在內存層次結構中的特定塊中選擇性地存儲變量嗎?如何使用C選擇性地將變量存儲在內存段中?
回答
在其他答案閱讀您的意見,我想補充一些東西。
在操作系統內部,您不能限制變量將被存儲在哪個內存層級中,因爲控制金屬的人是操作系統,它會強制您按其規則進行操作。儘管如此,你可以做一些事情,讓你接近測試緩存中的訪問時間(主要是L1,取決於你的測試算法)和RAM內存。
測試緩存訪問:預熱訪問變量的幾次。他們訪問很多次相同的變量(緩存超快,你需要大量的訪問來衡量訪問時間)。
要測試主內存(又名RAM):禁用BIOS中的高速緩存並運行您的代碼。
要測試輔助內存(又稱磁盤):禁用給定文件的磁盤緩存(您可以詢問您的操作系統,只是谷歌關於它),並開始從磁盤讀取一些數據,總是從相同的位置。這可能會或可能不會工作,具體取決於您的操作系統將允許您禁用磁盤緩存(谷歌有關)。
要測試其他級別的內存,您必須實現您自己的「測試操作系統」,即使由於硬件限制也可能無法禁用某些緩存機制(當然,實際上並沒有限制...) 。
希望我幫了忙。
不是。緩存旨在透明地工作。幾乎你所做的任何事情都會在緩存中結束,因爲它目前正在運行。
至於二級存儲,我假設你的意思是硬盤,文件,雲等。除非明確地這樣做,或者設置內存映射區域,或者將某些內容分頁到磁盤,否則真的永遠不會被存儲。
那麼,我想計算存儲在不同部分內存中的變量的訪問時間..是否有間接的方式來做到這一點? –
不。一般的計算機程序只能訪問主存儲器。即使是輔助存儲(磁盤)通常也只能通過操作系統服務使用,通常通過庫的stdio部分使用。基本上沒有直接的方法來檢查或控制更接近CPU的分層緩存。
也就是說,有一些緩存分析器(如Valgrind的massif
工具)可以讓您瞭解您的程序如何使用給定類型的緩存架構(以及推測性執行),以及哪些可以幫助您您發現緩存性能較差的代碼路徑。他們主要通過模擬硬件。
也可能有一些體系結構特定的指令,可以讓您對緩存(例如x86上的「非時間提示」或「預取」指令)進行一些控制,但這些指令很少見,也不常見,並且通常不會暴露給C程序碼。
那麼,我想計算存儲在不同部分內存中的變量的訪問時間..是否有間接的方式來做到這一點? –
不是我的知識。你也許可以製作一個算法的兩個版本,並且其中一個會積極地污染緩存,看看它是否有明顯的不同。 –
是的,我想這樣做..但是C編譯器限制了數組的大小,我無法填充該緩存因爲 –
它取決於您使用的特定體系結構和編譯器。
例如,在x86/x64上,大多數編譯器都有各種級別的預取指令,暗示CPU高速緩存行應該從DRAM移動到高速緩存中的特定級別訂單緩存 - 例如從L3到L2)。
對一些 CPU,非時間預取指令可用於與非暫時讀取指令相結合時,允許您繞過緩存並直接讀入寄存器。 (有些CPU通過強制數據達到高速緩存的特定方式來實現非臨時性;因此您必須閱讀文檔)。
一般來說,在L1和L2(或L3,或L4或DRAM)之間,它有點黑洞。你不能專門存儲一個值 - 其中一些緩存是相互包含的(所以如果一個值在L1中,它也在L2和L3中),有些不是。高速緩存設計爲週期性地消耗 - 所以如果寫入L1,最終會逐步向L2,然後是L3,然後是DRAM - 特別是在具有強存儲器模型的多核架構中。
您可以在寫入時完全忽略它們(使用流式存儲或將內存標記爲寫入組合)。
您可以通過測量不同的訪問時間:
- 使用內存映射文件作爲後備存儲的數據(這將衡量首次訪問時間到達CPU - 只是把它包在定時器調用中,例如QueryPerformanceCounter或__rdtscp)。確保在每次測試之間取消映射並關閉內存中的文件,並關閉所有緩存。這將需要一段時間。
- 刷新訪問之間的高速緩存以獲取從DRAM訪問的時間。
測量不同高速緩存級別之間的差異比較困難,但是如果您的體系結構支持它,您可以預取高速緩存級別,循環一段時間,然後嘗試它。
在使用商業操作系統的系統上很難做到這一點,因爲他們往往會做很多工作,這會干擾您的測量。
- 1. 如何將bool類型變量存儲在內存中? (C++)
- 2. 選擇存儲在變量
- 3. 將變量存儲在某個內存地址C#
- 4. 將UIPickerView選擇存儲到變量中
- 5. 如何將變量存儲在本地存儲中?
- 6. COUNT選擇和本地變量存儲
- 7. 我如何將選擇列存儲在變量中?
- 8. 更改存儲在變量中的內存地址C
- 9. 如何將類變量存儲在內存中?
- 10. 將xpathResult.snapshotItem存儲在本地變量中?
- 11. 如何將我的選擇值存儲到會話變量中?
- 12. 我如何將圖像選擇存儲到變量JavaScript中
- 13. 如何在c中存儲變量#
- 14. 如何在變量@中將%存儲在存儲過程中?
- 15. 如何將$存儲在PHP變量中?
- 16. 如何將ERRORLEVEL存儲在變量中?
- 17. PHP - 使用cURL將cookie會話存儲到變量/內存中
- 18. 存儲在內存中的變量
- 19. 內存中的變量是以C++存儲的變量嗎?
- 20. 如何在Excel應用程序內存中存儲變量VBA
- 21. 如何使用strcpy將值存儲在常量變量中?
- 22. Rowfilter使用存儲在變量中的值選擇語法
- 23. 變量如何在遞歸中存儲在內存中?
- 24. 存儲下拉選擇數據在本地存儲使用javascript
- 25. 如何選擇存儲在字符串變量中的元素?
- 26. 如何在JavaScript變量中存儲多個jQuery選擇器?
- 27. c# - excel - 如何將數字變量存儲爲數字字段
- 28. 將變量存儲在變量中
- 29. 在本地存儲變量
- 30. 其中是存儲在內存段中的全局變量和靜態變量?
你的評論表明你問的東西*完全不同*。所以......問題是什麼? –