タスク並列処理(関数並列処理や制御並列処理とも呼ばれる)は、並列コンピューティング環境において複数のプロセッサ間でコンピュータ コードを並列化する形式です。タスク並列処理は、プロセスまたはスレッドによって同時に実行されるタスクを、異なるプロセッサ間で分散することに重点を置いています。データの異なるコンポーネントに対して同じタスクを実行するデータ並列処理とは対照的に、タスク並列処理は、同じデータに対して同時に多くの異なるタスクを実行することで区別されます。[1]一般的なタイプのタスク並列処理はパイプライン処理で、これは 1 セットのデータ を一連の個別のタスクに渡して移動し、各タスクが他のタスクから独立して実行できるようにします。
説明
マルチプロセッサシステムでは、各プロセッサが同じデータまたは異なるデータに対して異なるスレッド(またはプロセス)を実行することでタスクの並列処理が実現されます。スレッドは同じコードを実行することも、異なるコードを実行することもできます。一般的には、異なる実行スレッドは作業中に互いに通信しますが、これは必須ではありません。通信は通常、ワークフローの一部として、あるスレッドから次のスレッドにデータを渡すことによって行われます。[2]
簡単な例として、システムが並列環境の 2 プロセッサ システム ( CPU "a" と "b") でコードを実行していて、タスク "A" と "B" を実行したい場合、CPU "a" にタスク "A" を実行し、CPU "b" にタスク "B" を同時に実行するように指示することで、実行時間を短縮できます。タスクは、以下に示すように条件文を使用して割り当てることができます。
タスク並列性は、データ(データ並列性)ではなく、処理(スレッド)の分散(並列化)性質を重視します。実際のプログラムのほとんどは、タスク並列性とデータ並列性の間のどこかに位置します。[3]
スレッド レベルの並列処理( TLP ) は、複数のスレッドを同時に実行するアプリケーションに固有の並列処理です。このタイプの並列処理は、データベースなどの商用サーバー用に作成されたアプリケーションで主に使用されています。一度に多数のスレッドを実行することで、これらのアプリケーションは、ワークロードで発生する可能性のある大量の I/O およびメモリ システム レイテンシを許容できます。つまり、1 つのスレッドがメモリまたはディスク アクセスを待機している間に、他のスレッドは有効な作業を実行できます。
スレッドレベルの並列処理の活用は、マルチコアマイクロプロセッサの登場によりデスクトップ市場にも浸透し始めています。これは、さまざまな理由から、単一コアのクロック速度またはクロックあたりの命令数を増やすことがますます非現実的になったためです。この傾向が続くと、潜在的なコンピューティング能力の向上の恩恵を受けるには、新しいアプリケーションを複数のスレッドを使用するように設計する必要があります。これは、既存のコードを新しい/高速なコンピュータで実行することで自動的に高速化していた以前のマイクロプロセッサの革新とは対照的です。
例
以下の疑似コードはタスクの並列処理を示しています。
プログラム:
...
CPU = "a"の場合
タスク「A」を実行する
それ以外の場合、CPU="b" であれば
タスク「B」を実行する
終了の場合
...
プログラム終了
プログラムの目標は、何らかの純合計タスク ("A+B") を実行することです。上記のようにコードを記述し、2 プロセッサ システムで起動すると、ランタイム環境は次のように実行します。
- SPMD (単一プログラム、複数データ) システムでは、両方のCPU がコードを実行します。
- 並列環境では、両方が同じデータにアクセスできるようになります。
- 「if」句は CPU を区別します。CPU「a」は「if」で true を読み取り、CPU「b」は「else if」で true を読み取り、それぞれ独自のタスクを持ちます。
- 現在、両方の CPU が別々のコード ブロックを同時に実行し、異なるタスクを同時に実行しています。
CPU「a」によって実行されるコード:
プログラム: ... タスク「A」を実行する ... プログラム終了
CPU「b」によって実行されるコード:
プログラム: ... タスク「B」を実行する ... プログラム終了
この概念は、任意の数のプロセッサに一般化できるようになりました。
言語サポート
タスクの並列処理は、汎用言語では組み込み機能またはライブラリによってサポートされます。注目すべき例は次のとおりです。
- Ada: タスク (組み込み)
- C++ (Intel):スレッド ビルディング ブロック
- C++ (Intel): Cilk Plus
- C++ (オープンソース/Apache 2.0): RaftLib
- C、C++、Objective-C、Swift (Apple): Grand Central Dispatch
- D:タスクとファイバー
- Delphi (System.Threading.TParallel)
- Go:ゴルーチン
- Java: Java の並行性
- .NET:タスク並列ライブラリ
細粒度タスク並列言語の例としては、 VerilogやVHDLなどのハードウェア記述言語の分野が挙げられます。
参照
参考文献
- ^ Reinders, James (2007 年 9 月 10 日)。「タスクとデータの並列処理を理解する」ZDNet。2017年5 月 8 日閲覧。
- ^ Quinn, Michael J. (2007). MPI と openMP による C 言語での並列プログラミング(Tata McGraw-Hill 編). ニューデリー: Tata McGraw-Hill Pub. ISBN 978-0070582019。
- ^ Hicks, Michael. 「並行性の基礎」(PDF) .メリーランド大学: コンピュータサイエンス学部. 2017 年5 月 8 日閲覧。
