概要


現システムの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)でビルドできるようにソースを修正しました。

本プログラムで他の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数に書き換える。

他のプログラムで他の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以降で動作します。 ソースサイズが大きいので添付ファイルを解凍して参照してください。

実行ファイルとソースファイルのダウンロード