Sun Studio 12 Update 1: OpenMP API ユーザーズガイド

5.1 タスク化モデル

OpenMP 仕様のバージョン 3.0 では、タスク化と呼ばれる新しい機能が追加されました。タスク化の機能を利用すると、再帰的な構造や while ループのように、作業単位が動的に生成されるようなアプリケーションの並列化が容易になります。

OpenMP では、明示的 タスクを task 指令を使って指定します。task 指令は、タスクとそのデータ環境に関連づけられたコードを定義します。タスクのコンストラクトは、プログラムのどこに置いても構いません。スレッドがタスクコンストラクトを検出すると、新しいタスクが生成されます。

スレッドがタスクコンストラクトを検出すると、スレッドはそれをすぐに実行するか、実行を延期して後で実行するかを選択することがあります。タスクの実行が保留されると、そのタスクは現在の並列領域に関連づけられた概念上のタスクプールに置かれます。現在のチームに属するスレッドは、プールからタスクを取り出し実行するという処理を、プールが空になるまで繰り返します。タスクを実行するスレッドは、タスクを検出した元のスレッドとは異なる場合があります。

タスクコンストラクトに関連づけられたコードは、1 回だけ実行されます。コードが最初から最後まで同じスレッドにより実行されると、タスクは結合されます。コードが複数のスレッドにより実行可能な場合は、タスクは結合解除されます。この場合、コードの異なる部分が別のスレッドにより実行されます。デフォルトでは、タスクは結合されていますが、結合解除 節を task 指令で使用することにより、結合解除に指定することができます。

スレッドは、タスクのスケジューリングポイントでタスク領域の実行を中断して、異なるタスクを実行することができます。中断されたタスクが結合されている場合は、同じスレッドにより中断されたタスクの実行が後に再開されます。中断されたタスクが結合されていない場合は、現在のチームに属するスレッドならどれでもタスクの実行を再開できます。

OpenMP 仕様には、結合されたタスクに対して次のタスクスケジューリングポイントが定義されています。

Sun Studio コンパイラによる実装に従い、上記のスケジューリングポイントは結合解除されたタスクのタスクスケジューリングポイントでもあります。

タスク指令を使って指定された明示的タスクに加え、OpenMP 仕様のバージョン 3.0 では暗黙的タスクの概念も取り入れられています。暗黙的タスクは、暗黙的な並列領域により生成されるタスク、または実行中に並列構文を検出したときに生成されるタスクです。それぞれの暗黙的タスクのコードは、parallel コンストラクトの内部コードです。暗黙的タスクはそれぞれチーム内の異なるスレッドに割り当てられ、結合されます。すなわち、暗黙的タスクは最初から最後まで常に最初に割り当てられたスレッドにより実行されます。

parallel コンストラクトが検出されたときに生成されたすべての暗黙的タスクは、マスタースレッドが並列領域の最後で暗黙的バリアーを終了するときに完了することが保証されます。一方、並列領域内に生成されるすべての明示的タスクは、並列領域内の次の暗黙的または明示的バリアーの終了時に完了することが保証されます。

if 節が task コンストラクトにあり、スカラー式の評価値が false の場合には、タスクを検出したスレッドはただちにそのタスクを実行する必要があります。if 節は、細かく組まれた多数のタスクを生成し、それらを概念上のプールに配置するというオーバーヘッドを避けるために使用することができます。