5

わかりましたので、 In C# GetEnvironmentVariable("NUMBER_OF_PROCESSORS") returns the wrong numberに投稿し、 C#で正しいコア数を取得する方法を尋ねました。一部の親切な人々は、同様の質問が行われたいくつかの質問に私を案内しましたが、私はすでにそれらの解決策を試しました. その後、私の質問は別の質問と同じであるとして閉じられました。これは本当ですが、そこに示されている解決策は機能しませんでした。そのため、他のソリューションが機能しなかったことに誰かが気付くのを助けることができることを期待して、別のものを開きます。

その質問は、.NET/C# 経由で CPU コアの数を見つける方法でしたか? WMI を使用して正しいコア数を取得しようとしました。さて、そこに与えられたコードからの出力は次のとおりです。

Number Of Cores: 32
Number Of Logical Processors: 32
Number Of Physical Processors: 4

私の最後の質問によると、マシンは Windows Server 2008 R2 HPC エディションを実行する 64 コア AMD Opteron 6276 (4x16 コア) です。

私が何をしていても、Windows は 64 コアが利用可能であるにもかかわらず、常に 32 コアを返すようです。マシンが 32 コアしか使用していないことを確認しました。64 コアをハードコーディングすると、マシンはそれらすべてを使用します。AMD CPU の検出方法に問題があるのではないかと考えています。

参考までに、最後の質問を読んでいない場合は、コマンド ラインで echo %NUMBER_OF_PROCESSORS" と入力すると、64 が返されます。プログラミング環境では実行されません。

ありがとう、ジャスティン

更新: PROCESSOR_ARCHITECTURE を出力すると、コマンド ラインからは AMD64 が返されますが、プログラムからは x86 が返されます。このプログラムは、64 ビット ハードウェア上で実行される 32 ビットです。64 ビットにコンパイルするように求められましたが、それでも 32 コアが表示されます。

4

2 に答える 2

7

ご協力ありがとうございます。問題が見つかりました。やはりAMDの設計によるものでした。彼らは、Windowsがコア数を正しく識別しない原因となるMCM(私が思うマルチチップモジュール)と呼ばれる新しいアーキテクチャを使用しています。他の誰かがそれに遭遇した場合に備えて、これを解決策として投稿しています。職場の同僚から、 http://support.microsoft.com/kb/2711085で入手できるホットフィックスに案内されました

于 2012-07-23T04:40:31.743 に答える
3

Windows 7/Windows Server 2008 R2より前では、論理プロセッサの最大数は CPU レジスタのサイズに制限されていました。32 ビット オペレーティング システムでは 32、64 ビット システムでは 64 です。これは、単一のレジスタ サイズの値に対してアトミック操作を実行するのは簡単だからです。

プロセッサの数が 32 を超えることはないと想定されていた 32 ビット アプリケーションとの互換性のために、によって返されるSYSTEM_INFO構造体の構造は32 に制限されました。32 ビット プロセスは、64 ビット ビューを取得するために呼び出すことができます。.NET のプロパティ呼び出し.dwNumberOfProcessorsGetSystemInfoGetNativeSystemInfoEnvironment.ProcessorCountGetSystemInfo

Windows 7/2008 R2 は、サポートされるプロセッサ コアの数を 64 から 256 に変更する更新されたカーネルを使用し、一部のコア ロックを廃止します。古いアプリケーションとの互換性のために、Windows 7 ではプロセッサ グループの概念が導入されています。プロセッサ マスクを扱っていたすべての古い API は、すべてのプロセッサではなく、プロセスのグループ内のプロセッサで動作するようになりました。プロセッサ数が 64 以下の場合、グループは 1 つだけですが、Windows 7 は最大 4 つのグループをサポートします。Windows 8/Server 2012 は 10 をサポートします (32 ビット OS は 32 を超える論理プロセッサを使用できず、常に 1 つのグループを持ちます)。コアの実際の数とその配置を知りたい場合は、 を呼び出す必要がありますGetActiveProcessorCount

明示的にそう言っている情報は見つかりませんがNUMBER_OF_PROCESSORS、同じ理由で制限されると予想され、32 ビット プロセスには 32 に制限された環境が与えられます。

Windows Server 2008 R2 は、実際には誤った呼び名です。これは、Windows Server 2008 と比較して Windows のコアに最小限の変更しかないことを意味しますが、それは正しくありません。

于 2012-12-03T17:01:49.577 に答える