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