データの並列化 (タスク並列ライブラリ)Data Parallelism (Task Parallel Library)

"データの並列化" とは、ソース コレクションまたは配列の要素に対して、同じ操作を同時に (つまり、並列で) 実行するシナリオを意味します。Data parallelism refers to scenarios in which the same operation is performed concurrently (that is, in parallel) on elements in a source collection or array. データの並列化操作では、複数のスレッドが異なるセグメント上で同時に操作できるようにソース コレクションがパーティション分割されます。In data parallel operations, the source collection is partitioned so that multiple threads can operate on different segments concurrently.

タスク並列ライブラリ (TPL) は System.Threading.Tasks.Parallel クラスによって、データの並列化をサポートします。The Task Parallel Library (TPL) supports data parallelism through the System.Threading.Tasks.Parallel class. このクラスでは、for ループおよび foreach ループ (Visual Basic では For および For Each) をメソッド ベースで並列実装できます。This class provides method-based parallel implementations of for and foreach loops (For and For Each in Visual Basic). Parallel.For ループまたは Parallel.ForEach ループに対するループのロジックは、順次ループを記述する場合と同等に記述します。You write the loop logic for a Parallel.For or Parallel.ForEach loop much as you would write a sequential loop. スレッドまたはキューの作業項目を作成する必要はありません。You do not have to create threads or queue work items. 基本のループでは、ロックを取得する必要はありません。In basic loops, you do not have to take locks. TPL では低水準の作業はすべて自動的に行われます。The TPL handles all the low-level work for you. Parallel.For および Parallel.ForEach の使用の詳細については、ドキュメント「並列プログラミングのパターン: .NET Framework 4 での並列パターンの理解と適用」をダウンロードしてください。For in-depth information about the use of Parallel.For and Parallel.ForEach, download the document Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4. 次のコード例では、単純な foreach ループおよびそのループに相当する並列を示しています。The following code example shows a simple foreach loop and its parallel equivalent.

注意

ここでは、ラムダ式を使用して TPL でデリゲートを定義します。This documentation uses lambda expressions to define delegates in TPL. C# または Visual Basic のラムダ式についての情報が必要な場合は、「Lambda Expressions in PLINQ and TPL (PLINQ および TPL のラムダ式)」を参照してください。If you are not familiar with lambda expressions in C# or Visual Basic, see Lambda Expressions in PLINQ and 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 はデータ ソースをパーティション分割して、ループで複数の部分を同時に操作できるようにします。When a parallel loop runs, the TPL partitions the data source so that the loop can operate on multiple parts concurrently. 背後では、タスク スケジューラが、システム リソースおよび作業負荷に基づいてタスクをパーティション分割します。Behind the scenes, the Task Scheduler partitions the task based on system resources and workload. 作業負荷のバランスが崩れると、可能な場合、スケジューラは複数のスレッドとプロセッサ間で作業を再配分します。When possible, the scheduler redistributes work among multiple threads and processors if the workload becomes unbalanced.

注意

固有のカスタム パーティショナーまたはスケジューラを使うこともできます。You can also supply your own custom partitioner or scheduler. 詳細については、「PLINQ および TPL 用のカスタム パーティショナー」およびTaskSchedulerに関するページを参照してください。For more information, see Custom Partitioners for PLINQ and TPL and Task Schedulers.

Parallel.For メソッドおよび Parallel.ForEach メソッドの両方に、ループの実行を停止または中断させるオーバーロードが複数ある場合は、その他のスレッドのループ状態の監視、スレッド ローカルの状態の維持、スレッド ローカル オブジェクトの終了、コンカレンシーの程度の制御などを行います。Both the Parallel.For and Parallel.ForEach methods have several overloads that let you stop or break loop execution, monitor the state of the loop on other threads, maintain thread-local state, finalize thread-local objects, control the degree of concurrency, and so on. この機能を有効にするヘルパー要素には、ParallelLoopStateParallelOptionsParallelLoopResultCancellationToken、および CancellationTokenSource があります。The helper types that enable this functionality include ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken, and CancellationTokenSource.

詳細については、「並列プログラミングのパターン: .NET Framework 4 での並列パターンの理解と適用」をダウンロードしてください。For more information, see Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4.

PLINQ では、宣言構文またはクエリ形式の構文によるデータの並列化がサポートされています。Data parallelism with declarative, or query-like, syntax is supported by PLINQ. 詳細については、「Parallel LINQ (PLINQ)」を参照してください。For more information, see Parallel LINQ (PLINQ).

TitleTitle 説明Description
方法: 単純な Parallel.For ループを記述するHow to: Write a Simple Parallel.For Loop 任意の配列またはインデックス可能な For ソース コレクションに対して IEnumerable<T> ループを記述する方法について説明します。Describes how to write a For loop over any array or indexable IEnumerable<T> source collection.
方法: 単純な Parallel.ForEach ループを記述するHow to: Write a Simple Parallel.ForEach Loop 任意の ForEach ソース コレクションに対して IEnumerable<T> ループを記述する方法について説明します。Describes how to write a ForEach loop over any IEnumerable<T> source collection.
方法: Stop または Break を使用して Parallel.For ループから抜けるHow to: Stop or Break from a Parallel.For Loop 並列ループを停止するかまたは抜けて、そのアクションがすべてのスレッドに通知されるようにする方法について説明します。Describes how to stop or break from a parallel loop so that all threads are informed of the action.
方法: スレッド ローカル変数を使用する Parallel.For ループを記述するHow to: Write a Parallel.For Loop with Thread-Local Variables 各スレッドが他のスレッドからは見えないプライベート変数を維持する For ループを記述する方法と、ループが完了したときにすべてのスレッドの結果を同期する方法について説明します。Describes how to write a For loop in which each thread maintains a private variable that is not visible to any other threads, and how to synchronize the results from all threads when the loop completes.
方法: パーティション ローカル変数を使用する Parallel.ForEach ループを記述するHow to: Write a Parallel.ForEach Loop with Partition-Local Variables 各スレッドが他のスレッドからは見えないプライベート変数を維持する ForEach ループを記述する方法と、ループが完了したときにすべてのスレッドの結果を同期する方法について説明します。Describes how to write a ForEach loop in which each thread maintains a private variable that is not visible to any other threads, and how to synchronize the results from all threads when the loop completes.
方法: Parallel.For または ForEach ループを取り消すHow to: Cancel a Parallel.For or ForEach Loop System.Threading.CancellationToken を使用して並列ループを取り消す方法について説明します。Describes how to cancel a parallel loop by using a System.Threading.CancellationToken
方法: 小さいループ本体を高速化するHow to: Speed Up Small Loop Bodies ループの本体がごく小さい場合に実行速度を向上させる方法の 1 つを説明します。Describes one way to speed up execution when a loop body is very small.
タスク並列ライブラリ (TPL)Task Parallel Library (TPL) タスク並列ライブラリの概要を示します。Provides an overview of the Task Parallel Library.
並列プログラミングParallel Programming .NET Framework の並列プログラミングについて説明します。Introduces Parallel Programming in the .NET Framework.

関連項目See also