unsigned long long が eax/edx に格納されることは知っていますが、1 つの rdtsc 命令を実行するのに必要なクロック サイクル数を調べるにはどうすればよいでしょうか?
編集:このようなものは機能しますか?
.globl rdtsc
rdtsc:
rdtsc
movl %eax, %ecx
movl %edx, %ebx
rdtsc
subl %ecx, %eax
subl %ebx, %edx
戻る
unsigned long long が eax/edx に格納されることは知っていますが、1 つの rdtsc 命令を実行するのに必要なクロック サイクル数を調べるにはどうすればよいでしょうか?
編集:このようなものは機能しますか?
.globl rdtsc
rdtsc:
rdtsc
movl %eax, %ecx
movl %edx, %ebx
rdtsc
subl %ecx, %eax
subl %ebx, %edx
戻る
繰り返し実行rdtsc
して、連続する戻り値の違いを調べることができます。もちろん、大規模なスパイクを引き起こすコンテキスト スイッチなどを念頭に置く必要があります。
議論については、rdtsc、多すぎるサイクルを参照してください。
あなたのコードは正しいように見えますが、何度か実行して、出てくる最短の値を使用する必要があります。
コード シーケンス中に経過したクロック サイクルをカウントするために rdtsc を使用する場合のオーバーヘッドはどれくらいですか。したがって、カウントコードは基本的に次のとおりです (32 ビットの例):
rdtsc
mov dword ptr [mem64],eax
mov dword ptr [mem64+4],edx
; the code sequence to clock would go here when you're clocking it
rdtsc
sub eax,dword ptr [mem64]
sbb edx,dword ptr [mem64+4] ; I always mix up sbb and sub so this may be incorrect
その結果は、コード シーケンスのタイミングを計るときの「rdtsc オーバーヘッド」の実際の経過時間です。
rdtsc オーバーヘッドを差し引いたら、パイプライン処理とオーバーラップ処理が完了したかどうかを考慮する必要があります。私は、時限シーケンスがおそらく 30 サイクル未満で実行される場合、考慮する必要がある未完了のパイプラインの問題がある可能性があると想定しています。シーケンスが 100 サイクルを超える場合、問題が発生する可能性がありますが、無視される場合があります。
では、30 から 100 の間はどうでしょうか。確かに灰色です。