私は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とスケジューリングを無効にできますか?前もって感謝します!
あなたはOProfileを試しましたか?:http://oprofile.sourceforge.net/news/ –