none
ターボブースト時の時間計測 RRS feed

  • 質問

  • ターボブーストをONにしているときに、

    QueryPerformanceCounter

    を使って時間計測をすると、CPUのクロック数が動的に変化してしまう為、

    正確な時間計測が出来ません。

    ターボブーストがONの時にも、正確に処理時間計測出来る方法を教えてください。

    #ターボブーストとハイパースレッディングを間違えて記載してしまいました。

    申し訳ございません。

    • 編集済み haru_can 2012年2月24日 9:34 用語を間違えた
    2012年2月22日 11:30

回答

  • 放置されているままのスレッドなので、もう誰も見ていないかもしれませんが、他の閲覧者のために記載しておきます。

    Windows XPおよびそれ以前のOSでは、QueryPerformanceCounter()/QueryPerformanceFrequency()はCPUクロックに基づいた値を返すため、Intel Turbo BoostやAMD Turbo Coreなどの動的オーバークロック機能を持つCPUでは正確な実時間を取得できないそうです。

    Windows Vista以降のOSと、HPETをサポートするM/Bの組み合わせであれば、同APIはHPETに基づいた実時間を取得するため、一応実時間計測用途には使える模様です。

    もし時間分解能が1msオーダーで構わないのであれば、マルチメディアAPIであるtimeBeginPeriod(), timeEndPeriod(), timeGetTime()を使う方法があります。

    .NETのSystem.Diagnostics.Stopwatchも同じ制約を持つものと思われます。

    引用元:

    http://d.hatena.ne.jp/shiku_otomiya/20100218/p1

    • 回答としてマーク 星 睦美 2013年12月20日 5:05
    2013年12月15日 12:02

すべての返信

  • 私はQueryPerformanceFrequencyを使って時間測定を行なっていますが、HyperThreading有効環境でそのような問題に遭遇したことがありません。

    http://msdn.microsoft.com/ja-jp/library/bb173458(v=vs.85).aspx

    の推奨事項の部分をよく読んでみてください。

    そーいえば、ADMのCPUでx64対応したばかりのやつは、QueryPerformanceXXXXになんかバグがあってMSからパッチが出ていたような・・・。

    2012年2月22日 12:40
  • ハイパースレッディングだから、というのは奇妙に聞こえました。

    QueryPerformanceFrequencyは周波数を取得するだけで、実際に時間計測に使用するのはQueryPerformanceCounterですよね? 基本に立ち返ってドキュメントを読むと

    On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL). To specify processor affinity for a thread, use the SetThreadAffinityMask function.

    とあります。時間計測しているスレッドをSetThreadAffinityMaskで特定のCPUに固定しましょう。

    # 確かにHTだと同一コアの別CPUに割り振られる可能性がそれなりに高いかもしれませんね。

    2012年2月22日 23:25
  • 放置されているままのスレッドなので、もう誰も見ていないかもしれませんが、他の閲覧者のために記載しておきます。

    Windows XPおよびそれ以前のOSでは、QueryPerformanceCounter()/QueryPerformanceFrequency()はCPUクロックに基づいた値を返すため、Intel Turbo BoostやAMD Turbo Coreなどの動的オーバークロック機能を持つCPUでは正確な実時間を取得できないそうです。

    Windows Vista以降のOSと、HPETをサポートするM/Bの組み合わせであれば、同APIはHPETに基づいた実時間を取得するため、一応実時間計測用途には使える模様です。

    もし時間分解能が1msオーダーで構わないのであれば、マルチメディアAPIであるtimeBeginPeriod(), timeEndPeriod(), timeGetTime()を使う方法があります。

    .NETのSystem.Diagnostics.Stopwatchも同じ制約を持つものと思われます。

    引用元:

    http://d.hatena.ne.jp/shiku_otomiya/20100218/p1

    • 回答としてマーク 星 睦美 2013年12月20日 5:05
    2013年12月15日 12:02