13

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

ブックマークを忘れてパッチの名前も忘れてしまったことを除けば、プロセスのタイミングをナノ秒の精度にできるLinuxカーネルパッチを見たことをはっきりと覚えています:(。

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

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

通常の処理時間は通常の時計を使用して維持されます。これはミリ秒の精度(1000Hz)であり、私の目的には大きすぎます。

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

(他の提案も大歓迎です)


Markoによって提案されたCompletelyFairSchedulerは、私が探していたものではありませんが、有望に見えます。私が抱えている問題は、処理時間を取得するために使用できる呼び出しが、まだ十分にきめ細かい値を返さないことです。

  • times()はミリ秒単位で値21、22を返します。
  • clock()は、同じ粒度の値21000、22000を返します。
  • getrusage()は210002、22001(およびそのようなもの)のような値を返します。それらは少し精度が高いように見えますが、値は著しく同じに見えます。

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

4

8 に答える 8

5

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

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

于 2008-12-30T18:09:47.900 に答える
5

詳細については、この質問を参照してください。

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

于 2008-12-30T16:11:39.243 に答える
3

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

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

于 2008-10-08T14:49:11.430 に答える
1

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

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

于 2008-10-08T16:53:42.833 に答える
1

CPU のタイムスタンプ カウンターを試しますか? ウィキペディアは、clock_gettime() の使用を推奨しているようです。

于 2008-12-30T19:13:48.037 に答える
1

CFC ( Completely Fair Scheduler ) はあなたが探しているものだと思います。

于 2008-10-08T14:50:56.280 に答える
1

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

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

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

于 2008-11-19T10:53:36.367 に答える
1

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

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

于 2008-10-08T14:57:55.487 に答える