2016-11-11 23 views
2

私のアプリケーションでは、Parallel.Forステートメントを使用してタスクを計算できる多数のクラスがあります。各Parallel.Forは最大並列度を設定する独自のParallelOptionを使用します。スレッドプールとパラレル。組み合わせが可能です

アプリケーションフローは次のような状況になります。クラスA(並列で計算する)はクラスB(並列でも計算されます)を呼び出すか、クラスCを呼び出します)。

別のパターンは再帰呼び出しで、再帰の各レベルで並列計算が行われます。

私の質問:

はそのcalculatinsを行うために、すべてのクラスで使用され、それらのスレッドのNUMERがアプリケーションに対してグローバルに制御されているグローバルスレッドプールのセットアップにそれは可能ですか?

スレッドプールとParallel.Forを組み合わせることはできますか?既存のコードのほとんどは変更されません。

スレッドプールを独立したparallel.for呼び出しと比較してどれだけのオーバーヘッドをかけるか(私はそれがすべて依存していることを知っています。最後にはいくつかのテストをする必要がありますが、多少の有効期限と良いアドバイスがあります)

答えて

2

それはセットアップすることが可能にそのcalculatinsを行うために、すべての クラスによって使用され、それらのスレッドのNUMERがアプリケーションに対してグローバル を制御されているグローバルスレッドプールですか?

これはすでに該当します。現在、アプリケーションスレッドプールは.NETランタイムによって管理されています。つまり、(実行中のアプリケーション内の)すべてのクラスが同じスレッドプールを使用していることを確認できます。スレッドプールには、Task、スタティックThreadPoolクラスまたはスタティックParallelクラスのいずれかを使用してアクセスできます。

スレッドプールをParallelと組み合わせることは可能ですか? 既存コードのほとんどは変更されません。

Parallel.Forは、TasksTaskSchedulerを内部で使用します。したがって、同じスレッドプールが使用されます。

+0

スレッドプールのサイズを制御する方法を知っていますか? Parallel.ForがMAXDOP = 10で呼び出され、各スレッドで別のParallel.ForをMAXDOP = 10で呼び出すメソッドを呼び出した場合、スレッド数は10です。 –

+0

@SebastianWidz、あなたはスレッドプールのサイズを制御すべきではありません。直接行うことはできません。 .NETランタイムは、ほぼ確実にそれをより効果的に行うことができます。 [parallel loops](https://msdn.microsoft.com/en-us/library/ff963552.aspx)の詳細を読む必要があります。 2コアシステムで並列度を10に設定すると、プロセス全体が遅くなる可能性があります。 – dymanoid

+0

はい、私は、DOPが高すぎると速度が遅くなることを知っています。現在、MAXDOP = Environment.ProcessorCountを設定していますが、スレッドが別の並列ループを呼び出すメソッドを呼び出すと、スレッドの数が乗算されます。だから私はこの質問をしました。すべての呼び出しにスレッド数を一定に設定すると便利ではないでしょうか –

0

Parallel.Forは、デフォルトですべてのスレッドプールスレッドを使用し、スレッドプールスレッドの数はCPUに最適化されています。 MaxDegreeOfParallelismは、にするのではなく、が特定のループのすべてのスレッドプールスレッドを使用する場合にのみ便利です。

ちょうどParallel.Forを使用し、それを考え直してはいけません。

あなたのアプリが本当に必要な場合は、独自のスレッドプールを使用して独自のTaskSchedulerを作成することもできますが、実際に行う必要はほとんどありません。

関連する問題