24

RDTSC命令のIntelマニュアルでは、 RDTSCが実際に実行されると、アウトオブオーダー実行が変更される可能性があると警告されています。CPUIDは命令ストリームをシリアル化するため、その前にCPUID命令を挿入することをお勧めします(CPUIDがアウトオブオーダーで実行されることはありません)。私の質問は単純です:彼らが命令をシリアル化する能力を持っていたのなら、なぜ彼らはRDTSCをシリアル化させなかったのですか?それの全体的なポイントは、サイクルの正確なタイミングを取得することであるように見えます。シリアル化命令を前に付けたくない状況はありますか?

新しいIntelCPUには、シリアル化されている個別のRDTSCP命令があります。Intelは、RDTSCの動作を変更するのではなく、別の命令を導入することを選択しました。これは、潜在的に故障したタイミングが必要な状況が必要であることを私に示唆しています。それは何ですか?

4

4 に答える 4

12

タイムスタンプカウンターは、Pentiumマイクロアーキテクチャーに導入されました。アウトオブオーダー実行は、PentiumProまで表示されませんでした。Intelはrdtsc(アーキテクチャ上または内部で)シリアル化を行うことができたかもしれませんが、汎用の時間測定には問題ない非シリアル化を維持し、必要に応じてシリアル化命令を追加するのはプログラマーに任せているようです。これは、測定のオーバーヘッドを減らすのに適しています。

これは、提供するドキュメントで実際に確認されており、PentiumおよびPentium / MMXに関する次のコメントがあります(4.2では、少し言い換えます)。

セクション4.1(PentiumProおよびPentiumII)で説明されているすべてのルールとコードサンプルは、PentiumおよびPentium/MMXにも適用されます。唯一の違いは、シリアル化にCPUID命令が必要ないことです。

そして、ウィキペディアから:

タイムスタンプカウンタは、Pentium以降のすべてのx86プロセッサに存在する64ビットレジスタです。

:::

Pentium Pro以降、Intelプロセッサはアウトオブオーダー実行をサポートしており、命令は実行可能ファイルに表示される順序で実行されるとは限りません。これにより、RDTSCが予想よりも遅く実行され、誤解を招くサイクルカウントが生成される可能性があります。


RDTSCPの2つの使用法の1つは、タイムスタンプ情報(名前のすぐそこにあります)に加えてプロセッサIDを提供することですRead Time-Stamp Counter *AND* Processor ID。これは、コアまたはソケット間で同期されていないTSCを備えたシステムで役立ちます(CPUの取得方法を参照)。 C ++からのx86_64のサイクルカウント?)。の追加のシリアル化プロパティによりrdtscp、関心領域の終わりでより便利になります(実行時間の測定に(rdtsc + lfence + rdtsc)と(rdtsc + rdtscp)の間に違いはありますか?を参照してください)。

于 2012-08-22T03:00:20.220 に答える
11

rdtscを使用してブランチが誤って予測するかどうかを確認しようとしている場合は、非シリアル化バージョンが必要です。

//math here
rdtsc
branch if zero to done
//do some work that always takes 1 cycle
done: rdtsc

分岐が正しく予測されている場合、デルタは小さくなります(おそらく負の値でさえありますか?)。ブランチが誤って予測された場合、デルタは大きくなります。

シリアル化バージョンでは、最初のrdtscが計算の終了を待機するため、分岐条件が解決されます。

于 2012-08-23T11:09:32.490 に答える
7

なぜ彼らはRDTSCをシリアル化しないのですか?それの全体的なポイントは、サイクルの正確なタイミングを取得することであるように見えます

ええと、ほとんどの場合、高解像度のタイムスタンプを取得することです。少なくとも一部の時間では、これらのタイムスタンプはパフォーマンスメトリックに使用されます。命令をシリアル化するには、パイプラインフラッシュが必要になる可能性があります。これは、CPUバウンドアプリケーションでは非常にコストがかかる可能性があります。

Intelは、RDTSCの動作を変更するのではなく、別の命令を導入することを選択しました。これは、潜在的に故障したタイミングが必要な状況が必要であることを私に示唆しています。

ほとんどの場合、動作を変更することは望ましくありません。RDTSCIntelの顧客は、それが新しい部品で何か違うことをしていることに気づいてがっかりするでしょう。

于 2012-08-22T02:54:38.873 に答える
2

わかりやすく説明しているように、RDTSC命令はインオーダーCPUに実装されているため、「シリアル化」命令の概念よりも前から存在しています。後でその動作を追加すると、それを使用するコードのメモリアクセス動作が変更されるため、一部の目的では互換性がなくなります。

代わりに、最近のCPUには、シリアル化として定義された関連RDTSCP命令があります(実際には、より強力です。メモリアクセスが行われただけでなく、すべての命令が発行されるまで待機することを約束します)。最新のCPUで実行している場合は、これを使用してください。

于 2012-08-22T17:18:38.963 に答える