1

プログラムのパフォーマンスについて、Ubuntu10.10マシン上の複数のソースからプログラムでデータを収集しようとしています。他のすべてのソースについては、RDTSC x86命令を使用してそれらを収集し、gettimeofdayを使用してそれらをスケーリングして、絶対時間の秒に変換することができました。ただし、これらのデータソースを/ sys / kernel / debug / traceingでsched_switchトレースを実行する出力と調整しようとすると、問題が発生します。これは、表示されている出力が不明な時間から数秒とマイクロ秒であるためです。

すでに行った手順:
1。Linuxカーネルも内部でRDTSCを使用していると判断しましたが、収集したオフセットを追加しましたが、取得する機能がないようです。これはコアごとにも行われます。つまり、4つのコアすべてを試して、最適なコアを決定する必要があります。これは、この問題の解決策としては不十分なようです。
2.ロギングをオンにしてRDTSC時間を変換して、少なくとも変換自体が一貫しているかどうか(つまり、一定のオフセットがあるかどうか)を確認しましたが、実行中はスケールが一定に保たれていないようです。
3. clock_gettime(CLOCK_MONOTONIC、...)は非常によく似た値を持っているように見えますが、常に例外のない量(約0.5秒)ずれており、完全に一貫しているようにも見えません。

他のデータソースが時間を収集する方法を必要なものに変更できる場合(パフォーマンスを重視しない場合)、トレースの時間と収集する時間の間で調整するために、どのように時間を収集する必要がありますか?出力をRDTSCに変更する何らかの方法があるので、それを使用できますか、それとも、トレースに出力されているものと同じ時間を取得するために実行できるシステムコールがありますか?助けてくれてありがとう。

4

2 に答える 2

0

RDTSCは一般的な命令ではありません。それを使用するときにいくつかの問題があります、ハイバネーションのようないくつかのイベントはカウンターをリセットします。その他の一般的な問題の原因は動的CPUクロックです。rdtscとhpetを比較した良い投稿があります。

http://aufather.wordpress.com/2010/09/08/high-performance-time-measuremen-in-linux/

rdtscの精度を確認するために、1秒間にカウントされるクロックサイクル数を測定し、宣言されたCPUクロックと比較します。CPUダイナミッククロックを無効にした場合にのみ機能します。見る:

https://github.com/petersenna/rdtscbench

于 2012-02-07T19:39:01.643 に答える
0

そのため、ソースコードを調べたところ、ある時点で、コードがRDTSC値を取得し、それを使って凝った計算を行って、クロック周波数を掛け、起動時に計算されるオフセットを追加しようとしていることがわかりました。ただし、RDTSCは新しいチップのコア間で一貫性があることが保証されているため、このコードは少し古くなっているようですが、これはそれぞれが異なることを前提としています。また、最大周波数ではなく現在の周波数を収集しているように見えました。これは、ドキュメントにRDTSCが使用していると記載されているようです。

したがって、この時点では、私のインスタンスで役立つ精度レベルでは、時間は実際の時間に直接関連していないようです。うまくいけば、このバグは今後のカーネルリリースで修正され、これを修正し、これら2つのセットを同期する機会が開かれますが、それまでは十分な信頼性がないようです。

于 2012-03-13T06:20:00.137 に答える