私のアプリケーションでは、Parallel.For
ステートメントを使用してタスクを計算できる多数のクラスがあります。各Parallel.For
は最大並列度を設定する独自のParallelOption
を使用します。スレッドプールとパラレル。組み合わせが可能です
アプリケーションフローは次のような状況になります。クラスA(並列で計算する)はクラスB(並列でも計算されます)を呼び出すか、クラスCを呼び出します)。
別のパターンは再帰呼び出しで、再帰の各レベルで並列計算が行われます。
私の質問:
はそのcalculatinsを行うために、すべてのクラスで使用され、それらのスレッドのNUMERがアプリケーションに対してグローバルに制御されているグローバルスレッドプールのセットアップにそれは可能ですか?
スレッドプールとParallel.For
を組み合わせることはできますか?既存のコードのほとんどは変更されません。
スレッドプールを独立したparallel.for呼び出しと比較してどれだけのオーバーヘッドをかけるか(私はそれがすべて依存していることを知っています。最後にはいくつかのテストをする必要がありますが、多少の有効期限と良いアドバイスがあります)
スレッドプールのサイズを制御する方法を知っていますか? Parallel.ForがMAXDOP = 10で呼び出され、各スレッドで別のParallel.ForをMAXDOP = 10で呼び出すメソッドを呼び出した場合、スレッド数は10です。 –
@SebastianWidz、あなたはスレッドプールのサイズを制御すべきではありません。直接行うことはできません。 .NETランタイムは、ほぼ確実にそれをより効果的に行うことができます。 [parallel loops](https://msdn.microsoft.com/en-us/library/ff963552.aspx)の詳細を読む必要があります。 2コアシステムで並列度を10に設定すると、プロセス全体が遅くなる可能性があります。 – dymanoid
はい、私は、DOPが高すぎると速度が遅くなることを知っています。現在、MAXDOP = Environment.ProcessorCountを設定していますが、スレッドが別の並列ループを呼び出すメソッドを呼び出すと、スレッドの数が乗算されます。だから私はこの質問をしました。すべての呼び出しにスレッド数を一定に設定すると便利ではないでしょうか –