Oracle® Solaris Studio 12.4: OpenMP API ユーザーズガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

4.1.1 OpenMP タスクの実行

OpenMP では、プログラム内の任意の場所に配置できる task 構文を使用して明示的タスクを指定します。スレッドが task 構文を検出すると、新しいタスクが生成されます。

スレッドは、task 構文が検出されると、それをただちに実行するか、実行を延期してあとで実行するかを選択できます。タスクの実行が延期される場合、そのタスクは現在の並列領域に関連付けられた概念上のタスクプールに入れられます。現在のチームに属するスレッドは、プールからタスクを取り出し実行するという処理を、プールが空になるまで繰り返します。タスクを実行するスレッドが、最初にタスクを検出してプールに入れたスレッドとは異なる場合があります。

タスクに関連付けられたコードは 1 回だけ実行されます。コードを最初から最後まで同じスレッドで実行する必要がある場合、タスクは結合されます。コードを複数のスレッドで実行してもかまわない場合、タスクは結合解除され、タスクコードのさまざまな部分が異なるスレッドで実行されます。デフォルトではタスクは結合されており、タスクが結合解除されるように指定するには、task ディレクティブで untied 節を使用します。

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

タスクスケジューリングポイントは、次を含むいくつかの場所で暗黙的に定義されます。

  • 明示的タスクの生成直後のポイント

  • task 領域の完了ポイントのあと

  • taskyield 領域内

  • taskwait 領域内

  • taskgroup 領域の終わり

  • 暗黙的および明示的な barrier 領域内

OpenMP 仕様では、task 構文を使って指定する明示的タスクに加え、暗黙的タスクの概念も説明されています。暗黙的タスクとは、暗黙的な並列領域によって生成されるタスク、または実行中に parallel 構文が検出されたときに生成されるタスクです。後者の場合、それぞれの暗黙的タスクのコードは parallel 構文の内部コードになります。それぞれの暗黙的タスクは、チーム内の異なるスレッドに割り当てられ、結合されます。

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