2012-10-08 92 views
3

我正在用Java編寫程序如何通過Java收集AMD CPU高速緩存命中率?

在這個程序中,我正在讀取和更改一組數據。這是代碼的一個例子:

public double computation() { 
    char c = 0; 
    char target = 'a'; 
    int x = 0, y = 1; 

    for (int i = 0; i < data.length; i++) { 
     // Read Data 
     c = data[index[i]]; 

     if (c == target) 
      x++; 
     else 
      y++; 

     //Change Value 
     if (Character.isUpperCase(c)) 
      Character.toLowerCase(c); 
     else 
      Character.toUpperCase(c); 

     //Write Data 
     data[index[i]] = c; 
    } 
    return (double) x/(double) y; 
} 

BTW,指數數組包含在隨機爲了防止預取數據數組的索引。通過在INDEX數組中使用隨機索引,我迫使我的所有緩存訪問都是錯過了

現在我想通過收集有關其命中率的信息來檢查CPU高速緩存的行爲。

有沒有爲此目的開發的工具?如果沒有,有什麼技術?

回答

1

在Linux上可以通過OProfile收集這些信息。每個CPU都有性能事件計數器。請參閱此處查看AMD K15系列活動列表:http://oprofile.sourceforge.net/docs/amd-family15h-events.php

OProfile定期對事件計數器和程序計數器進行採樣。在程序運行後,您可以分析發生了多少事件,並在(統計)什麼程序位置。

OProfile建立在Java支持。它與Java JIT進行交互,並創建一個合成符號表來查找Java方法名稱,以便生成JIT代碼。

初始設置不是很容易。如果感興趣,我可以引導你或者寫一些關於它的信息。

+0

這是我2年前的一箇舊項目。我當時使用了[PAPI](http://icl.cs.utk.edu/papi/),但沒有提供最準確的結果,但它對我的目的有好處。我希望你的回答會幫助另一個人。 – Reza

1

我不認爲你可以從Java獲得如此低層次的信息,但有人可能會更清楚。你可以編寫沒有緩存遺漏的相同程序並檢查其差異。這就是我在this other post中提出的例子。

+0

我如何確定我的所有數據都已被緩存?我不知道你是否得到了這個代碼的目的,但是我強迫所有的緩存訪問都被在INDEX數組中使用隨機索引所遺漏。我的意思是你的建議看起來不錯,但不應該有這樣的工具嗎? – Reza

+0

@Hesam你可以舉一個真實世界的程序需要知道這個的例子嗎? –

+0

@PeterLawrey任何地方,你需要有一個高速計算!就我而言,線程遷移會產生很多開銷,具體取決於緩存行爲。我想我應該檢查我的緩存訪問命中率,以獲得最佳性能。 – Reza