1

現在、同じ環境で 2 つの異なるプログラミング言語による操作を完了するのにかかるクロック サイクル数を測定しようとしています。(OSを使用しない場合)

現在、Qemu-i386エミュレーターを使用しており、rdtscを使用してクロックサイクルを測定しています。

/* Return the number of CPU ticks since boot. */
static inline u64 rdtsc(void)
{
    u32 hi, lo;
    // asm("cpuid");
    asm("rdtsc" : "=a" (lo), "=d" (hi));
    return ((u64) lo) | (((u64) hi) << 32);
}

動作前後の rdtsc の差を取ると、クロック サイクル数が得られます。

    start_time = rdtsc();
    operation();
    stop_time = rdtsc();
    num_cycles = stop_time-start_time;

しかし、数百回以上の繰り返しを行っても、その差は一定ではなく、数千サイクルごとに異なります。

  • クロックサイクルを測定するより良い方法はありますか?

  • また、Qemu の入力パラメーターとして周波数を提供する方法はありますか? 現在、私は使用しています

qemu-system-i386 -kernel out.elf

4

1 に答える 1

3

QEMU エミュレーションでゲスト ソフトウェアのベンチマークを試みることは、せいぜい非常に困難です。QEMU のエミュレーションには、実際のハードウェア CPU のようなパフォーマンス特性はありません。浮動小数点など、ハードウェアでは高速な一部の操作は、QEMU では非常に低速です。私たちはキャッシュをモデル化しておらず、データ セットがキャッシュ ラインまたは L1/L2/etc キャッシュ サイズの制限に達したときに表示されるパフォーマンス カーブのようなものは表示されません。等々。

最新の CPU のパフォーマンスにおける重要な要素には、(少なくとも) 次のものが含まれます。

  • 実行された生の命令数
  • TLB ミス
  • 分岐予測ミス
  • キャッシュミス

-icount オプションを使用すると、QEMU は最後の 3 つを追跡せず、最初の 1 つだけを追跡します。(特に、-icount を使用しないと、エミュレーション中のゲストに提供される RDTSC 値は、多かれ少なかれホスト CPU の RDTSC 値にすぎないため、これを使用して測定された時間には、ゲスト コードの変換に費やされた時間を含む、あらゆる種類の QEMU オーバーヘッドが含まれます。)

x86 ホストを使用していると仮定すると、-enable-kvm オプションを使用して、これを KVM 仮想マシンで実行できます。そうすれば、少なくともハードウェア CPU の実際のパフォーマンスを確認できますが、他のホスト プロセスが VM と CPU を競合するため、オーバーヘッドからのノイズがまだ見られます。

于 2015-11-27T11:00:28.133 に答える