私は、プログラムのCPUサイクルを測定するためにrdtscとcpuid命令(揮発性インラインアセンブリ命令を使用)を使用しています。 rdtsc命令は、スピード最適化-o2 -fomit-frame-pointer)とWindows(スピード最適化オプションCコンパイラを使用してMicrosoft Visual Studio 2008(VC 9.0と思う))を使って、Linux上の私のプログラムに現実的な結果をもたらします。rdtscでのgcc最適化の問題
最近、私は多くのテーブルルックアップとこのようなものを使用する新しいプログラムを実装しました。しかし、Linux上でgccを最適化したこのプログラムのrdtsc測定値は、私が期待しているよりも誤った測定(非常に少ないCPUサイクル数)になります。 Windows上で実行されている同じプログラムのrdtsc測定値(上記で述べた最適化とコンパイラでコンパイルされたもの)は現実的であり、期待に合致しています。
私の質問は、gccの最適化は、上記の動作を生成するいくつかの場所の揮発性アセンブリの命令を移動する方法はありますか?タイマーの
私のコードは以下のとおりである:
#define TIMER_VARS \
uint32 start_lo, start_hi; \
uint32 ticks_lo, ticks_hi
#define TIMER_START() \
__asm__ __volatile__ \
("rdtsc" \
: "=a" (start_lo), "=d" (start_hi) /* a = eax, d = edx*/ \
: /* no input parameters*/ \
: "%ebx", "%ecx", "memory")
#define TIMER_STOP() \
__asm__ __volatile__ \
("rdtsc" \
"\n subl %2, %%eax" \
"\n sbbl %3, %%edx" \
: "=&a" (ticks_lo), "=&d" (ticks_hi) \
: "g" (start_lo), "g" (start_hi) \
: "%ebx", "%ecx", "memory")
いくつかのボディは、この上でいくつかのアイデアを提案することができれば、私は非常に感謝するでしょう。
おかげで、
シングルコアとマルチコアのマシンの動作に違いがあります(マルチコアマシンは時々クロックを同期させます)。また、tdtscがキャッシュやTLBをドロップすることもありますが、インテルとAMDの違い、チップ間に違いがあります染料版。また、rdtscは、トラップによって処理される可能性のある制限された命令です(可能性があります)。 (私はVMがそういうことをするだろうと思う)コンパイラにはほとんど影響がないと思う。コンパイラアセンブリの出力を確認してください。 – wildplasser
Intelシングルコアプロセッサ搭載のマシンでこの問題に直面しています。 – Junaid
私はタイマーのコードを追加しました。これがもう一つの手がかりを与えるかもしれないかもしれない。 – Junaid