2013-02-03 10 views
27

perf tutorialsによると、perf statは、ハードウェアカウンタを使用してキャッシュミスを報告することになっています。しかし、私のシステム(最新のArch Linux)では、それはしません:なぜレポートキャッシュミスが解決されないのですか?

[[email protected] goog]$ perf stat ./hash 

Performance counter stats for './hash': 

    869.447863 task-clock    # 0.997 CPUs utilized   
      92 context-switches   # 0.106 K/sec     
      4 cpu-migrations   # 0.005 K/sec     
     1,041 page-faults    # 0.001 M/sec     
2,628,646,296 cycles     # 3.023 GHz      
    819,269,992 stalled-cycles-frontend # 31.17% frontend cycles idle 
    132,355,435 stalled-cycles-backend # 5.04% backend cycles idle 
4,515,152,198 instructions    # 1.72 insns per cycle   
             # 0.18 stalled cycles per insn 
1,060,739,808 branches     # 1220.015 M/sec     
    2,653,157 branch-misses    # 0.25% of all branches   

    0.871766141 seconds time elapsed 

私は何が欠けていますか?私はすでにマニュアルページとウェブを検索しましたが、明らかなものは何も見つかりませんでした。

編集:私のCPUはIntel i5 2300Kです(重要な場合)。

+0

ハードウェアカウンタによって異なります。私は 'perf'を使ったことは一度もありませんでしたが、 'PAPI'(http://icl.cs.utk.edu/PAPI/)を使用しました。利用可能なハードウェアカウンターを調べて何が得られるかを調べることができますあなたのCPU。 – SamGamgee

+2

'perf stat -d'を試してください - いくつかのキャッシュイベントを報告します。レコード/レポートメモリイベントのための新しい 'perf mem'ツールもチェック - http://www.linuxtag.org/2013/fileadmin/www.linuxtag.org/slides/Arnaldo_Melo_-_Linux__perf__tools__O​​verview_and_Current_Developments.e323.pdfスライド10とhttp ://man7.org/linux/man-pages/man1/perf-mem.1.html – osgx

+1

osgx、 'perf stat -d'はイベントの多重化を有効にします。これは時には誤ったレートを報告することがあります。実行ごとに5〜7回のhwイベントを手動で選択する方が良いです。 perf stat -dのみを使用して、そのようなイベントの名前を取得します。インテルの他の方法 - https://github.com/andikleen/pmu-tools – osgx

答えて

39

私のシステムでは、Intel Xeon X5570 @ 2.93 GHz私はabl E、キャッシュイベントが含まれていませんでした。この

perf stat -B -e cache-references,cache-misses,cycles,instructions,branches,faults,migrations sleep 5 
Performance counter stats for 'sleep 5': 

     10573 cache-references            
      1949 cache-misses    # 18.434 % of all cache refs  
     1077328 cycles     # 0.000 GHz      
     715248 instructions    # 0.66 insns per cycle   
     151188 branches              
      154 faults              
      0 migrations             

    5.002776842 seconds time elapsed 

のように明示的にイベントのデフォルトのセットを、それらのイベントを要求し、あなたの結果を照合することによってキャッシュの参照とミスを報告しperf statを得るために、私は知らないなぜ

perf stat -B sleep 5 

Performance counter stats for 'sleep 5': 

     0.344308 task-clock    # 0.000 CPUs utilized   
      1 context-switches   # 0.003 M/sec     
      0 CPU-migrations   # 0.000 M/sec     
      154 page-faults    # 0.447 M/sec     
     977183 cycles     # 2.838 GHz      
     586878 stalled-cycles-frontend # 60.06% frontend cycles idle 
     430497 stalled-cycles-backend # 44.05% backend cycles idle 
     720815 instructions    # 0.74 insns per cycle   
             # 0.81 stalled cycles per insn 
     152217 branches     # 442.095 M/sec     
      7646 branch-misses    # 5.02% of all branches   

    5.002763199 seconds time elapsed 
+0

からtoplev.pyを試してくださいありがとうございました。キャプチャされたイベントのデフォルトセットを変更したはずです。 –

+0

ニース、私はそれがいつも情報を記録することが奇妙だと思っていた..このアプローチは速いです:) – SamGamgee

+0

質問の中の質問、perf出力の 'fauts'カウントは何ですか? –

3

私はperfを理解しようと数分を費やしました。最初に記録してからデータを報告することでキャッシュミスを発見しました(両方ともperfツール)。イベントの一覧を参照するには

:最後のレベル・キャッシュの負荷をchechし、例えば

perf list 

ミス、レポート、その後LLC-loads-misses

このような
perf record -e LLC-loads-misses ./your_program 

イベントを使用したいと思うでしょう結果は

perf report -v 
7

the latest source codeでは、デフォルトのイベントが再びcache-missescache-referencesが含まれていません。

struct perf_event_attr default_attrs[] = { 

    { .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_TASK_CLOCK  }, 
    { .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_CONTEXT_SWITCHES }, 
    { .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_CPU_MIGRATIONS  }, 
    { .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_PAGE_FAULTS  }, 

    { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_CPU_CYCLES  }, 
    { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_STALLED_CYCLES_FRONTEND }, 
    { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_STALLED_CYCLES_BACKEND }, 
    { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_INSTRUCTIONS  }, 
    { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS }, 
    { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_BRANCH_MISSES  }, 

}; 

のでミリアンペアnとほとんどのウェブは今のところ古くなっています。

関連する問題