2014-01-24 24 views

回答

1

在其他答案閱讀您的意見,我想補充一些東西。

在操作系統內部,您不能限制變量將被存儲在哪個內存層級中,因爲控制金屬的人是操作系統,它會強制您按其規則進行操作。儘管如此,你可以做一些事情,讓你接近測試緩存中的訪問時間(主要是L1,取決於你的測試算法)和RAM內存。

測試緩存訪問:預熱訪問變量的幾次。他們訪問很多次相同的變量(緩存超快,你需要大量的訪問來衡量訪問時間)。

要測試主內存(又名RAM):禁用BIOS中的高速緩存並運行您的代碼。

要測試輔助內存(又稱磁盤):禁用給定文件的磁盤緩存(您可以詢問您的操作系統,只是谷歌關於它),並開始從磁盤讀取一些數據,總是從相同的位置。這可能會或可能不會工作,具體取決於您的操作系統將允許您禁用磁盤緩存(谷歌有關)。

要測試其他級別的內存,您必須實現您自己的「測試操作系統」,即使由於硬件限制也可能無法禁用某些緩存機制(當然,實際上並沒有限制...) 。

希望我幫了忙。

0

不是。緩存旨在透明地工作。幾乎你所做的任何事情都會在緩存中結束,因爲它目前正在運行。

至於二級存儲,我假設你的意思是硬盤,文件,雲等。除非明確地這樣做,或者設置內存映射區域,或者將某些內容分頁到磁盤,否則真的永遠不會被存儲。

+0

那麼,我想計算存儲在不同部分內存中的變量的訪問時間..是否有間接的方式來做到這一點? –

0

不。一般的計算機程序只能訪問主存儲器。即使是輔助存儲(磁盤)通常也只能通過操作系統服務使用,通常通過庫的stdio部分使用。基本上沒有直接的方法來檢查或控制更接近CPU的分層緩存。

也就是說,有一些緩存分析器(如Valgrind的massif工具)可以讓您瞭解您的程序如何使用給定類型的緩存架構(以及推測性執行),以及哪些可以幫助您您發現緩存性能較差的代碼路徑。他們主要通過模擬硬件。

也可能有一些體系結構特定的指令,可以讓您對緩存(例如x86上的「非時間提示」或「預取」指令)進行一些控制,但這些指令很少見,也不常見,並且通常不會暴露給C程序碼。

+0

那麼,我想計算存儲在不同部分內存中的變量的訪問時間..是否有間接的方式來做到這一點? –

+0

不是我的知識。你也許可以製作一個算法的兩個版本,並且其中一個會積極地污染緩存,看看它是否有明顯的不同。 –

+0

是的,我想這樣做..但是C編譯器限制了數組的大小,我無法填充該緩存因爲 –

0

它取決於您使用的特定體系結構和編譯器。

例如,在x86/x64上,大多數編譯器都有各種級別的預取指令,暗示CPU高速緩存行應該從DRAM移動到高速緩存中的特定級別訂單緩存 - 例如從L3到L2)。

一些 CPU,非時間預取指令可用於與非暫時讀取指令相結合時,允許您繞過緩存並直接讀入寄存器。 (有些CPU通過強制數據達到高速緩存的特定方式來實現非臨時性;因此您必須閱讀文檔)。

一般來說,在L1和L2(或L3,或L4或DRAM)之間,它有點黑洞。你不能專門存儲一個值 - 其中一些緩存是相互包含的(所以如果一個值在L1中,它也在L2和L3中),有些不是。高速緩存設計爲週期性地消耗 - 所以如果寫入L1,最終會逐步向L2,然後是L3,然後是DRAM - 特別是在具有強存儲器模型的多核架構中。

您可以在寫入時完全忽略它們(使用流式存儲或將內存標記爲寫入組合)。

您可以通過測量不同的訪問時間:

  • 使用內存映射文件作爲後備存儲的數據(這將衡量首次訪問時間到達CPU - 只是把它包在定時器調用中,例如QueryPerformanceCounter或__rdtscp)。確保在每次測試之間取消映射並關閉內存中的文件,並關閉所有緩存。這將需要一段時間。
  • 刷新訪問之間的高速緩存以獲取從DRAM訪問的時間。

測量不同高速緩存級別之間的差異比較困難,但是如果您的體系結構支持它,您可以預取高速緩存級別,循環一段時間,然後嘗試它。

在使用商業操作系統的系統上很難做到這一點,因爲他們往往會做很多工作,這會干擾您的測量。

相關問題