2013-11-25 53 views
3

尋找一個C/C++程序來測試訪問一塊固定的內存需要多長時間,特別是在RAM中。如何測試主內存訪問時間?

如何確保測試訪問時間不是緩存或TLB數據?

例如,我可以「禁用」所有緩存/ TLB嗎?

或者我可以在RAM中指定一個特定的地址來寫/只讀嗎?

另一方面,我將如何確保我只測試緩存?

有沒有辦法告訴編譯器在哪裏保存和讀取緩存/內存?

例如,是否有知道該測試的知名標準程序(in one of these books?)?

我沒有看到這一點,但我不明白如何調整列表的大小,可以控制內存是否接入命中L1高速緩存,L2高速緩存,或者主內存:measuring latencies of memory

如何才能正確地設定此測試?

+1

你可以通過使用關鍵字'register'來請求緩衝存儲器......不確定使用較慢的內存...... –

+0

@ bit-fiddling-code-monkey:請示例,我可以將其添加到問題中。 .. –

+2

'寄存器'是一個編譯器提示使用一個CPU寄存器,這是完全不同的緩存內存.... –

回答

2

基本上,隨着列表的增長,隨着另一層緩存的不堪重負,您將看到性能逐步惡化。這個想法很簡單......如果緩存保存你訪問過的最後N個內存單元,那麼在一個甚至N + 1個單元的緩衝區中循環應該確保緩存未命中。 (在你的問題中鏈接到的「測量記憶延遲」答案中有更多細節/注意事項)。

您應該能夠從硬件文檔中瞭解可能會佔用RAM的最大緩存的可能大小 - 只要您操作的內存多於應該測量物理RAM時間的內存。

+0

http://ark.intel.com/products/56056/ - 可以假設,如果我超過2MB寫更多的「記憶」,然後回讀,它缺少緩存或它必須是在一個循環? –

+1

有基本的想法...受到預取問題的影響。一個循環可能會給你足夠的樣本,以避免需要高分辨率的時序(在讀取實時時鐘寄存器時存在嚴重的問題,除非將該線程連接到核心並且不關心可能的CPU時鐘速率變化省電模式等,以及在Linux和Windows上 - 通常還包括QueryPerformanceCounter等)。您可能需要閱讀http://www.sisoftware.net/?d=qa&f=ben_mem_latency-關於這個東西的良好背景。 –

相關問題