質問

時々、TSCを読むコードが遭遇します rdtsc 指示、しかし電話 cpuid 直前。

なぜ電話しているのか cpuid 必要?私はそれがTSC値を持つさまざまなコアと関係があるかもしれないと気づきましたが、何が まさに これらの2つの指示を順番に呼び出すと起こりますか?

役に立ちましたか?

解決

秩序外の実行を防ぐためです。現在、ウェブから消えてしまったリンク(しかし、それが消える前にここで偶然にコピーされた)から、このテキストは、ジョン・エッカーダルによる「パフォーマンス監視」というタイトルの記事からのものです。

Pentium ProおよびPentium IIプロセッサは、順序外の実行手順をサポートして、プログラムしたときに別の順序で実行できます。これは、世話をしないとエラーの原因となる可能性があります。

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

他のヒント

2つの理由:

  • Paxdiabloが言うように、CPUがCPUIDオペコードを見たとき、以前のすべての命令が実行され、その後の指示が実行される前にCPUIDが実行されることを確認します。このような命令がなければ、CPU実行パイプラインは、時間を過ごしたい命令の前にTSCを実行することになります。
  • かなりの割合のマシンは、コア間でTSCレジスタを同期できません。あなたの中でそれを読みたいです a 馬の口 - 自分をノックアウトします http://msdn.microsoft.com/en-us/library/ee417693%28vs.85%29.aspx. 。したがって、TSC測定値間の間隔を測定する場合、それらが同じコアで取得されない限り、効果的にランダムであるが、おそらく一定の間隔を参照)を導入します - ブートアップ後も簡単に数秒(はい秒)になる可能性があります。これは、BIOSが単一のコアで実行されていた時間を効果的に反映しており、他のコアをキックオフする前に、さらに、厄介な電力節約オプションがある場合は、さまざまな周波数で実行されるコアまたは再びシャットダウンすることによって引き起こされるドリフトが増加します。したがって、TSCレジスタを同じコアに読んでいるスレッドを釘付けしていない場合は、何らかの種類のクロスコアデルタテーブルを構築し、各TSCサンプルのコアID(CPUIDで返される)を順番に知る必要があります。このオフセットを補うため。それがRDTSCと一緒にCPUIDを見ることができるもう1つの理由であり、実際に新しいRDTSCPで多くのOSが追加のTSC_AUX [31:0]データにコアID番号を保存している理由。 (Core i7およびAthlon 64 X2から入手可能、RDTSCPはあらゆる点ではるかに優れた選択肢です。OSは通常、前述のようにコアIDを提供します。 命令の並べ替えを防ぐ)。

CPUIDはシリアル化であり、RDTSCの秩序外の実行を防止しています。

最近では、代わりにLFENCEを安全に使用できます。 Intel CPUの命令ストリーム(ただし、メモリに格納されない)でシリアル化として文書化されており、現在はSpecterのマイクロコード更新後もAMDにも記載されています。

https://hadibrais.wordpress.com/2018/05/14/the-significance-of-x86-lfence-intruction/ Lfenceについて詳しく説明しています。

参照してください https://www.intel.com/content/dam/www/public/us/en/documents/white-papers/ia-32-ia-64-benchmark-code-execution-paper.pdf RDTSCを使用する方法についてp これにより、CPUID(またはLFENCE)が時限から外れています。

LFENCE     ; (or CPUID) Don't start the timed region until everything above has executed
RDTSC           ; EDX:EAX = timestamp
mov  ebx, eax   ; low 32 bits of start time

   code under test

RDTSCP     ; built-in one way barrier stops it from running early
LFENCE     ; (or CPUID) still use a barrier after to prevent anything weird
sub  eax, ebx   ; low 32 bits of end-start

参照してください CPUサイクルカウントを取得しますか? constant_tscやnonstop_tscなどのRDTSC警告の詳細については。

ボーナスとして、RDTSCPはコアIDを提供します。コア移行を確認する場合は、開始時間にもRDTSCPを使用できます。しかし、あなたのCPUがある場合 constant_tsc 機能、パッケージ内のすべてのコアにはTSCが同期される必要があるため、通常、最新のX86ではこれを必要としません。

@Tonyの回答が指摘しているように、代わりにCPUIDからコアIDを取得できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top