6

32 ビットおよび 64 ビットの Windows で、Intel および AMD プロセッサの両方で定期的に正確な CPU 周波数値を提供する何らかのライブラリを探しています。

これの目的は、特定のコンピューターの CPU 負荷を正確に測定することです。問題は、呼び出しQueryPerformanceCounter()がクロック ティック (アクティビティの継続時間を測定するために使用) を返しますが、SpeedStep または TurboBoost のために基になる CPU 周波数が一定でないことです。BIOS で SpeedStep / TurboBoost をオフにしていて、負荷に基づく CPU 周波数のスケーリングを妨げていないコンピューターをいくつか見つけました。

CPU周波数の変化を検出するために使用できるライブラリがあるかどうかを確認しようとしています(ThrottlestopWindows 7CPU-Zの[概要]タブのResource Monitorように)他の測定値とともにこの情報を照会して保存できるようにします. 他のツールが動的な周波数の変化を示している場合でも、常に 100% の CPU 周波数を返すコンピューターがあるため、パフォーマンス カウンターは信頼できる情報を返していないようです。

そのようなライブラリを検索しましたが、ほとんどの結果は役に立たないガジェットなどで返されます。

4

3 に答える 3

7

高解像度タイマーとクロックサイクルカウンターを組み合わせて、現在のクロックレートを計算できます。最近のCPUでは、サイクルカウンターは次の関数で読み取ることができます。

static inline uint64_t get_cycles()
{
  uint64_t t;
  asm volatile ("rdtsc" : "=A"(t));
  return t;
}

これはCPUごとであるため、プログラムがCPU内を移動すると、問題が発生することに注意してください。プラットフォームでのCPU固定技術について知っている場合は、それらを試してみることをお勧めします。

<chrono>高解像度の時間測定には、 ;のツールを使用できます。これは、このトピックに関する私の半有用な投稿です。

于 2012-05-08T19:09:02.687 に答える
1

どうやってやるかではなく、何をしようとしているのかに集中するようにしてください。

あなたの究極の目標は何ですか?

あなたが言うように、「特定のコンピューターの CPU 負荷を測定」しようとしている場合、Windows では「PdhOpenQuery」および「Pdh*」ファミリー関数を使用することをお勧めします。

このSOの回答も参照してください:

プロセス内からCPUとメモリの消費量を決定する方法は?

于 2012-05-08T19:23:45.030 に答える
1

__rdtsc 組み込み関数 (Visual Studio では #include "intrin.h") を調べてみてください。

これにより、x86/x64 関数 RDTSC (タイムスタンプの読み取り) を介してプロセッサから直接クロック カウントが得られます。

于 2012-05-10T08:47:01.670 に答える