CPUのクロックの速度が、何MHzか読んで来るには?

[戻る]
ちな 2006/10/12(木) 18:44:45
VC++6での使用です。

くえー 2006/10/13(金) 09:05:46
レジストリの
HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor
に~MHzというのがあります。
それを読めばいいと思います。

http://www.kt.rim.or.jp/~yuta/prog/win32/Name/sys_ver.html

ちな 2006/10/14(土) 10:58:56
くえーさん
ありがとうございます。
でも、このレジストリの値の取得って、
fopenして、fgetcとかで出来るんでしょうか?
それとも、ご指摘のサイトに書いてあるような
GetVersionEx
で行うとか?
ちょっと、値を読むシーケンスがわからなかったので、
お聞きしました。

task 2006/10/14(土) 12:22:08
計測するなら、こんな方法もありますよ。

int cpu_clk(){
    __int64 c1 = 0, c2 = 0;
    DWORD flag, mask = 0x10;
    DWORD wait = 100;
    DWORD time;

    __asm{
        mov eax, 01H;
        cpuid;
        mov flag, edx;
    }

    if(flag & mask){   // rdtsc 命令のサポートチェック
        time = GetTickCount() + wait();
        __asm{
            rdtsc;  // 電源投入時からのクロックのカウント数
            mov dword ptr[c1],  eax;
            mov dword ptr[c1+4], edx;
        }

        while(time > GetTickCount()); // 0.1秒待つ
        
        __asm{
            rdtsc;
            mov dword ptr[c2],  eax;
            mov dword ptr[c2+4], edx;
        }
    }
    return int((c2 - c1) / wait / 1000); // [MHz]にするため1000で割る
}

[GHz]位なら、0.1秒位で十分だと思いますが、もう少し低いクロックを計るなら、waitを大き
くしたほうが良いと思います。

while(time > GetTickCount()); の部分を Sleep にしても出来ますが、ノートパソコンの場
合、負荷をかけないとうまく測定できないみたいです。

瀬戸っぷ [E-Mail] 2006/10/14(土) 12:26:40
> でも、このレジストリの値の取得って、
> fopenして、fgetcとかで出来るんでしょうか?

ファイルとしてアクセスするわけではないので、Cの標準関数では無理です。

> ちょっと、値を読むシーケンスがわからなかったので、
> お聞きしました。

Win32SDKなのか、MFCなのかで微妙に変わると思われますが…
RegOpenKeyEx()/RegQueryValueEx()/RegCloseKey()等でしょうか。
ググるとそれなりにみつかると思います。

task 2006/10/14(土) 12:29:45
訂正です。
__int64 c1, c2 → unsigned __int64 c1, c2

task 2006/10/14(土) 13:41:51
ごめんなさいもう一個訂正
GetTickCount() + wait(); → GetTickCount() + wait;

古いスレッドには追加発言できません。