Ubuntu 8.10でRDTSCを使用してコードの時間を計ろうとしています(私が試した他のプロファイリングソフトウェアは、必要な解像度まで時間を計ることができません)。しかし、タスクの切り替えや割り込みの発生から外れ値が発生し続け、統計が無効になっています。
私のプログラムが数ミリ秒で実行されることを考えると、私の環境ですべての割り込み (本質的にタスク スイッチをオフにする) を無効にすることは可能ですか? それとも、より強力な 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);
}
}
このコードでオーバーフロー条件を適切に処理していないことに気付いた人への追加のポイント。この段階では、プログラムがタイムスライスを失ったために突然ジャンプすることなく、一貫した出力を得ようとしています。
私のプログラムの適切な値は -20 です。
要約すると、OS からの中断なしにこのコードを実行することは可能ですか? それとも、IRQ とスケジューリングを無効にできるように、リング 0 のベア ハードウェアで実行する必要がありますか? 前もって感謝します!