好奇心から、.NET タスク スケジューラがサポートするプロセッサ コアの数を知りたいと思います。
Windows Server 2012 は最大 640 コアをサポートします。.NET は 64 に制限されていましたか?それとも利用可能なすべてのコアを使用しますか?
好奇心から、.NET タスク スケジューラがサポートするプロセッサ コアの数を知りたいと思います。
Windows Server 2012 は最大 640 コアをサポートします。.NET は 64 に制限されていましたか?それとも利用可能なすべてのコアを使用しますか?
.NET はすべてのコアをサポートします。MSDN Parallel Extensions Forumの Stehphen Toub からの回答:
デフォルトの TPL
TaskScheduler
は .NET を対象としていますThreadPool
。デフォルトでは、プールは単一のプロセッサ グループに制限されているため、64 コアに制限されています。ただし、.NET 4.5 では<Thread_UseAllCpuGroups enabled="true"/>
フラグを設定できます。コンピューターに複数の CPU グループがある場合、この要素を有効にすると、ランタイムはマネージ スレッドを 1 つだけに限定するのではなく、すべての CPU グループに分散するため、既定のスケジューラは OS がサポートするすべてのものをターゲットにすることができます。(GCCpuGroup
この設定を有効にするには、 も有効にする必要があります。)
エリック・リッパート著(ソース)
CLR 4.0 のベータ 1 では、TPL の既定のスケジューラはCLR スレッド プールになります。
これは、作業が FIFO キューに入り、各コアがワークロード項目をデキューすることを大まかに意味します。つまり、CLR スレッドプールがサポートするコア数の固定上限がなくなりました。この上限は、OS、ハードウェア、および CPU プラットフォームなどの他の関係者によって強制されます。
プール内のデフォルトのスレッド数 (この回答による)
- Framework 4.0 (32 ビット環境) では 1023
- Framework 4.0 (64 ビット環境) では 32768
- Framework 3.5 ではコアあたり 250
- Framework 2.0 ではコアあたり 25
技術的には、専用コアで多くの並列実行が可能です。
任意の時点で、プール内にそれだけ多くのスレッドがあるという意味ではないことに注意してください。CLR と OS は通常、プール内のスレッド数をゆっくりと減らして、使用されていないリソースを解放しようとします。
C# 経由の CLRによると、第 3 版。、第 25 章スレッドの基本:
現在、CLR […] は、64 ビット Windows で実行する場合、最大 64 コアしか使用できません。[…]マネージド アプリケーションは、32 ビット バージョンの Windows で実行する場合、最大 32 コアを使用できます。
この本は 2010 年に書かれたので、.Net 4.0 と Windows Server 2008 R2 に関連する情報が含まれていますが、.Net 4.5 はこの点で何も変わっていないと思います。編集: .Net 4.5 が実際にこれを変更したようです。Stephen Toub を引用した Peter Meinl の回答を参照してください。