タスク並列性

タスク並列性（タスクへいれつせい、）は、複数のプロセッサを用いて演算を行う並列コンピューティングの形態の一つである。タスク並列性は、異なる並列計算ノードに実行プロセスあるいはスレッドを分配し、それぞれ異なるタスクを実行させることに焦点を置いている。並列性の別の形態であるデータ並列性と対照をなす。関数並列性 () あるいは制御並列性 () とも。

詳細 
並列計算が可能な環境、例えばマルチソケットあるいはマルチコアによるマルチプロセッサのシステムにおいて、タスク並列性は各プロセッサが異なるスレッド（あるいはプロセス）を同一または異なるデータに対して実行することで得られる。一般的なケースでは、各実行スレッドは作業の実行に伴い他の実行スレッドと通信を行う。通信はワークフローの一部として、あるスレッドから次のスレッドにデータを渡す（双方のスレッドが参照可能な同一メモリ空間内のデータを書き換える）ことで行われる。

単純な例として、タスク "A" と "B" を実行するとき、ある CPU "a" にタスク "A" を行わせ、同時に別の CPU "b" にタスク "B" を行わせることで、単一のCPUに両方のタスクを順番に逐次実行させる場合と比べて処理の実行時間を短縮させることが可能である。通常、タスクを実行するCPUをアプリケーションソフトウェアレベルで明示的に指定することはほとんどなく、プロセスまたはスレッドといった抽象化された実行単位を割り当てるだけにとどめて、実際の計算ノード（例えばローカルコンピュータ上のマルチコアCPUにおける各プロセッサコアや、ネットワーク上の仮想化されたサーバーインスタンスなど）へのプロセス／スレッド割り当てはオペレーティングシステムやフレームワークが担当する。したがって、計算ノードのビジー状況によっては、分配したタスクが異なる計算ノードで実行されず、単一の計算ノードで逐次実行されるということも起こりうる。

タスク並列性は、データの並列性ではなく処理の分散した（並列化された）性質に焦点を置く。実際のプログラムのほとんどはタスク並列性とデータ並列性の間のどこかに落ち着く。

例 
下記の擬似コードでタスク並列性を示す。タスクは下記に示すようなif文で割り当てることができる。

 program:
 ...
 if CPU="a" then
    do task "A"
 else if CPU="b" then
    do task "B"
 end if
 ...
 end program

本プログラムの目的は総和 ("A+B") を求めることである。上記のようなコードを記述し2プロセッサのシステム上で動作させると、ランタイムでは下記のようなコードが実行される。

 並列計算の環境では、いずれの CPU も同じデータにアクセスを行う。
 "if" 節により、CPU ごとに違いが生じる。CPU "a" は "if" で真になり、CPU "b" は "else if" で真になり、両方の CPU がコードブロックを同時に動作させ、異なるタスクを同時に実行する。

CPU "a" で実行されるコード:

 program:
 ...
 do task "A"
 ...
 end program

CPU "b" で実行されるコード:

 program:
 ...
 do task "B"
 ...
 end program

この概念は、任意の数のプロセッサに対して一般化できる。

参考文献 
 Quinn Michael J, Parallel Programming in C with MPI and OpenMP McGraw-Hill Inc. 2004. ISBN 0-07-058201-7

関連項目 
データ並列性
マルチタスク

並列コンピューティング