たとえば、500個のオブジェクトのリストがあります。オブジェクトごとに、コストを計算する関数を呼び出しています。したがって、500回の呼び出しはそれぞれ他の呼び出しから独立しています。全体で約30秒かかります。500個のタスクすべてを、相互に依存しないので同時に実行することは可能ではないでしょうか。マルチスレッドについては何も知らないので、それが解決策になるかどうかはわかりません。
6 に答える
Parallel.ForEach Methodを使用して、作業を簡単に並列化できます。
Parallel.ForEach(items, item =>
{
item.CalculateCost();
});
シングル スレッド プロセスを実行すると、マシンの 1 つのコアのみが使用されます (これにより、他のコアがオペレーティング システムや他のアプリケーション プロセスを実行できるようになります)。
あなたのプロセスはマルチスレッド処理の良い候補のように思えますが、すべてのプロセスに新しいスレッドは必要ありません-これにより、スレッドの作成にオーバーヘッドが発生し、それらをすべて個別に実行するのに十分なコアがなくなります.そのため、CPU リソースをめぐって争うことになります。
Parallel.For
.Net4.0 で使用すると、できるだけ多くのスレッドを巧みに使用します。
500個のタスクすべてを、相互に依存しないので同時に実行することは可能ではないでしょうか。
つまり、 500コア( CPU)がある場合はそうです。
スレッド間でコンテキストを切り替えることは非常にコストのかかるプロセスであり、現在のスレッドを一時停止する必要があります。そのため、CPUごとに1つのスレッドを実行する方が効果的です。
C#4.0では、タスク並列ライブラリと並列LINQ(PLINQ)を使用できるため、.NETFrameworkでの並列プログラミングが簡素化されます。
// IEnumerable<MyClass> items = ...
var results = items
// Enables parallel execution of the query
.AsParallel()
// Specifies the method for creating values
.Select(item => Calculate(item))
// Waits for calculating all the values and returns the result (as an array)
.ToArray();
Task Parallel Libraryを使用して、オブジェクトごとに個別のタスクを開始します。このタスクでは、関数を呼び出してコストを計算します。
ここで例を見ることができます: 方法: 単純な Parallel.ForEach ループを作成する
500 スレッドをスピンアップできますか - はい。それらは同時に実行されますか - いいえ。そうは言っても、使用するスレッドの最適数は、残念ながらコアあたりのスレッドよりも複雑な問題です。
たとえば、Intel プロセッサには、コアごとに 2 つの実行パイプライン (u および v と呼ばれる) があり、条件によっては、同じ 2 つの命令を順次処理するよりも 2 つの命令を高速に実行できるアウトオブオーダー処理が可能です。問題は、実行パイプラインがコア内の一部のリソースを共有していることです。彼らが共有します:
キャッシュ、分岐予測リソース、命令のフェッチとデコード、および実行ユニット。
これは、2 つの命令を実行する効率が、キャッシュ ミスや分岐予測ミスなどに依存することを意味します。利点は、待機時間の長い操作 (キャッシュ ミス時にメモリの内容をキャッシュにフェッチするなど) を待機している間に命令がブロックされている場合に発生します。他のパイプラインに別の命令がある場合は、待機中に処理できます。これは 2 つの個別のコアよりも絶対に高速ではありませんが、多くの場合、順次命令処理よりも高速になります (平均で約 25% 高速です)。
心に留めておくべきもう 1 つのことは、オペレーティング システムもプロセッサ上で実行するためにある程度の時間を必要とすることです。効率的な処理のための最大スレッド数に関する Microsoft の推奨事項は、論理コアあたり 25 スレッドです (ハイパースレッディングなしでは物理コアあたり 1 つの論理コア、HT では物理コアあたり 2 つの論理コアがあります) (これは IIS のコアあたりのデフォルトの最大スレッド設定です)。ただし、これは「経験則」であることに注意してください。真の最適値を見つける唯一の方法は、特定のソフトウェア/ハードウェアのセットアップでテストすることです。ただし、ハードウェアの最適化は実際には実用的ではなく、推奨されないため、「経験則」が必要です。