8

C でいくつかの非常に短い操作のマイクロ ベンチマーク コードを書いています。たとえば、渡された引数の数に応じて、空の関数を呼び出すのに必要なサイクル数を測定しています。

現在、各操作の前後にRDTSC命令を使用してタイミングを計り、CPUのサイクル数を取得しています。ただし、最初の RDTSC の前に発行された命令が、測定している実際の命令の速度を低下させる可能性があることを懸念しています。また、2 番目の RDTSC が発行される前に完全な操作が完了しないのではないかと心配しています。

新しい命令が発行される前に、実行中のすべての命令を強制的にコミットする x86 命令を知っている人はいますか? CPUIDがこれを行う可能性があると言われましたが、そう言っているドキュメントを見つけることができませんでした.

4

1 に答える 1

9

私の知る限り、特にパイプラインを「排出」する命令はありません。これは、シリアル化命令を使用して簡単に実現できます。

CPUID はシリアル化命令であり、まさに探しているものを意味します。すべての命令は、CPUID 命令の前に実行されることが保証される前に発行されます。

したがって、次のことを行うと、目的の効果が得られます。

cpuid
rdtsc
# stuff
cpuid
rdtsc

ただし、余談ですが、これを行うことはお勧めしません。あなたの「もの」は、あなたが制御できない他の多くのもの (CPU キャッシュ、システム上で実行されている他のプロセスなど) の影響を受ける可能性があり、それらをすべて排除することはできません。正確なパフォーマンス統計を取得する最善の方法は、測定したい操作を少なくとも数百万回実行し、バッチの実行時間を平均化することです。

編集: CPUID のほとんどの命令リファレンスでは、 NASM マニュアルの付録 Bなど、そのシリアライズ プロパティについて言及されています。

編集 2 :この関連する質問も参照してください。

于 2009-02-22T18:05:48.963 に答える