RDTSCが一定のレートカウンター値を返すかどうかを検出する方法は?
質問
AMDとIntelの両方からの最も新しいCPUは、RDTSCを一定の速度カウンターとして実装しているようで、ターボブーストや省電力設定などの結果として頻度が変化することによって引き起こされる問題を回避します。
RDTSCは、オーバーヘッドがはるかに低いため、Queryperformancecounterよりもパフォーマンス測定にはるかに適しているため、可能な限り使用したいと思います。
RDTSCが一定のレートカウンターであるかどうかを確実に検出するにはどうすればよいですか?
解決
使用できます CPUID
あなたに伝えるために。から ドキュメント cpuid fn8000_0007_edxビット8:
Tscinvariant:TSC Invariant. 。 TSCレートは、すべてのP-States、C-Statesにわたって不変であることが保証され、Grant Transitions(STPCLKスロットリングなど)を停止します。したがって、TSCは時間の源として使用するのに適しています。 0 =そのような保証は作成されておらず、ソフトウェアはTSCを時間の源として使用しようとすることを避ける必要があります。
他のヒント
元の質問が尋ねられてから長い時間であることは知っていますが、プロセッサの生成/モデルをチェックすることは絶対に間違ったことであることを指摘できます。まず第一に、コードを間違えて将来の生成プロセッサで動作しないようにするのは非常に簡単です(ファミリ/モデル番号は常に「線形」ではないため)、次に、プロセッサが「後の」という理由だけでファミリー/モデル」これが機能することを知っているものよりも、機能がそこにあることは保証ではありません。おそらくそうですが、これをひどく行うコードをたくさん見てきたので、「新しいプロセッサが出てきて、コードが間違っている」。
CPUIDビットを使用して、プロセッサに正しいビットがあるかどうかを確認します。
使用するだけです CPUID
を検出します CPUの生成, 、定数カウンターを使用しているかどうかを確認します。ただし、代わりにプロファイリングAPIを使用することをお勧めしますが、AMDのCodeanalyst SDKのようなものはうまくいくでしょう
1秒でoティック数をカウントし、 /proc /cpuinfoで情報に基づいたクロックと比較します。ダイナミッククロックが無効になっているだけで動作します。ソースを参照してください: https://github.com/petersenna/rdtscbench