[トップページへ戻る]

C# プログラム上でプロセッサ数やコア数などを調べる方法

2012年3月
C#のプログラム上から、物理プロセッサの数、論理プロセッサの数、コア数、ハイパースレッドの有無を調べる方法。


プロセッサの数について
物理プロセッサ
物理プロセッサ 1個
普通のPC。
物理プロセッサ 2個
サーバー機。ハイエンドPC。
4個、8個搭載していることもある。
電子部品として見たプロセッサ(CPU)を物理プロセッサと呼びます。Pentiumの頃までは「CPUが1個と言ったら1個に決まっているだろう」だったのですが、今時のCPUは電子部品としては1個でも、内部に複数個のCPUの電子回路が組み込まれています。そのような論理的なCPUの見方と区別するため、物理プロセッサという呼び方があります。

Multi-Core Technology Hyper-Threading Technology
1コア
論理プロセッサ 1個
OSからはプロセッサが1個に見える。
1コア2スレッド
論理プロセッサ 2個
OSからはプロセッサが2個に見える。
★2
2コア
論理プロセッサ 2個
OSからはプロセッサが2個に見える。
★1
2コア4スレッド
論理プロセッサ 4個
OSからはプロセッサが4個に見える。
4コア
論理プロセッサ 4個
OSからはプロセッサが4個に見える。
4コア8スレッド
論理プロセッサ 8個
OSからはプロセッサが8個に見える。
Multi-Core Technology…マルチ・コア。わかりやすい例では、Core2Duoは2コア、Core2Quadは4コア。
Hyper-Threading Technology…ハイパー・スレッド。「HT」「HTテクノロジー」と略されることが多い。

「コア」はCPU機能の核となる部分です。マルチ・コアは複数個の物理プロセッサを1つのパッケージに詰め込んだものと見ることができます。
「ハイパー・スレッド」は1つのコアを2つに見せかける技術です。★印のプロセッサはどちらもOSからは「2個の論理プロセッサ」に見えますが、処理性能は異なります。★1は2つの処理を独立して同時進行できます。★2は2つの処理が見かけ上は同時進行しつつも、実際にはタイミングを見計らいながら1個のコアを使います。従って処理性能は★1の方が高いです。

コア数やHTの有無を調べる方法
ソフトウェアの話。
マルチスレッドで処理をするアプリがあります。(論理)プロセッサが複数個あれば効率よく処理されます。プロセッサの個数はEnvironment.ProcessorCountで得ることができます。ただし、「プロセッサが2個ある」などと判明してもそれがコア数なのか、HTによる見かけ上の個数なのか、までは分かりません。
これらの区別はWin32_Processorクラスで調べられます。マネージコードから呼び出して使う例を以下に示します。WindowsXP/SP3以降で利用できます。XP/SP2以前だと、修正パッチを当てないと取得できないパラメータがあります。
The number of physical hyperthreading-enabled processors or the number of physical multicore processors is incorrectly reported in Windows XP. http://support.microsoft.com/kb/936235/ja





ManagementClassクラスを使うにはプロジェクトの参照設定に「System.Management」を追加します。
ManagementClassを使った処理は時間がかかります。GetProcessorInfos()を呼び出して戻り値を得るまでに1秒くらいかかるかもしれません。プログラム開始時にバックグラウンドで呼び出しておくとよいと思います。

戻り値の型としてProcessorInfoクラスを作りました。物理プロセッサ数、論理プロセッサ数、コア数、が分かります。GetProcessorInfos()ではシステムに搭載された物理プロセッサごとにProcessorInfoのインスタンスを作るので、戻り値は配列になります。PCなら基本的に物理プロセッサが1個なので、長さ1の配列になります。
{論理プロセッサ数 = コア数}ならハイパースレッドなしのプロセッサです。{論理プロセッサ数 / 2 = コア数}ならハイパースレッドありのプロセッサです。


◆ ◆ ◆
Win32_Processorをマネージコードから呼び出してコア数を調べる、
というサンプルコードが見あたらなかったので作りました。
自分のプログラムで実際に利用しています。


(C) 『昼夜逆転』工作室 [トップページへ戻る]
inserted by FC2 system