データの並列化 (タスク並列ライブラリ)
"データの並列化" とは、ソース コレクションまたは配列の要素に対して、同じ操作を同時に (つまり、並列で) 実行するシナリオを意味します。 データの並列化操作では、複数のスレッドが異なるセグメント上で同時に操作できるようにソース コレクションがパーティション分割されます。
タスク並列ライブラリ (TPL) は System.Threading.Tasks.Parallel クラスによって、データの並列化をサポートします。 このクラスでは、for ループおよび foreach ループ (Visual Basic では For
および For Each
) をメソッド ベースで並列実装できます。 Parallel.For ループまたは Parallel.ForEach ループに対するループのロジックは、順次ループを記述する場合と同等に記述します。 スレッドまたはキューの作業項目を作成する必要はありません。 基本のループでは、ロックを取得する必要はありません。 TPL では低水準の作業はすべて自動的に行われます。 Parallel.For および Parallel.ForEach の使い方について詳しくは、ドキュメント「Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4」(並列プログラミングのパターン: .NET Framework 4 の並列パターンの理解と適用) をダウンロードしてご覧ください。 次のコード例では、単純な foreach
ループおよびそのループに相当する並列を示しています。
Note
ここでは、ラムダ式を使用して TPL でデリゲートを定義します。 C# または Visual Basic のラムダ式についての情報が必要な場合は、「Lambda Expressions in PLINQ and TPL (PLINQ および TPL のラムダ式)」を参照してください。
// Sequential version
foreach (var item in sourceCollection)
{
Process(item);
}
// Parallel equivalent
Parallel.ForEach(sourceCollection, item => Process(item));
' Sequential version
For Each item In sourceCollection
Process(item)
Next
' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))
並列ループを実行すると、TPL はデータ ソースをパーティション分割して、ループで複数の部分を同時に操作できるようにします。 背後では、タスク スケジューラが、システム リソースおよび作業負荷に基づいてタスクをパーティション分割します。 作業負荷のバランスが崩れると、可能な場合、スケジューラは複数のスレッドとプロセッサ間で作業を再配分します。
注意
固有のカスタム パーティショナーまたはスケジューラを使うこともできます。 詳細については、「PLINQ および TPL 用のカスタム パーティショナー」およびTaskSchedulerに関するページを参照してください。
Parallel.For メソッドおよび Parallel.ForEach メソッドの両方に、ループの実行を停止または中断させるオーバーロードが複数ある場合は、その他のスレッドのループ状態の監視、スレッド ローカルの状態の維持、スレッド ローカル オブジェクトの終了、コンカレンシーの程度の制御などを行います。 この機能を有効にするヘルパー要素には、ParallelLoopState、ParallelOptions、ParallelLoopResult、CancellationToken、および CancellationTokenSource があります。
詳細については、「並列プログラミングのパターン: .NET Framework 4 での並列パターンの理解と適用」をダウンロードしてください。
PLINQ では、宣言構文またはクエリ形式の構文によるデータの並列化がサポートされています。 詳細については、「Parallel LINQ (PLINQ)」を参照してください。
関連トピック
Title | 説明 |
---|---|
方法: 単純な Parallel.For ループを記述する | 任意の配列またはインデックス可能な For ソース コレクションに対して IEnumerable<T> ループを記述する方法について説明します。 |
方法: 単純な Parallel.ForEach ループを記述する | 任意の ForEach ソース コレクションに対して IEnumerable<T> ループを記述する方法について説明します。 |
方法: Stop または Break を使用して Parallel.For ループから抜ける | 並列ループを停止するかまたは抜けて、そのアクションがすべてのスレッドに通知されるようにする方法について説明します。 |
方法: スレッド ローカル変数を使用する Parallel.For ループを記述する | 各スレッドが他のスレッドからは見えないプライベート変数を維持する For ループを記述する方法と、ループが完了したときにすべてのスレッドの結果を同期する方法について説明します。 |
方法: パーティション ローカル変数を使用する Parallel.ForEach ループを記述する | 各スレッドが他のスレッドからは見えないプライベート変数を維持する ForEach ループを記述する方法と、ループが完了したときにすべてのスレッドの結果を同期する方法について説明します。 |
方法: Parallel.For または ForEach ループを取り消す | System.Threading.CancellationToken を使用して並列ループを取り消す方法について説明します。 |
方法: 小さいループ本体を高速化する | ループの本体がごく小さい場合に実行速度を向上させる方法の 1 つを説明します。 |
タスク並列ライブラリ (TPL) | タスク並列ライブラリの概要を示します。 |
並列プログラミング | .NET Framework の並列プログラミングについて説明します。 |
関連項目
.NET