2016-04-18 3 views
3

parallel.forを使用するAC#メソッドは、10コアCPU(デュアルXeon 64GB RAM Windows 10ワークステーション)のすべてのコアを完全に使用しますが、 2番目のCPU上にある他の10個の物理コアを使用できます。プロセスの親和性(タスクマネージャで)は、すべてのコアが利用可能であることを示します。プロセスに利用可能なすべてのコアを使用させる考え/アプローチこの例では、標準コーディングからparallel.forへの大幅なパフォーマンス改善が見られます。スピードの100%改善をあきらめてしまうのは残念です。ありがとう。C#parallel.forループはCPU1のコアを完全に使用しますが、CPU2は使用しません

重要な観測:タスクマネージャを見ると、プロセスが使用しているコアが両方のXeon CPUに分散していることは明らかです。 IOWでは、各CPUのコアの約半分を使用します。

追加情報:Environment.ProcessorCount = 32.システムに20個の物理コアがあり、したがって40個の論理コアがあります。そして明らかに、このプロセスでは32個のコアすべてを使用するわけではありません。それは最大で20を使用します。FWIW、単一コアi7-3770では、使用可能な8つの論理コアの100%に近いものを使用して、プロセスが正常に動作します。

2 ADDITIONAL:Luaanによって提案された変更が使用可能なプロセッサの数に影響を及ぼさなかったコンフィギュレーション:まだ32

ADDITIONAL 3:Windowsの10のPro 64ビット

+0

msconfig.exeでいくつのコアを指定しましたか? – Alex

+0

これらのCPUはNUMAにありますか?それらは同じプロセッサグループに属していますか?複数存在する場合、.NETは両方にアクセスできますか? 'Environment.ProcessorCount'を確認してください。これは、Parallel.Forが作成するワーカーの量を決定するために使用するものです。追加のスレッドを手作業で作成する場合、これらのスレッドも第2のCPUを飽和させますか? – Luaan

+0

どのように処理していますか?私の厄介なハックファイルファインダーは、利用可能なすべてのコアを使用しているようだそれはタスクとパラレルforsの組み合わせを使用して – BugFinder

答えて

4

私はここで推測するつもりです - 2つのCPUは2つの異なるプロセッサグループに属しています。既定では、.NETは1つのプロセッサグループしか使用しません。

このサポートを拡張するために必要な最小限の構成はこれです:

<configuration> 
    <runtime> 
     <Thread_UseAllCpuGroups enabled="true"/> 
     <GCCpuGroup enabled="true"/> 
     <gcServer enabled="true"/> 
    </runtime> 
</configuration> 

は、参考のためにThread_UseAllCpuGroupsProcessor Groupsを参照してください。これはまた、Environment.ProcessorCountためのMSDNドキュメントに記載されている

:現在のマシンに複数のプロセッサ・グループが含まれている場合

、このプロパティは、共通言語ランタイム(CLRによって使用可能な論理プロセッサの数を返します)。

+0

これはこれを「公式に」行う方法ですか?とにかく私の意見ではデフォルトで起こるはずのもののための少しの仕事のようです。 – user9993

+0

@ user9993マルチCPUシステムで作業したことがありますか?シンプルなマルチスレッドシステムよりもはるかにトリッキーです。マルチCPUシステムでデスクトップ.N​​ETアプリケーションを実行したという理由だけで、「デフォルトではランダムな例外を取得したくないでしょうか?デフォルトは常に*最も安全な*オプションであり、必ずしも最もパフォーマンスの高いものではありません。 GCを複数のCPU(特にNUMA上)に分散させることは余計なことです。ほとんどのアプリケーションでは、そのようなシステムをどのように処理するか分かりません。なぜなら、それらをデスクトップシステムにエンパワーしないからです。 – Luaan

関連する問題