SMP/HTT/Multicoreの検出
ここまで実装して、「以下の条件で検出する場合、各プロセッサごとのCPUID情報は必要ないのではないか?」ということに気が付きました。
前ページでの検討が若干無駄になりますが、以下の条件を元に、簡易版のSMP/HTT/Multicoreの検出を考えました。
- SMPは同一のCPUを用いていることを前提とする
- 機能が有効であるならば使用されていることを前提とする
上記の考え方を前提とした場合、一番最初のCPU(任意のCPU)だけを見るだけで全体を把握して良い事になります。いわゆる手抜きです。
検出のアルゴリズム
簡易版の検出方法のアルゴリズムについては、以下の通りです。
- OSが認識しているProcessor数の取得
- Multicoreが有効である場合、Core数の取得
- Intel製CPU
- AMD製CPU
- その他のCPU
- HTTが有効である場合、HTT数の取得
- 論理プロセッサ数の取得
- MulticoreのCore 数の取得
- HTT 数の検出
GetProcessAffinityMask()
にて全体のProcessor数を取得します。DWORD GetHyperThreadingNum( IN PCPUID_INFOR pci, IN DWORD cntcpu ) { DWORD num = 0; DWORD llp = 0; DWORD core = 0; PCPUIDS_DATA pcpus = NULL; if( NULL == pci ){ return 0; } switch(GetCPUVendor(pci)){ case CPUVENDOR_INTEL: num = 0; // Count Logical Processor number (HTT+core) if( !GetProcessorData(pci,cntcpu, CPUID_LOGICAL_PROCESSOR_NUM, &llp) ){ break; } // HTT enable? (if Logical Processor is 1, // then HTT is NOT working.) if( !IsFeature(pci,cntcpu,FLAG_CPUID_HTT) || llp<2 ){ break; } // Get Multicore number core = GetMultiCoreNum(pci,cntcpu); if( 0 != core ){ if( (llp/core) < 2 ){ break; } } num = llp; break; default: num = 0; break; } return num; }
以下は添付のプログラム「sample.exe」を実行した時の出力結果です。「sample.exe」のソースは「src\x86work」にあります。プログラムを構築する場合、ソース中にある「sample.dsw」を使用してください。
Brand Srting = [ Intel(R) Pentium(R) 4 CPU 3.20GHz] Total processor = [2] Physical Processor number = [1] Multicore Processor number = [0] HTT Processor number = [2]
Brand Srting = [ Intel(R) Xeon(TM) CPU 2.80GHz] Total processor = [4] Physical Processor number = [2] Multicore Processor number = [0] HTT Processor number = [2]
Brand Srting = [ Intel(R) Pentium(R) D CPU 3.00GHz] Total processor = [2] Physical Processor number = [1] Multicore Processor number = [2] HTT Processor number = [0]
簡易版の問題点
簡易版の方針で示した前提条件が崩れた場合、正しくHTT/Multicoreを検出できなくなります。
- 1.の前提が崩れる場合
- 2.の前提が崩れる場合
簡易版の改良のアドバイス
今回は面倒だったので実装しませんでしたが、おそらく下記の方法で、上記の前提条件が無くても正しく検出できるはずです。HTT/Multicoreが両方搭載されている場合、若干面倒ですがLocalAPICの割り振られる規則を元に判断することは可能です。
- 全てのProcessorのCPUIDを取得
- 各ProcessorごとのLocalAPICを抽出
- LocalAPICとProcessor数より、論理プロセッサか物理プロセッサかどうかを判断し集計
まとめ
仕様書の読み間違いや自らの思い込みにより、かなり回り道になってしまいましたが、大体当初の目的を果たせたのではないかと考えています。最後に私がはまったネタをいくつか披露しておきます。参考になれば幸いです。
- HTTフラグ(CPUID(1)EDX bit-28)はHTTのみ有効?
- Multicoreは論理プロセッサ?
- Multicore数が返却されない?
参考資料
CPUID命令については、『CPUID命令によるCPUの性能・機能の把握』の参考資料を参照してください。
- Intel 『Hyper-Threading Technology and Multi-Core Processor Detection』
- Intel 『Detecting Support for Hyper-Threading Technology Enabled Processors』
- Tom's Hardware『Are Three Cores Better Than Two?』
- @IT 『頭脳放談 第16回 x86を延命させる「Hyper-Threading Technology」、その魅惑の技術』 Massa POP Izumida 著、2001年9月
- MSDN 『Using Visual C++ 2005 Express Edition with the Microsoft Platform SDK』