4

マルチコアプロセッサでマイクロベンチマークを実行する方法を探しています。

コンテクスト:

ほぼ同時に、デスクトッププロセッサは、パフォーマンスの予測を困難にするアウトオブオーダー実行を導入しましたが、偶然ではないかもしれませんが、非常に正確なタイミングを取得するための特別な命令も導入しました。これらの手順の例はrdtsc、x86およびrftbPowerPCにあります。これらの指示により、システムコールで許可されるよりも正確なタイミングが得られ、プログラマーは、良くも悪くも、自分の心をマイクロベンチマークすることができました。

いくつかのコアを備えたさらに最新のプロセッサでは、一部はスリープ状態になることがあり、カウンタはコア間で同期されません。rdtscベンチマークに使用するのはもはや安全ではないと言われていますが、代替ソリューションについて説明されたとき、私は居眠りをしていたに違いありません。

質問:

一部のシステムでは、パフォーマンスカウンターを保存および復元し、適切な合計を読み取るためのAPI呼び出しを提供する場合があります。この呼び出しがオペレーティングシステムに対して何であるかを知っている場合は、回答でお知らせください。

一部のシステムでは、コアをオフにして、1つだけを実行したままにすることができます。Mac OS X Leopardは、開発者ツールから適切な設定ペインがインストールされている場合に機能することを知っています。rdtscこれで安全に再利用できると思いますか?

その他のコンテキスト:

マイクロベンチマークを実行しようとするときに、自分が何をしているのかを知っていると仮定してください。アプリケーション全体のタイミングで最適化のゲインを測定できない場合は、最適化する価値がないという意見がある場合は、同意しますが、

  1. 代替データ構造が完成するまで、アプリケーション全体の時間を計ることができません。これには長い時間がかかります。実際、マイクロベンチマークが有望でない場合は、今すぐ実装をあきらめることにすることができます。

  2. 締め切りを管理できない出版物で提供する数字が必要です。

4

2 に答える 2

3

OSX(ARM、Intel、PowerPC)では、次のものを使用しますmach_absolute_time( )

#include <mach/mach_time.h>
#include <stdint.h>    

// Utility function for getting timings in nanoseconds.
double machTimeUnitsToNanoseconds(uint64_t mtu) {
    static double mtusPerNanosecond = 0.0;
    if (0.0 == mtusPerNanosecond) {
        mach_timebase_info_data_t info;
        if (mach_timebase_info(&info)) {
            // Handle an error gracefully here, whatever that means to you.
            // If you do get an error, something is seriously wrong, so
            // I generally just report it and exit( ).
        }
        mtusPerNanosecond = (double)info.numer / info.denom;
    }
    return mtu * mtusPerNanosecond;
}

// In your code:
uint64_t startTime = mach_absolute_time( );
// Stuff that you want to time.
uint64_t endTime = mach_absolute_time( );
double elapsedNanoseconds = machTimeUnitsToNanoseconds(endTime - startTime);

このために1つのコアに制限する必要はないことに注意してください。mach_absolute_time( )OSは、マルチコア(およびマルチソケット)環境で意味のある結果を出すために、舞台裏で必要な修正を処理します。

于 2010-05-08T15:56:35.897 に答える
1

コアは「rtdsc」の正しい同期値を返しています。マルチソケットマシンを使用している場合は、プロセスを1つのソケットに固定する必要があります。これは問題ではありません。

主な問題は、スケジューラーがデータの信頼性を低下させていることです。Linuxカーネル>2.6.31用のパフォーマンスAPIがいくつかありますが、私はそれを見ていません。Windows>Vistaはここで素晴らしい仕事をしています。QueryThreadCycleTimeとQueryProcessCycleTimeを使用してください。

OSXについてはよくわかりませんが、AFAIKの「mach_absolute_time」はスケジュールされた時刻を調整しません。

于 2010-05-08T16:18:55.363 に答える