[PR]衝撃!あなたの本当の裏の顔!:実は貴方はΟΔ県出身?ここで分かる真実

- CPUのクロックの計測 -

yosirin-hello / yosi-s@galaxy.ocn.ne.jp

1. はじめに

 CPUのクロック数を知ることができれば, RDTSC命令と組み合わせることによって, 例えばタイマーを作ることができます. このTipsで, CPUのクロック数を用いたアプリケーションの開発に役立ててもらえれば幸いです. 今回は, - read-time stamp counter (RDTSC)命令の利用方法 - で紹介したRDTSC命令で簡易的(それほど正確ではないが使えないことはない)にCPUのクロックの計測をする方法を紹介します.
2. 計測するには

 CPUのクロックを計測する方法を考えます. CPUのクロックは, 1秒間にどれだけクロックが発生しているか知ることができれば計測できます. 今回は簡易的にクロックを計測するのが目標なのでWindowsAPIのSleep()関数を使って1秒間のブランクを発生させてCPUのクロックを計測することにします. (Fig1.)

Fig1. CPUのクロックと計測概念
3. 実装

Fig1. の考え方で実装してみます. List1.のプログラムはCPUのクロック数を5回表示するようにしてみました.

List1. 簡易的にCPUのクロックを計測するプログラム
#include <stdio.h>
#include <windows.h>

void main(void)
{
    LARGE_INTEGER cycle;
    double CPU_Clock;

    for( int i = 0; i < 5;i++ ) {
        __asm {
            cpuid
            rdtsc
            mov   cycle.LowPart, eax
            mov   cycle.HighPart, edx
        } // (1)

        Sleep(1000); // (2)

        __asm {
            cpuid
            rdtsc
            sub   eax, cycle.LowPart
            sub   edx, cycle.HighPart
            mov   cycle.LowPart, eax
            mov   cycle.HighPart, edx
        } // (3)

        CPU_Clock = (double)cycle.LowPart;
        CPU_Clock /= 1000000; // (4)
        printf("%4.2lf[MHz]\n", CPU_Clock );
    }
}
List1. の実行結果
Fig2. 実行結果

(1) 現在のクロック数をcycleに格納します.

(2) スレッドを1秒間停止させるためにSleep(1000)を実行します. (パラメータは[ms]の単位で指定)

(3) (1)を実行してから約1秒が経過した時点でのクロック数と, 1秒前のクロック数を引いてcycleに格納します.

(4) CPU_Clockを1000000で割るとこによって, CPUのクロックの単位を[MHz]に変換しています.
4. 結論

・ 一番初めに実行した結果の誤差が少し大きい

・ このプログラムを実行したマシンのクロックは1.5GHzなので, ほぼ正確に測定できている

・ 精密な測定をするにはもう少しプログラムの改良をする必要がある.

・Sleep()関数を用いているのでCPUの負担が非常に低い
5. 参考文献

1. Using the RDTSC Instruction for Performance Monitoring,
http://cedar.intel.com/software/idap/media/pdf/rdtscpm1.pdf
2. Microsoft MSDN Library, プラットフォームSDK Sleep
6. 改訂履歴

改訂 履歴 日付
1.0 初公開 02/13/2002
1.1 Fig1. Fig2. を追加 02/14/2002


Copyright © 2002 yosirin-hello All rights reserved.


[PR]《完全無料》ゲームサイト登場:追加料金一切なしで安心遊び放題