2017-06-05 5 views
0

私は、CPUレジスタR11にループのインデックスを書き込んで、それをでビルドする実験を行っています。それを測定する。Linuxカーネルを再コンパイルして特定のCPUレジスタを使用しない

しかし、私が報告書をチェックしたとき(perf scriptを使用)、ほとんどのレコード項目のR11値は、私が期待していた値ではなく、1..2..3または1..4のような数字列になっています。 7などですが、実際は固定値です。 (おそらくシステムコールの上書きの影響を受けますか?)

私はプログラムでレジスタに設定した値をperfレコードに許可することはできますか?あるいは、カーネル全体を-ffixed-r11で再コンパイルする必要がありますか?

ありがとうございました。

+1

使用している呼び出し規約によっては、R11を使用しないようにカーネルを再コンパイルすることさえできないこともあります。あなたは本当に何をしようとしていますか? – tangrs

+0

こんにちは、ありがとう。 perfのレコードを使用して、自分のプログラムがperfイベントをトリガーする頻度を知ることができます(正確にはどのループで発生したか)。 –

答えて

0

perfを使っていくつかのレジスタをサンプリングしたいときは、カーネルを再コンパイルしないでください。私が理解しているように、カーネルには独自のレジスタセットがあり、ユーザーR11は上書きされません。 syscallインターフェイスには変更できない固定レジスタがいくつかあります(異なるregを試すことができますか?)いくつかの追加レジスタを使用するsyscallへのglibcゲートウェイが頻繁にあります(カーネルにはなくユーザ空間コードです。またはアセンブラで書かれている)。 gdbを使って誰がそれをしたのかを見つけるためにレジスタを監視してみてください。それはこれを行うことができます(うーん、SOの同じユーザーへのリンクをもう1つ):gdb: breakpoint when register will have value 0xffaagdb ./programのように、次にgdbコマンドstart; watch $r11; continue; whereのように。

二週間の年齢PERFでレジスタ値のサンプリングについての質問perf-report show value of CPU registerがあった:

私はthis documentに従い、追加のCPUがPEBSレコードとの情報を登録しログインしようとし、--intr-regs=ax,bx,r15perf recordを使用しては。

x86 & PEBSがある間、ARMには--intr-regsも実装されている可能性があります。 perf record --intr-regs=\?man perf-record: "利用可能なレジスタを一覧表示するには--intr-regs=\?を使用する")の出力をチェックしてサポート状況とレジスタ名を確認してください。

レジスタを印刷するには、perf script -F ip,sym,iregsコマンドを使用します。例では、一部のLinuxでありましたがコミット:あなたは金属製CPUの活動へのサイクル精度のプロファイルが必要な場合、それはせいぜい近似であるとして、その後PERFは、右のツールではありません

# perf record --intr-regs=AX,SP usleep 1 
    [ perf record: Woken up 1 times to write data ] 
    [ perf record: Captured and wrote 0.016 MB perf.data (8 samples) ] 
    # perf script -F ip,sym,iregs | tail -5 
    ffffffff8105f42a native_write_msr_safe AX:0xf SP:0xffff8802629c3c00 
    ffffffff8105f42a native_write_msr_safe AX:0xf SP:0xffff8802629c3c00 
    ffffffff81761ac0 _raw_spin_lock AX:0xffff8801bfcf8020 SP:0xffff8802629c3ce8 
    ffffffff81202bf8 __vma_adjust_trans_huge AX:0x7ffc75200000 SP:0xffff8802629c3b30 
    ffffffff8122b089 dput AX:0x101 SP:0xffff8802629c3c78 
    # 
0

による事実のために、それだけのサンプル選択ポイントでのプログラム。 this video on perf by Clang developer Chandler Carruthを参照してください。

代わりに、レジスタに何が起こっているかを正確に監視するために、プログラムを1ステップ実行する必要があります。あるいは、OSなしでシステムのベアメタルをプログラムすることもできますが、おそらくここではその範囲外です。

+0

https://www.youtube.com/watch?v=nXaxk27zwlk「CppCon 2015:Chandler Carruth」チューニングC++:ベンチマーク、CPU、コンパイラああ私! ""ビデオは面白い、ありがとう!しかし、どのようにレジスタ値を見つけるのに役立つでしょうか? – osgx

+1

@osgxそれは助けにはなりませんが、それはまさに私の要点です。 Perfは一定の間隔でレジスタをサンプリングするだけなので、必然的に多くのものを間違えてしまうことになります。 –

関連する問題