タスク並列処理(関数並列処理、制御並列処理とも呼ばれる)は、並列コンピューティング環境において、複数のプロセッサ間でコンピュータコードを並列化する形式です。タスク並列処理は、プロセスまたはスレッドによって同時に実行されるタスクを、異なるプロセッサ間で分散することに重点を置いています。データの異なるコンポーネントに対して同じタスクを実行するデータ並列処理とは対照的に、タスク並列処理は、同じデータに対して同時に多数の異なるタスクを実行することで区別されます。[ 1 ]一般的なタスク並列処理の形式はパイプライン処理であり、これは、各タスクが他のタスクとは独立して実行できる一連の個別のタスクを通して、単一のデータセットを移動させることから成ります。
マルチプロセッサシステムでは、各プロセッサが同じデータまたは異なるデータに対して異なるスレッド(またはプロセス)を実行することで、タスクの並列処理が実現されます。スレッドは同じコードまたは異なるコードを実行する場合があります。一般的には、異なる実行スレッドは作業中に互いに通信しますが、これは必須ではありません。通信は通常、ワークフローの一部として、あるスレッドから次のスレッドにデータを渡すことによって行われます。[ 2 ]
簡単な例として、システムが並列環境で2つのプロセッサ(CPU「a」と「b」)上でコードを実行している場合、タスク「A」と「B」を実行したいとします。この場合、CPU「a」にタスク「A」を、CPU「b」にタスク「B」を同時に実行するように指示することで、実行時間を短縮できます。タスクの割り当ては、以下に説明する条件文を使用して行うことができます。
タスク並列処理は、データ並列処理とは対照的に、処理の分散(並列化)特性(つまりスレッド)を重視します。実際のプログラムのほとんどは、タスク並列処理とデータ並列処理の間のどこかに位置します。[ 3 ]
スレッドレベル並列処理(TLP)とは、複数のスレッドを同時に実行するアプリケーションに内在する並列処理のことです。この種の並列処理は、データベースなどの商用サーバー向けに開発されたアプリケーションで広く見られます。これらのアプリケーションは、多数のスレッドを同時に実行することで、ワークロードによって発生する大量のI/Oやメモリシステムの遅延を許容することができます。つまり、あるスレッドがメモリやディスクへのアクセス待ちで遅延している間にも、他のスレッドは有用な処理を実行できるのです。
マルチコアマイクロプロセッサの登場に伴い、スレッドレベル並列処理の活用はデスクトップ市場にも浸透し始めています。これは、様々な理由から、単一コアのクロック速度やクロックあたりの命令数を増やすことがますます非現実的になってきたためです。この傾向が続けば、潜在的な計算能力の向上を享受するためには、新しいアプリケーションは複数のスレッドを活用するように設計する必要が出てくるでしょう。これは、既存のコードをより新しく高速なコンピュータで実行することで自動的に高速化できた従来のマイクロプロセッサの革新とは対照的です。
以下の擬似コードは、タスクの並列処理を示しています。
プログラム: ... CPU = "a" の場合 タスク「A」を実行する そうでなければ、CPU="b"ならば タスク「B」を実行する endif ... 最終プログラム
このプログラムの目的は、合計で何らかのタスク(「A+B」)を実行することです。上記のようにコードを記述し、2プロセッサシステムで実行すると、実行環境は次のように実行します。
CPU「a」によって実行されたコード:
プログラム: ... タスク「A」を実行する ... 最終プログラム
CPU「b」によって実行されたコード:
プログラム: ... タスク「B」を実行する ... 最終プログラム
この概念は、プロセッサの数に関係なく一般化できるようになった。
汎用プログラミング言語では、組み込み機能またはライブラリによってタスク並列処理をサポートできます。代表的な例としては、以下のようなものがあります。
きめ細かいタスク並列言語の例としては、VerilogやVHDLのようなハードウェア記述言語の分野が挙げられる。