18

命令で TSC を読み取るが、直前にrdtsc呼び出すコードに遭遇することがあります。cpuid

通話はなぜcpuid必要なのですか?TSC値を持つ異なるコアと関係があるかもしれないことは理解していますが、これら2つの命令を順番に呼び出すと、正確にはどうなりますか?

4

3 に答える 3

18

アウトオブオーダー実行を防ぐためです。Webから消えたリンク(ただし、消える前に偶然ここにコピーされた)から、このテキストは、あるJohnEckerdalによる「パフォーマンスモニタリング」というタイトルの記事からのものです。

PentiumProおよびPentiumIIプロセッサは、アウトオブオーダー実行命令をサポートしており、プログラムしたときに別の順序で実行される場合があります。世話をしないと、これがエラーの原因になる可能性があります。

これを防ぐには、プログラマーは命令キューをシリアル化する必要があります。これは、RDTSC命令の前にCPUID命令のようなシリアル化命令を挿入することで実行できます。

于 2010-05-27T02:32:39.867 に答える
6

2つの理由:

  • paxdiabloが言うように、CPUがCPUIDオペコードを検出すると、後続の命令が実行される前に、前のすべての命令が実行され、次にCPUIDが実行されることを確認します。このような命令がないと、CPU実行パイプラインは、タイミングを合わせたい命令の前にTSCを実行してしまう可能性があります。
  • かなりの割合のマシンが、コア間でTSCレジスタを同期できません。馬の口から読みたい場合はhttp://msdn.microsoft.com/en-us/library/ee417693%28VS.85%29.aspxにアクセスしてください。。したがって、TSC読み取り値間の間隔を測定する場合、同じコアで取得されない限り、実質的にランダムですが、おそらく一定の間隔(以下を参照)が導入されます-起動後すぐに数秒(はい秒)になる可能性があります。これは、BIOSが他のコアを開始する前に単一のコアで実行されていた時間を効果的に反映します。さらに、省電力オプションが厄介な場合は、異なる周波数で実行されているコアまたは再度シャットダウンすることによって発生するドリフトが増加します。したがって、TSCレジスタを読み取るスレッドを同じコアに釘付けにしていない場合は、ある種のクロスコアデルタテーブルを作成し、各TSCサンプルのコアID(CPUIDによって返される)を順番に知る必要があります。このオフセットを補正します。これが、RDTSCと一緒にCPUIDを表示できるもう1つの理由です。実際、新しいRDTSCPでは、多くのOSがコアID番号を返される追加のTSC_AUX [31:0]データに格納している理由です。(Corei7およびAthlon64 X2から利用可能で、RDTSCPはすべての点ではるかに優れたオプションです-OSは通常、前述のように、TSC読み取りにアトミックなコアIDを提供します。命令の並べ替えを防ぎます)。
于 2012-06-08T06:53:33.130 に答える