質問

プログラムの各部の時間を計る非常に正確な方法が必要です。これには通常の高解像度クロックを使用できますが、それはウォールクロック時間を返します。これは必要なものではありません。自分のプロセスだけを実行するのに費やす時間が必要です。

私はそれをブックマークするのを忘れていて、パッチの名前も忘れていたことを除いて、ナノ秒の精度でプロセスの時間を計測できるLinuxカーネルパッチを見たことをはっきりと覚えています:(。

それがどのように機能するか覚えています:

すべてのコンテキストスイッチで、高解像度クロックの値を読み取り、最後の2つの値のデルタを実行中のプロセスのプロセス時間に追加します。これにより、プロセスの実際のプロセス時間を高解像度で正確に表示できます。

通常の処理時間は通常のクロックを使用して保持されます。これはミリ秒精度(1000Hz)であり、私の目的には大きすぎると考えています。

誰が私が話しているカーネルパッチを知っていますか?また、それは前後に文字が付いた単語のようなものだったことを覚えています-「rtimer」などのようなものですが、正確には覚えていません。

(他の提案も歓迎します)


Markoによって提案されたCompletely Fair Schedulerは、私が探していたものではありませんが、有望に見えます。私が持っている問題は、プロセス時間を取得するために使用できる呼び出しがまだ十分な粒度の値を返さないことです。

  • times()はミリ秒単位で値21、22を返します。
  • clock()は、同じ粒度の値21000、22000を返しています。
  • getrusage()は210002、22001(など)のような値を返しますが、精度は少し向上しているように見えますが、値は顕著に同じに見えます。

だから今私が抱えている問題は、必要な情報がカーネルにあるということです。それを返すシステムコールがわからないだけです。

役に立ちましたか?

解決

このレベルのタイミング解像度を探している場合、おそらくいくつかのマイクロ最適化を試みています。その場合は、 PAPI をご覧ください。ウォールクロックと仮想(プロセスのみ)の両方のタイミング情報を提供するだけでなく、CPUイベントカウンターへのアクセスも提供します。これは、パフォーマンスを向上させる場合に不可欠です。

http://icl.cs.utk.edu/papi/

他のヒント

詳細については、この質問をご覧ください。

そのようなことのために使用したのはgettimeofday()です。秒とマイクロ秒の構造を提供します。コードの前に呼び出し、その後に再度呼び出します。次に、timersubを使用して2つの構造体を減算するだけで、tv_usecフィールドから秒単位の時間を取得できます。

ソフトウェアの速度をテストするために非常に小さな時間単位が必要な場合は、ループしたい部分を数百万回実行することをお勧めします。ループの前後に時間をかけて、平均を計算します。これを行うことの良い副作用(ナノ秒の使用方法を理解する必要がないことを除く)は、osスケジューラーによって引き起こされるランダムなオーバーヘッドが平均化されるため、より一貫した結果が得られることです。

もちろん、プログラムが1秒間に何百万回も実行する必要がない限り、ミリ秒の実行時間を測定できない場合はおそらく十分に高速です。

CFC(完全に公正なスケジューラ)が探していると思います。

かなり最近のイベントがある場合は、高精度イベントタイマー( HPET )を使用できます。 2.6カーネル。使用方法については、 Documentation / hpet.txt をご覧ください。ただし、このソリューションはプラットフォームに依存しており、新しいx86システムでのみ使用できると考えています。 HPETには少なくとも10MHzのタイマーがあるため、要件に簡単に適合するはずです。

FreescaleのいくつかのPowerPC実装は、サイクルアキュレート命令カウンターもサポートすると考えています。数年前にこれを使用して高度に最適化されたコードのプロファイルを作成しましたが、それが何と呼ばれているか覚えていません。 Freescaleには、ユーザー空間からアクセスするために適用する必要があるカーネルパッチがあると思います。

http://allmybrain.com/2008/ 06/10 / timing-cc-code-on-linux /

あなたの助けになるかもしれません(C / C ++でそれをしている場合は直接ですが、そうでない場合でもポインタを与えることを願っています)...マイクロ秒の精度を提供すると主張しています基準。 :)

探していたカーネルパッチを見つけたと思います。リンクを忘れないようにここに投稿します:

http://user.it.uu.se/~mikpe/ linux / perfctr / http://sourceforge.net/projects/perfctr/

編集:非常にユーザーフレンドリーではありませんが、私の目的には機能します。

CPUのタイムスタンプカウンターを試してください。ウィキペディアはclock_gettime()の使用を提案しているようです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top