問題タブ [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.

0 投票する
2 に答える
1180 参照

c - Intel のタイムスタンプ読み取り asm コードの例は、必要以上に 2 つのレジスタを使用していますか?

x86 CPU にあるタイムスタンプ レジスタ (TSR) を使用してベンチマーク パフォーマンスを測定することを検討しています。クロック速度の変化の影響を受けない単調な時間単位で測定するため、これは便利なレジスタです。とてもかっこいい。

これは、パイプライン同期に cpuid を使用するなど、TSR を使用して確実にベンチマークを行うための asm スニペットを示す Intel ドキュメントです。16ページ参照:

http://www.intel.com/content/www/us/en/embedded/training/ia-32-ia-64-benchmark-code-execution-paper.html

開始時刻を読み取るには、次のように表示されます (少し注釈を付けました)。

と の値を取得するためにスクラッチ レジスタが使用される理由が気にedx なりeaxます。movs を削除して、 と から TSR 値を読み取ってみませんedxeax? このような:

これにより、2 つのレジスタが節約され、C コンパイラがスピルする必要が生じる可能性が低くなります。

私は正しいですか?それとも、それらの MOV は戦略的なものですか?

(そのシナリオでは命令の順序が逆になるため、停止時間を読み取るためにスクラッチ レジスタが必要であることに同意します。rdtscp、...、cpuid があります。cpuid 命令は rdtscp の結果を破棄します)。

ありがとう

0 投票する
3 に答える
4848 参照

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 を除く)。

0 投票する
0 に答える
740 参照

benchmarking - rdtscp を正しく使用するには?

《インテル® IA-32 および IA-64 命令セット アーキテクチャでコード実行時間をベンチマークする方法》に従って、以下のコードを使用します。

しかし実際には、誰かが以下のコードを使用しているのも見ています:

ご存知のように、RDTSCP は疑似シリアル化です。なぜ誰かが 2 番目のコードを使用するのでしょうか?私が推測する 2 つの理由は次のとおりです。

  • おそらく、ほとんどの場合、RDTSCP は完全な「順序どおりの実行」を保証できるのでしょうか?

  • 効率化のために CPUID の使用を避けたいだけですか?