.net の物理プロセッサ/コアの数をどのように検出しますか?
8 に答える
System.Environment.ProcessorCount
論理プロセッサの数を返します
http://msdn.microsoft.com/en-us/library/system.environment.processorcount.aspx
物理プロセッサ数については、おそらく WMI を使用する必要があります。次のメタデータは、XP/Win2k3 以降でサポートされています (機能は、Vista/Win2k8 より前の SP で有効になっています)。
Win32_ComputerSystem.NumberOfProcessorsは物理的な数を返します
Win32_ComputerSystem.NumberOfLogicalProcessorsは論理値を返します (当たり前!)
ハイパースレッド化された CPU はマルチコア化された CPU と同じように見えますが、パフォーマンス特性は大きく異なることに注意してください。
HT 対応の CPU を確認するには、Win32_Processor の各インスタンスを調べて、これら 2 つのプロパティを比較します。
Win32_Processor.NumberOfLogicalProcessors
Win32_Processor.NumberOfCores
マルチコア システムでは、これらは通常同じ値です。
また、複数のプロセッサ グループを持つシステムにも注意してください。これは、多数のプロセッサを搭載したコンピュータでよく見られます。デフォルトでは、.Net は最初のプロセッサ グループのみを使用します。つまり、デフォルトでは、スレッドは最初のプロセッサ グループの CPU のみを使用Environment.ProcessorCount
し、このグループ内の CPU の数のみを返します。Alastair Maw's answerによると、この動作は app.config を次のように変更することで変更できます。
<configuration>
<runtime>
<Thread_UseAllCpuGroups enabled="true"/>
<GCCpuGroup enabled="true"/>
<gcServer enabled="true"/>
</runtime>
</configuration>
実際にはシステム内の仮想プロセッサの数をEnvironment.ProcessorCount
取得できますが、それはプロセスで使用できるプロセッサの数ではない場合があります。まさにそれを得るために、簡単な小さな静的クラス/プロパティを作成しました。
using System;
using System.Diagnostics;
/// <summary>
/// Provides a single property which gets the number of processor threads
/// available to the currently executing process.
/// </summary>
internal static class ProcessInfo
{
/// <summary>
/// Gets the number of processors.
/// </summary>
/// <value>The number of processors.</value>
internal static uint NumberOfProcessorThreads
{
get
{
uint processAffinityMask;
using (var currentProcess = Process.GetCurrentProcess())
{
processAffinityMask = (uint)currentProcess.ProcessorAffinity;
}
const uint BitsPerByte = 8;
var loop = BitsPerByte * sizeof(uint);
uint result = 0;
while (--loop > 0)
{
result += processAffinityMask & 1;
processAffinityMask >>= 1;
}
return (result == 0) ? 1 : result;
}
}
}
これは実際には、ターゲット プラットフォームによってかなり異なります。Stephbuの答えは、XP SP3以降でうまく機能します。
古いプラットフォームをターゲットにしている場合は、この記事を確認してください。私は約半年前にそれを書きました。その中で、これを行うためのいくつかの異なる方法と、各方法の個々の長所と短所について説明しています.
ハイパースレッディングのシャドウ コアと実際のコアを区別することに関心がある場合は、このコード プロジェクトの記事も参照してください。
Environment.ProcessorCountには、ハイパースレッドプロセッサも含まれます。
ハイパースレッドプロセッサと2つのコアを備えたプロセッサを区別する方法はありません(少なくともWindows 2003まで)。
System.Environment.ProcessorCount が必要です
Environment.ProcessorCount
編集: .NET 1.1 ではなく、.NET 2.0 で利用可能
Wikiの担当者が十分ではありませんが、XPSP2に加えて、Windows 2003ServerSP1およびSP2にもこの機能を有効にするための修正プログラムが必要であることに注意してください。
PowerShell を使用して、包括的なプロセッサ情報にアクセスできます。たとえば、次のコマンドを実行して、CPU コアの数を取得できます。
Get-WmiObject -namespace root\CIMV2 -class Win32_Processor -Property NumberOfCores
ある種のエクスプローラ ツールを使用すると、WMI の調査がはるかに簡単になります。したがって、WMI ブラウジング ツール ( WMIExplorerやWMI CIM Studioなど) を使用して、WMI クラス、プロパティ、およびメソッドを探索することをお勧めします。