タイムスタンプカウンターは、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)の間に違いはありますか?を参照してください)。