2010-10-26 115 views
1

設arr是維數爲16的數組x 20
這裏是所提到的代碼片段的valgrind輸出。輸出來自cachegrind。Valgrind輸出解釋

for (i = 0; i < 20; i++) 
    arr[0][i] = 0; 


Ir I1mr I2mr Dr D1mr D2mr Dw D1mw D2mw 

64  0  0  41  0  0  1  0  0   
60  0  0  20  0  0 20  2  2     

我已閱讀了valgrind文檔中這些單獨參數的含義。但是,我無法用上述數字來計算。像for循環一樣,我們是否真的有41個緩存數據讀取?或者對於數組arr,我們怎麼能有2個L2寫入未命中呢?

我的配置是L1d = L1I = 32KB,L2 = 2MB,64字節高速緩存行大小和8路組關聯。

+1

您是否特指cachegrind,如果是的話那麼您可能應該指定它。我儘可能使用KCacheGrind來幫助理解cachegrind和callgrind。如果您需要其他分析,那麼顯然您需要編寫自己的腳本/圖表。 http://kcachegrind.sourceforge.net/這顯然不是你的問題,只是一個(希望)有用的評論。 – 2010-10-26 15:17:22

回答

0

正如埃裏克·奧爾森說,41在for線讀取都是爲了i - 21在i < 20測試,與20 i++(如果你使用優化編譯,這應減少)。

有兩個L2寫入未命中,因爲您的20個整數覆蓋80個字節,這是(最多)兩個緩存行。根據陣列的對齊情況,它可能會覆蓋3個緩存行,這會導致三次寫入未命中。

0

大部分數據讀取來自循環變量i。

21來自條件i 20從i ++讀取。
20從左值arr [0] [i]中的i中讀取。我不是最新的緩存工作方式,但假設32位int數組,您的寫入覆蓋10緩存行。瘋狂的猜測:最後兩行是你的寫入失誤,因爲它以某種方式不能預測你的下一次寫入。

如果展開循環,您將看到計數收縮爲小數。

arr[0][0]=0; 
arr[0][1]=0; 
..  
0

我認爲上面提到的數據可能是錯誤的,因爲它是從一個大代碼中挑選出來的,因此也有其他變量的影響。

+0

我能夠重現您的計數。 – 2010-10-26 22:11:17