2009-08-01 9 views
2

私はRDTSCを使用してタイムコードを試しています(私が試した他のプロファイリングソフトウェアは、Ubuntu 8.10上で必要な解像度まで時間を割くことができません)。しかし、タスクスイッチから異常値を取得し続け、発火を中断し、統計が無効になっています。私のプログラムは中断することなく最初から最後まで確実に実行されますか?

私のプログラムは数ミリ秒で実行されることを考慮すると、私の環境では(本質的にタスクスイッチをオフにする)すべての割り込みを無効にすることは可能ですか?それとも、私にもっと力を与えるOSに行く必要がありますか?私は自分のOSカーネルを使ってこのタイミングコードを実行する方が良いでしょうか?私はアルゴリズムの最悪/最悪の場合の性能を証明しようとしています。したがって、タイミングと完全に一致している必要があります。

私は現在使用している、関連するコードは次のとおりです。私は適切にこのコードでオーバーフロー状態を処理していないよ気づく人に

inline uint64_t rdtsc() 
{ 
    uint64_t ret; 
    asm volatile("rdtsc" : "=A" (ret)); 
    return ret; 
} 

void test(int readable_out, uint32_t start, uint32_t end, uint32_t (*fn)(uint32_t, uint32_t)) 
{ 
    int i; 
    for(i = 0; i <= 100; i++) 
    { 
     uint64_t clock1 = rdtsc(); 
     uint32_t ans = fn(start, end); 
     uint64_t clock2 = rdtsc(); 

     uint64_t diff = clock2 - clock1; 

     if(readable_out) 
      printf("[%3d]\t\t%u [%llu]\n", i, ans, diff); 
     else 
      printf("%llu\n", diff); 
    } 
} 

余分なポイント。この段階では、プログラムがタイムスライスを失ったために突然ジャンプすることなく一貫した出力を得ようとしています。

私のプログラムのnice値は-20です。

このように、OSから中断することなくこのコードを実行することは可能でしょうか?または、私はring0の裸のハードウェアで実行する必要があるので、IRQとスケジューリングを無効にできますか?前もって感謝します!

+0

あなたはOProfileを試しましたか?:http://oprofile.sourceforge.net/news/ –

答えて

3

あなたは、テストの各反復する前に、すぐに第二またはスリープ状態ににnanosleep()を呼び出した場合は、各テストのための「新鮮な」タイムスライスを取得する必要があります。 100HZタイマ割り込みでカーネルをコンパイルし、10ms未満でタイムアウト関数が完了した場合、そのような方法でタイマー割り込みが発生するのを避けることができます。

他の割り込みを最小限に抑えるには、すべてのネットワークデバイスを構成解除し、スワップせずにシステムを構成し、それ以外の場合は休止状態であることを確認します。

+0

私はsched_yieldと似たような試みをしましたが、これは結果のセットを公正なビットで改善しました。 –

2

トリッキー。私はあなたがオペレーティングシステムを「オフ」にし、厳密なスケジューリングを保証できるとは思わない。

私はこれを逆さまにしています。それが非常に速く実行されるので、結果を配布するために何度も実行してください。標準的なUbuntu Linuxは狭い意味でのリアルタイムOSではないので、すべての代替アルゴリズムは同じ設定で実行されます。そして、あなたは分布を比較することができます(要約統計量から分位点までqqプロットから何かを使用して)。あなたはPython、R、またはOctaveなどと比較することができます。いずれにしても最適です。

+1

私はこれを使っています(したがってforループ)。問題は、外れ値が平均と標準偏差を捨てる残りのデータよりもかなり大きいことです。 –

+0

しかし今、我々は統計的な議論をしています:-)平均と標準偏差は正規分布を完全に表していますが、あなたのデータは正規分布していないかもしれません。可能であれば、尾部、特に「悪い」部分を分位数とプロットで記述してみてください。あなたが代替案と比較しているのはこの最悪の場合です...これはうまくいくかもしれません。 [もちろん、残りのディストリビューションにも記述が必要です...] –

+0

有効なポイントです。しかし、11,000〜12,000周りに90以上の価値を持ち、その後50,000を値打ちして全体を投げ捨てるのは、悔しいことです。それは、私が生成しようとしている統計に大きく干渉する余分な値です。 –

0

rootとして実行する場合は、sched_setscheduler()を呼び出して、自分にリアルタイムの優先度を与えることができます。ドキュメントを確認してください。

2

it's a single process OS以降、FreeDOSを実行しても離れることがあります。

のx86の世界ではDOSシステムのデ ファクトスタンダードであるMicrosoftのDOSの実装は、シングルユーザーである

、 シングルタスクのオペレーティング:

は、ここで、第2のリンクから関連するテキストですシステム。 はハードウェアへのRAWアクセスを提供し、 OS APIの最小レイヤーは しかファイルI/Oのようなものを提供しません。 オペレーティングシステムがなくても何かを得るには、 システムが組み込まれていると、これは という良いことです。多くの場合、 が必要です。

DOSには、 スレッドのコンセプトはありません。複数のコンセプトはありません。 進行中のプロセスです。アプリケーション ソフトウェアは さまざまなハードウェア、ソフトウェアを呼び出すと、 ディレクトリを読み、ファイルを実行するように いろいろなものを処理するために中断 ビデオとオーディオのようなもの、と を処理するために割り込み呼び出して、割り込みインタフェースの 使用を介してシステムコールを行い、だから 先に。

もちろん、エミュレータではなく実際のハードウェアに実際にFreeDOSをブートする最高のパフォーマンスを得るでしょう。

私は実際にを使用しています。 FreeDOSですが、あなたのプログラムは標準Cと思われるので、標準コンパイラがFreeDOS用であれば何でも使用できます。

+0

良いリンク - good ol 'DOSは、この種のもののために本当にうまくいく、実行中のプログラムにコンピュータをあきらめます。 –

1

chrt -f 99 ./testを使用すると、./testを最大リアルタイム優先度で実行できます。少なくとも、他のユーザ空間プロセスによって中断されることはありません。

また、linux-rtパッケージをインストールするとリアルタイムカーネルがインストールされ、スレッド割り込みによる割り込みハンドラの優先順位をより詳細に制御できます。

+0

さらに、LinuxのRTパッチ(http://rt.wiki.kernel.org/index.php/Main_Page)を使用することで、割り込みからの待ち時間を最小限に抑えます。 – bdonlan

2

プログラムがミリ秒単位で実行され、Linuxで実行されている場合は、 タイマ周波数(Linuxの場合)が100Hz(1000Hzではなく)に設定されていることを確認してください。 (cd/usr/src/linux; menuconfigを作って、「プロセッサタイプと機能」→「タイマー周波数」を参照してください) このようにしてCPUが10msごとに中断されます。

さらに、LinuxのデフォルトのCPUタイムスライスが100msであることを考慮して、素晴らしいレベルの-20では、数ミリ秒間実行していると、スケジュール解除されません。

また、fn()で101回ループしています。システムを適切に調整するためにfn()を使用しないでください。

印刷する回数が多い(これはスケジュールされたタイムスライスを消費するため、最終的にスケジュールなどを取得します...避けてください)。

RDTSC benchmark sample code

+0

ヒントをお寄せいただきありがとうございます。 –

0

Linux上でプリエンプティブスケジューリングを無効にする方法がありますが、必要ないかもしれません。 /proc/<pid>/schedstatまたは/procの他のオブジェクトの情報を使用して、先取りされたタイミングを知り、タイミングサンプルを無視することができます。

関連する問題