山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他CPUの物理CPU数・ソケット数等を取得cpuid4(32/64bit)
概要
現システムのCPUの物理CPU数・ソケット数等を取得してファイルおよび画面に結果を表示するものである。
また、C++のソース上で__cpuid関数等をマクロで置き換えることによりCPUIDの結果をシミュレーションすることができる。
本プログラムを実行するとCPUIDをクラスで記述したヘッダーファイルを出力するので、そのヘッダファイルを他のプログラムにインクルードして__cpuid等をマクロで置き換えることにより他CPUから抽出したCPUIDを再現することができる。
またCPUIDを想定で作成してパーソナルユースでは使うことがまずない、Xeon E5-2698V3のデュアルマシーンのCPUIDをエミュレーションすることもできる。最初に示した画像がエミュレーションによって得たものである。
また、スレッドに割り当てるCPUを固定するSetThreadAffinityMask API(マクロによる置き換え)をエミュレーションするため、CPUによりCPUIDの戻り値が異なるEAX=0x1とEAX=0xBのケースにおいても、正常に動作する。
なお本プログラムはC++ソースコード上でCPUIDを再現するものであり、CPUでサポートしていない命令をエミュレーションするものではない。
以下にCPU Pentium 4で実行した時に作成されるファイルのリンクを示す。
CPUIDの結果一覧 Pentium_4_3200MHz_cpuid.zip
CPUIDをエミュレーションするためのヘッダーファイル Pentium_4_3200MHz_emu.zip
CPUIDの結果の概要 Pentium_4_3200MHz_summary.zip
変更履歴
2014/11/26 初版
2015/11/02 Windows 98/2000世代のパソコンを触る機会があったので、Windows 95に対応すべくVisual C++ 97(5.0)でビルドできるようにソースを修正しました。
2015/11/02 Windows 98/2000世代のパソコンを触る機会があったので、Windows 95に対応すべくVisual C++ 97(5.0)でビルドできるようにソースを修正しました。
本プログラムで他のCPUをエミュレーションする方法
本プログラムのソースでコメントアウトしているCPUを定義したヘッダーファイルのいずれかを有効にするとそのCPUがエミュレーションされる。
1ソケットマシーンを再現する場合は、CPU_EMU_MULTIマクロを定義してはならない。2ソケットから4ソケットマシンを再現する場合は、CPU_EMU_MULTIでソケット数を定義する。 SetThreadAffinityMaskはマクロによりCPUクラスのメンバー関数に置き換えられる。指定したマスク値は保存されており、cpuidを呼び出したときにマスク値に応じてcpuidの値を再現する。
マスク値に指定したCPU割り当ては、実CPUへマッピングされる。例えば4論理CPUを8論理CPUのマシンで再現する場合、スレッドは、実マシーンの論理CPU 0,2,4,6に割り当てられる。
論理CPU数を取得するときに使われるGetSystemInfo APIもマクロによりCPUクラスのメンバー関数に置き換えられる。メンバー関数から実マシーンのGetSystemInfo APIを呼び出し、論理CPUの個数をエミュレーションするCPU数に書き換える。
1ソケットマシーンを再現する場合は、CPU_EMU_MULTIマクロを定義してはならない。2ソケットから4ソケットマシンを再現する場合は、CPU_EMU_MULTIでソケット数を定義する。 SetThreadAffinityMaskはマクロによりCPUクラスのメンバー関数に置き換えられる。指定したマスク値は保存されており、cpuidを呼び出したときにマスク値に応じてcpuidの値を再現する。
マスク値に指定したCPU割り当ては、実CPUへマッピングされる。例えば4論理CPUを8論理CPUのマシンで再現する場合、スレッドは、実マシーンの論理CPU 0,2,4,6に割り当てられる。
論理CPU数を取得するときに使われるGetSystemInfo APIもマクロによりCPUクラスのメンバー関数に置き換えられる。メンバー関数から実マシーンのGetSystemInfo APIを呼び出し、論理CPUの個数をエミュレーションするCPU数に書き換える。
他のプログラムで他のCPUをエミュレーションする方法
テスト環境
コンパイラ
Visual C++ 2013 Express 32/64bit マルチバイト/UNICODE実行環境
Windows 7 Enterprise Service Pack 1 64bit(Sandy Bridge-E)Windows 8.1 Enterprise 64bit(Arrandale)
エミュレーション用のヘッダーファイル
エミュレーション用のヘッダーファイルはプログラムに付属している。実システムで本ソフトの実行結果からの作成されたエミュレーション用のヘッダーファイル及び概要ファイル
実システム上でエミュレーションなしで実行させたCPUは以下のとおりである。name | コア | スレッド | L1命令 | L1Data | L2 | L3 | ファミリー | モデル | ステッピング | 拡張ファミリー | 拡張モデル |
---|---|---|---|---|---|---|---|---|---|---|---|
Intel(R) Celeron(R) CPU G3900 @ 2.80GHz | 2 | 2 | 32kByte*2個 8way | 32kByte*2個 8way | 512kByte*2個 4way | 2048kB*1個 8way | 6 | 6 | e | 3 | 5e |
Intel(R) Atom(TM) CPU D2701 @ 2.13GHz | 2 | 4 | 32kByte*2個 8way | 24kByte*2個 6way | 512kByte*2個 8way | 6 | 6 | 1 | 6 | 36 | |
Intel(R) Celeron(R) CPU G1620 @ 2.70GHz | 2 | 2 | 32kByte*2個 8way | 32kByte*2個 8way | 256kByte*2個 8way | 2048kByte*1個 8way | 6 | a | 9 | 6 | 3a |
Intel(R) Core(TM) i3 CPU M 370 @ 2.40GHz | 2 | 4 | 32kByte*2個 4way | 32kByte*2個 8way | 256kByte*2個 8way | 3072kByte*1個 12way | 6 | 5 | 5 | 6 | 25 |
Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz | 2 | 4 | 32kByte*2個 8way | 32kByte*2個 8way | 256kByte*2個 8way | 3072kByte*1個 12way | 6 | a | 9 | 6 | 3a |
Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz | 2 | 4 | 32kByte*2個 8way | 32kByte*2個 8way | 256kByte*2個 8way | 3072kByte*1個 12way | 6 | a | 9 | 6 | 3a |
Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz | 4 | 4 | 32kByte*4個 8way | 32kByte*4個 8way | 256kByte*4個 8way | 6144kByte*1個 12way | 6 | a | 7 | 6 | 2a |
Intel(R) Core(TM)2 Duo CPU E6850 @ 3.00GHz | 2 | 2 | 32kByte*2個 8way | 32kByte*2個 8way | 4096kByte*1個 16way | 6 | f | b | 6 | f | |
Intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz | 2 | 2 | 32kByte*2個 8way | 32kByte*2個 8way | 3072kByte*1個 12way | 6 | 7 | 6 | 6 | 17 | |
Intel(R) Core(TM)2 Duo CPU P8700 @ 2.53GHz | 1 | 2 | 32kByte*2個 8way | 32kByte*2個 8way | 3072kByte*1個 12way | 6 | 7 | a | 6 | 17 | |
Intel(R) Pentium(R) 4 CPU 3.20GHz | 1 | 2 | Trace Cache 12kμOPs 8way*1個 | 16kByte*1個 8way | 2048kByte*1個 8way | f | 6 | 2 | f | 6 |
CPU-ZでCPUIDの値を保存した結果に基づき作成したエミュレーション用のヘッダーファイル及び概要ファイル
システムの詳細情報を表示するCPU-ZでレポートされたテキストファイルよりエミュレーションしたCPUは以下のとおりである。name | コア | スレッド | L1命令 | L1Data | L2 | L3 | ファミリー | モデル | ステッピング | 拡張ファミリー | 拡張モデル |
---|---|---|---|---|---|---|---|---|---|---|---|
Intel(R) Celeron(R) CPU 450 @ 2.20GHz | 1 | 1 | 32kByte*1個 8way | 32kByte*1個 8way | 512kByte*1個 2way | 6 | 6 | 1 | 6 | 16 | |
Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz | 2 | 4 | 32kByte*2個 8way | 32kByte*2個 8way | 256kByte*2個 8way | 3072kByte*1個 12way | 6 | a | 7 | 6 | 2a |
Intel(R) Core(TM) i7 CPU 870 @ 2.93GHz | 4 | 8 | 32kByte*4個 4way | 32kByte*4個 8way | 256kByte*4個 8way | 8192kByte*1個 16way | 6 | e | 5 | 6 | 1e |
Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz | 4 | 8 | 32kByte*4個 8way | 32kByte*4個 8way | 256kByte*4個 8way | 8192kByte*1個 16way | 6 | a | 7 | 6 | 2a |
Intel(R) Core(TM) i7-3820 CPU @ 3.60GHz | 4 | 8 | 32kByte*4個 8way | 32kByte*4個 8way | 256kByte*4個 8way | 10240kByte*1個 20way | 6 | d | 7 | 6 | 2d |
Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz | 4 | 8 | 32kByte*4個 8way | 32kByte*4個 8way | 256kByte*4個 8way | 8192kByte*1個 16way | 6 | c | 3 | 6 | 3c |
Intel(R) Core(TM)2 CPU 6320 @ 1.86GHz | 2 | 2 | 32kByte*2個 8way | 32kByte*2個 8way | 4096kByte*1個 16way | 6 | f | 6 | 6 | f | |
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz | 4 | 4 | 32kByte*4個 8way | 32kByte*4個 8way | 2048kByte*2個 8way | 6 | 7 | 7 | 6 | 17 | |
Intel(R) Pentium(R) 4 CPU 3.40GHz | 1 | 2 | Trace Cache 12kμOPs 8way*1個 | 16kByte*1個 8way | 2048kByte*1個 8way | f | 6 | 2 | f | 6 | |
Intel(R) Pentium(R) D CPU 3.40GHz | 2 | 2 | Trace Cache 12kμOPs 8way*2個 | 16kByte*2個 8way | 2048kByte*2個 8way | f | 6 | 5 | f | 6 |
CPUの仕様及び同世代のCPUのCPUIDの値に基づき作成したエミュレーション用のヘッダーファイル及び概要ファイル
CPUの仕様及び同世代のCPUについてシステムの詳細情報を表示するCPU-Zでレポートされたテキストファイルを元にエミュレーションしたCPUは以下のとおりである。name | コア | スレッド | L1命令 | L1Data | L2 | L3 | ファミリー | モデル | ステッピング | 拡張ファミリー | 拡張モデル |
---|---|---|---|---|---|---|---|---|---|---|---|
Intel Xeon E7-4809 v2 @ 1.9GHz | 6 | 12 | 32kByte*6個 8way | 32kByte*6個 8way | 512kByte*6個 8way | 12289kByte*1個 16way | 9 | e | 2 | 9 | e |
Intel(R) Xeon(R) CPU E5-2603 v3 @ 1.60GHz | 6 | 6 | 32kByte*6個 8way | 32kByte*6個 8way | 512kByte*6個 8way | 15361kByte*1個 20way | 6 | f | 2 | 6 | 3f |
Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz | 8 | 16 | 32kByte*8個 8way | 32kByte*8個 8way | 512kByte*8個 8way | 20481kByte*1個 20way | 6 | f | 2 | 6 | 3f |
Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz | 10 | 20 | 32kByte*10個 8way | 32kByte*10個 8way | 512kByte*10個 8way | 25601kByte*1個 20way | 6 | f | 2 | 6 | 3f |
Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz | 12 | 24 | 32kByte*12個 8way | 32kByte*12個 8way | 512kByte*12個 8way | 30721kByte*1個 20way | 6 | f | 2 | 6 | 3f |
Intel(R) Xeon(R) CPU E5-2695 v3 @ 2.30GHz | 14 | 28 | 32kByte*14個 8way | 32kByte*14個 8way | 512kByte*14個 8way | 35841kByte*1個 20way | 6 | f | 2 | 6 | 3f |
Intel(R) Xeon(R) CPU E5-2698 v3 @ 2.30GHz | 16 | 32 | 32kByte*16個 8way | 32kByte*16個 8way | 512kByte*16個 8way | 40961kByte*1個 20way | 6 | f | 2 | 6 | 3f |
Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz | 18 | 36 | 32kByte*18個 8way | 32kByte*18個 8way | 512kByte*18個 8way | 46081kByte*1個 20way | 6 | f | 2 | 6 | 3f |
プログラムソースの概要
ソースコード
エミュレーションをしない場合に必要なソースファイルは、cpuid4.cpp cpu.h cpp.c resource.h resource.rcです。
cpuid4.cppに最初に実行されるWinMain関数が含まれています。
エミュレーションをする場合は、該当するCPU名のヘッダーファイルが必要となります。
実行ファイルは、cpuid4_win9x.exeがVisual C++ 97(5.0)でマルチバイトでコンパイルしたもので、Windows9x/Windows 2000で動作します。
cpuid4.exeはVisual C++ 2013でUNICODEでコンパイルしたもので、Windows XP以降で動作します。 ソースサイズが大きいので添付ファイルを解凍して参照してください。
cpuid4.cppに最初に実行されるWinMain関数が含まれています。
エミュレーションをする場合は、該当するCPU名のヘッダーファイルが必要となります。
実行ファイルは、cpuid4_win9x.exeがVisual C++ 97(5.0)でマルチバイトでコンパイルしたもので、Windows9x/Windows 2000で動作します。
cpuid4.exeはVisual C++ 2013でUNICODEでコンパイルしたもので、Windows XP以降で動作します。 ソースサイズが大きいので添付ファイルを解凍して参照してください。
Copyright (C) 2012 山本ワールド All Rights Reserved.