2012-10-05 51 views
3

如何通過測試寫入來緩存緩存的類型(回寫/通過)來確定?我可以使用與我一樣的方法通過記錄修改緩存的時間來確定緩存的級別和大小,但是我需要與某些內容進行比較。例如。如果時間明顯短於已知的L1寫入緩存,我可以說它回寫。但是,我需要一個基線來比較,而不是我?確定緩存是回寫還是通過

Heres my attempt at GitHub

的主要思想是:

  • 如果寫通過寫x VS x * 100時間拍攝的,時間大約是100倍
  • 如果回寫,時間會差不多?

所以環路WRITES_BASE次與時間爲各自的時代WRITES時間減去執行循環只(無存儲器存取),並比較它們的時間......這給我的印象是我的酷睿i3 2100已全部通過寫緩存...

16, 0.03, 1.04 (31.28) 
128, 0.07, 2.31 (31.78) 
2048, 0.10, 3.19 (31.74) 

上述數值是:test size (KB), time for WRITES_BASE, time for WRITES (t(WRITES)/t(WRITES_BASE))

我猜我的實驗問題我還沒有消除,我運行WRITES次以上的時間差。 ..

UPDATE

我注意到一個奇異之處,如果我把我的WRITES = 64 * WRITES_BASE,那麼如果我有我的WRITES_BASE = 4 million

16, 0.01, 0.13 (17.16) 
128, 0.01, 0.29 (31.60) 
2048, 0.01, 0.41 (30.53) 

如果我增加WRITES_BASE = 16 million

16, 0.02, 0.52 (25.53) 
128, 0.04, 1.16 (31.74) 
2048, 0.05, 1.57 (31.89) 

注意,當WRITES_BASE越小,時間之間的差別沒有那麼大,也許是告訴我L1是回寫緩存。但是,因爲它並不總是如此,例如。當我增加WRITES_BASE時,我想知道我是否有一些邏輯錯誤?

回答

2

使用此過程無法真正區分寫回緩存和直寫式緩存。考慮:如果您使用寫回緩存,則需要X時間來執行循環中的指令,而Y時間將其寫回。 Y不是由你的代碼來衡量的(你沒有任何關於顯式緩存刷新或類似的時間)。當您循環N次時,需要N * X次,再加上Y,代碼執行完畢後纔會刷新緩存。

使用直寫式高速緩存,X較高,Y爲零。但單循環與多循環的比例是相同的。因此,你不能用這個程序來區分這個區別。

也就是說,有些方法可以檢測到這一點。關鍵是強制緩存刷新其緩存行,而你正在計時。嘗試比較寫入各種大小的數組需要多長時間。在寫入之間確保通過讀取大量不相關的數據來刷新任何寫回緩存(注意:不要只分配一個大數組並在不寫入數據的情況下讀取它 - 在程序啓動時寫入一次,然後讀取整個數據在定時運行之間。否則,數組中的所有頁面都可能指向物理內存中相同的歸零頁面,具體取決於您的操作系統)。

你也可以試着看看寫入很多數據會影響的讀取速度。在直寫式高速緩存中,讀取數據不會因爲最近寫入數據而花費更長的時間。在回寫式高速緩存中,讀取可能需要等待高速緩存刷新 - 因此在寫入之後立即讀取數據或立即讀取數據可能會給您一些有趣的結果。

+0

嗯...「寫入各種大小的數組」部分如何進入圖片?這是指每個緩存級別的大小嗎? –

+0

那麼,如果你寫入的內容不止適合緩存,那麼你將不得不等待回寫才能發生,對吧? – bdonlan

+0

是的,但它會寫入另一個緩存嗎?如果是這種情況,時間增加可能是由於下一級的寫入時間較慢?在* [另一個實驗](https://github.com/jiewmeng/cs3210-assign1/blob/master/cache.cpp)**中確定緩存的級別和大小,我使用了它。 –

相關問題