OpenMP では、プログラム内の任意の場所に配置できる task 構文を使用して明示的タスクを指定します。スレッドが task 構文を検出すると、新しいタスクが生成されます。
スレッドは、task 構文が検出されると、それをただちに実行するか、実行を延期してあとで実行するかを選択できます。タスクの実行が延期される場合、そのタスクは現在の並列領域に関連付けられた概念上のタスクプールに入れられます。現在のチームに属するスレッドは、プールからタスクを取り出し実行するという処理を、プールが空になるまで繰り返します。タスクを実行するスレッドが、最初にタスクを検出してプールに入れたスレッドとは異なる場合があります。
タスクに関連付けられたコードは 1 回だけ実行されます。コードを最初から最後まで同じスレッドで実行する必要がある場合、タスクは結合されます。コードを複数のスレッドで実行してもかまわない場合、タスクは結合解除され、タスクコードのさまざまな部分が異なるスレッドで実行されます。デフォルトではタスクは結合されており、タスクが結合解除されるように指定するには、task ディレクティブで untied 節を使用します。
スレッドは、異なるタスクを実行するためにタスクスケジューリングポイントでタスク領域の実行を中断できます。中断されたタスクが結合されている場合は、同じスレッドにより中断されたタスクの実行が後に再開されます。中断されたタスクが結合されていない場合は、現在のチームに属するスレッドならどれでもタスクの実行を再開できます。
タスクスケジューリングポイントは、次を含むいくつかの場所で暗黙的に定義されます。
明示的タスクの生成直後のポイント
task 領域の完了ポイントのあと
taskyield 領域内
taskwait 領域内
taskgroup 領域の終わり
暗黙的および明示的な barrier 領域内
OpenMP 仕様では、task 構文を使って指定する明示的タスクに加え、暗黙的タスクの概念も説明されています。暗黙的タスクとは、暗黙的な並列領域によって生成されるタスク、または実行中に parallel 構文が検出されたときに生成されるタスクです。後者の場合、それぞれの暗黙的タスクのコードは parallel 構文の内部コードになります。それぞれの暗黙的タスクは、チーム内の異なるスレッドに割り当てられ、結合されます。
parallel 構文が検出されたときに生成されたすべての暗黙的タスクは、マスタースレッドが並列領域の最後で暗黙的バリアーを終了するときに完了することが保証されます。一方、並列領域内に生成されるすべての明示的タスクは、並列領域内の次の暗黙的または明示的バリアーの終了時に完了することが保証されます。