問題タブ [rdtsc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - Intel のタイムスタンプ読み取り asm コードの例は、必要以上に 2 つのレジスタを使用していますか?
x86 CPU にあるタイムスタンプ レジスタ (TSR) を使用してベンチマーク パフォーマンスを測定することを検討しています。クロック速度の変化の影響を受けない単調な時間単位で測定するため、これは便利なレジスタです。とてもかっこいい。
これは、パイプライン同期に cpuid を使用するなど、TSR を使用して確実にベンチマークを行うための asm スニペットを示す Intel ドキュメントです。16ページ参照:
開始時刻を読み取るには、次のように表示されます (少し注釈を付けました)。
と の値を取得するためにスクラッチ レジスタが使用される理由が気にedx
なりeax
ます。movs を削除して、 と から TSR 値を読み取ってみませんedx
かeax
? このような:
これにより、2 つのレジスタが節約され、C コンパイラがスピルする必要が生じる可能性が低くなります。
私は正しいですか?それとも、それらの MOV は戦略的なものですか?
(そのシナリオでは命令の順序が逆になるため、停止時間を読み取るためにスクラッチ レジスタが必要であることに同意します。rdtscp、...、cpuid があります。cpuid 命令は rdtscp の結果を破棄します)。
ありがとう
c++ - constant_tsc と nonstop_tsc を備えた CPU で、時間がずれるのはなぜですか?
私はCPUでこのテストを実行していconstant_tsc
ますnonstop_tsc
ステップ 1: tsc のティック レートを計算します。
_ticks_per_ns
多数の観測値の中央値として計算します。rdtscp
順序どおりの実行を保証するために使用します。
ステップ 2:壁時計の開始時刻と tsc を計算する
ステップ 3: tsc からウォール クロック時間を返すことができる関数を作成する
ステップ 4:ループで実行し、壁時計の時間を表示clock_gettime
しますrdtscp
出力:
質問:
これら 2 つの方法で計算された時間が急速にずれていることはすぐにわかります。
私は、tsc レートが一定であるconstant_tsc
と仮定しています。nonstop_tsc
これは漂流中の船内時計ですか?このままではドリフトしないのではないでしょうか?
このドリフトの原因は何ですか?
それらを同期させるためにできることはありますか (非常に頻繁に再計算すること
_start_tsc
と_start_clock_time
ステップ 2 を除く)。
benchmarking - rdtscp を正しく使用するには?
《インテル® IA-32 および IA-64 命令セット アーキテクチャでコード実行時間をベンチマークする方法》に従って、以下のコードを使用します。
しかし実際には、誰かが以下のコードを使用しているのも見ています:
ご存知のように、RDTSCP は疑似シリアル化です。なぜ誰かが 2 番目のコードを使用するのでしょうか?私が推測する 2 つの理由は次のとおりです。
おそらく、ほとんどの場合、RDTSCP は完全な「順序どおりの実行」を保証できるのでしょうか?
効率化のために CPUID の使用を避けたいだけですか?