none
CPUの物理コア数 RRS feed

  • 質問

  • Core i7 で物理コア数を取得したいのですが、
    GetLogicalProcessorInformation を使えば取得出来るものの、
    古い OS ではこの API は使えません。
    CPUID で取得する方法があるらしいのですが、
    CPUID(4) の EAX(bit31-26) では 16 が返ってきます。
    IntelR Processor Identification and the CPUID Instruction
    を探してみても、それらしいのを見つけられませんでした。
    どなたか物理コア数の取得方法を教えて下さいませんでしょうか。
    2010年4月27日 9:28

回答

すべての返信

  • 古いOSと単に書いてしまうとどこまで対応できれば良いのかと言う話になると思います。

    それこそマルチコアを想定していなかった頃のOSまで考えねばならないの?とかとか。

     


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    2010年4月27日 9:33
  • そうですよね。CPUID命令を搭載していない486プロセッサはどうするの? とか。
    ある程度新しくていいのなら、ACPI BIOS辺りから取得するのではないでしょうか?

    2010年4月27日 10:47
  • 説明不足で失礼しました。

    Windows2000 はマルチコア自体対応していないので、

    こちらには対応する必要はありません。

    なので WindowsXP 以降で想定しております。

    2010年4月27日 11:03
  • 同じく説明不足で済みません。

    CPUID命令に対応していない CPU に関しても、

    考慮する必要はありません。

    ACPI BIOS からの取得とは、どういった物でしょうか?

    検索してみたのですが、それっぽいのが見つからず…。

    2010年4月27日 11:07
  • GetLogicalProcessorInformation http://msdn.microsoft.com/en-us/library/ms683194.aspxは、Windows XP SP3からサポートなので、使っちゃってもいいんじゃないでしょうか?
    SP2のサポートも7月で切れることですし。


    jzkey
    • 回答の候補に設定 山本春海 2010年4月30日 4:15
    2010年4月27日 13:21
  • ご回答、ありがとうございます。

    なるほど、XPもSP3では使えるのですね。

    でもSP2は未だに使ってる人が多く、

    MSのサポートが切れても、こちらで切るのは難しく…。

    2010年4月28日 1:50
  • GetLogicalProcessorInformation() での処理を確認したら、どうやらこの API は SystemInformationClass に 0x49 を
    セットして Native API の NtQuerySystemInformation を呼び出しているだけのようですね。

    SystemInformationClass = 0x49 がなんなのか、ちょっとググってみたら、なんと SysInternals のフォーラムに情報がありました。
    (名前からして、そのものですねwww)

    http://forum.sysinternals.com/topic5127_page5.html

    ---------------------------------------------
                :
                :
        SystemSecurityMode, // 70
        SystemNotImplemented14,
        SystemWatchdogInformation,
        SystemLogicalProcessorInformation,  // ☆ <== 73 [0x49]
                :
                :
    ---------------------------------------------

    この番号からみて、そんなに新しくはないようなので、XP SP2 の時からサポートしていたんじゃないかな...と思います。
    なので以下の様な実装を行えば、もしかしたら SYSTEM_LOGICAL_PROCESSOR_INFORMATION 構造体情報が取得出来るのでは?

    ---------------------------------------------
    1. GetModuleHandle() で "ntdll.dll" のモジュール ハンドルを取得。
    2. GetProcAddress() で、ntdll!NtQuerySystemInformation ルーチン アドレスを取得。
    3. NtQuerySystemInformation() の 1st パラメータに SystemLogicalProcessorInformation (0x49)、
       2nd, 3rd パラメータに SYSTEM_LOGICAL_PROCESSOR_INFORMATION 構造体へのポインタとサイズ、
       4th パラメータに ULONG 変数へのポインタをそれぞれセットしてコール。
    ---------------------------------------------

    なお、NtQuerySystemInformation() API の詳細に関しては、下記 MSDN サイトに情報があります。
    (NtQuerySystemInformation と ZwQuerySystemInformation は基本的に同義です。)

    ---------------------------------------------
    ZwQuerySystemInformation Function
    http://msdn.microsoft.com/en-us/library/ms725506(VS.85).aspx
    ---------------------------------------------

    もっとも、XP SP2 の NT カーネルが SystemLogicalProcessorInformation をサポートしていれば...の話ですけど。

    • 回答の候補に設定 山本春海 2010年4月30日 4:15
    2010年4月28日 5:52
  • ご回答頂き有難う御座います。

    早速、教えて頂いた方法を使ってみた所、
    XP SP3 や 7 では取得出来たのですが、
    XP SP2 では取得出来ませんでした。

    どこで失敗しているのか調べてみると、NtQuerySystemInformation で、
    STATUS_INVALID_INFO_CLASS(0xC0000003) が返ってきました。
    情報クラスがオブジェクトに対して有効ではないとの事で。
    やはり NTカーネルが対応してないのかもしれませんね。
    2010年4月28日 9:01
  • ダメでしたか...お役に立てず申し訳ありません。

    確認したことはありませんが、SystemBasicInformation の場合は、
    やっぱり物理 CPU の数しか取れないんでしょうね...
    でも、Task Manager とかは XP SP2 でも論理 CPU の数を把握しているので、
    何かしらの方法はあるんでしょうね、きっと。

    システム情報やパフォーマンス/プロセスに関する情報の問い合わせに関係する API は、
    大抵 NtQuerySystemInformation を経由するので、どれかの SystemInformationClass で
    取れると思っているのですが、構造体の型がわからないと手も足も出ませんね。

    2010年4月28日 10:13
  • http://blogs.wankuma.com/tyappi/archive/2008/04/29/135702.aspx
    OS によっては、HotFix が必要なようです。


    Jitta@わんくま同盟
    • 回答の候補に設定 山本春海 2010年4月30日 4:15
    2010年4月29日 14:12
  • > ニコチャン大王さん
    いえいえ、恐縮です。
    SystemBasicInformation の NumberOfProcessors を試した所、
    8 が入っていたので論理コア数なのではないかと思われます。
    私が取得したいのは物理コア数なので、
    こちらの方法ではない様ですね。

    > Jittaさん
    これはあくまで Windows Server 2003 や XP SP3 での事を言ってるので、
    XP SP2 での利用の事ではない様です。
    教えて頂いたのに済みません。
    2010年4月30日 6:08
  • http://support.microsoft.com/kb/936235

    This issue occurs because Windows XP does not have the functionality to detect hyperthreading processors and multicore processors.

    とありますね

    • 回答としてマーク あか 2010年4月30日 11:35
    2010年4月30日 6:43
  • あかさんの欲しいのは物理コア数でしたね...
    重ねがさね失礼したしました。

    でも、yominet さんが見つけてくださった XP SP2 用の Hotfix があるんだったら、
    それだけを適用すれば、とりあえず SP2 環境でも GetLogicalProcessorInformation() は
    使えるようになりそうですね。

    2010年4月30日 7:43
  • >yominetさん
    なんと!そうだったのですか…。
    だから、どういった方法でも上手くいかなかったのですね。
    貴重な情報を下さり、ありがとうございました。

    >ニコチャン大王
    私の組んだプログラムを使う人で XP SP2 を使っていたら
    Hotfix を当てて貰うというのは現実的ではないので、
    そういう方法は除外していました。

    ともあれ、XP SP2以前ではそもそもが無理そうなので、
    これで解決とさせて頂きます。
    返信頂いた皆様、ありがとうございました。
    2010年4月30日 11:39