インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド

omp task

タスク領域を定義します。

構文

#pragma omp task [clause[[,]clause]...]

block

引数

clause

clause (節) は次のいずれかです。

final(scalar_expression)

scalar_expression の評価結果が true の場合、生成されるタスクが final タスクになります。

final タスクは、そのすべての派生タスク (子孫) がインクルード・タスクになるよう強制します。

final タスクの実行中に見つかったすべての task 構造は、インクルード・タスクを生成します。

task 構造の final 節の式で変数が使用されると、その task 構造内のすべての構造でその変数が暗黙的に参照されます。

task プラグマでは final 節を 1 つしか指定できません。

private(list)

タスク内でプライベートと見なされる変数のリストを指定します。

firstprivate(list)

タスク生成時の構文コンテキストにある同じ名前の変数で初期化されるプライベートな変数のリストを指定します。

shared(list)

タスク内で参照される構文コンテキストの変数のリストを指定します。

default(shared|none)

default(shared) は、タスクで使用され、privatefirstprivateshared 節で明示的に宣言されていない変数を共有にします。 default(none) は、タスクで使用され、privatefirstprivateshared 節で明示的に宣言されていない変数を、コンパイル時に構文エラーとして報告します。

untied

タスクの実行を開始したスレッドにタスクをバインドしないように指示します。実行の中断後にチーム内の任意のスレッドでタスク領域を再開できます。例えば、実行時にコンパイラーは、与えられたタスクの実行をスレッド A で開始し、中断した後にスレッド B で再開できます。

if(scalar_expression)

scalar_expression の評価結果が true の場合のみ、囲まれたコード領域を並列に実行するように指示します。 この節を指定しないと、その領域は if(true) を指定した場合と同じように実行されます。

scalar_expression の評価結果が false の場合、到達スレッドは現在のタスク領域の実行を直ちに中断し、生成されたタスクの実行を開始しなければなりません。 中断されたタスク領域は、生成されたタスクが完了するまで再開されません。

この節は、データスコープ属性が有効になる前にマスタースレッドによって評価されます。

task プラグマでは if 節を 1 つしか指定できません。

mergeable

生成されたタスクが undeferred task または included task の場合、代わりに merged task を生成できることを示します。

undeferred task とは、生成されるタスク領域によって実行が遅延されないタスクです。つまり、生成されるタスク領域は undeferred task の実行が完了するまで中断されます。

included task とは、生成されるタスク領域にシーケンシャルに含められ、実行されるタスクです。つまり、到達スレッドによって直ちに実行されます。

merged task とは、内部制御変数を含むデータ環境が生成されるタスク領域と同じタスクのことです。 内部制御変数 (ICV) については、最新の OpenMP* 仕様を参照してください。

block

文または構造の構造ブロックを指します。ブロックの内側から外側へ、または外側から内側へ分岐することはできません。

説明

スレッドが task 構造に到達すると、関連付けられた構造ブロックのコードに対するタスクが生成されます。 到達スレッドは、ただちにタスクを実行するか、または実行を保留します。 実行が保留された場合、タスクはチーム内の任意のスレッドに割り当てられます。

タスク領域内のタスク・スケジューリング・ポイントに到達したスレッドは、そのタスク領域を一時的に中断することがあります。 その場合、デフォルトではタスクがバインドされ、中断されたタスク領域はそれを開始したスレッドによってのみ再開できます。 ただし、task 構造で untied 節が指定されている場合は、中断後にチーム内の任意のスレッドでそのタスク領域を再開できます。 次の場合には、untied 節は無視されます。

task 構造は、外側のタスクの中に入れ子されることがありますが、内側タスクのタスク領域は、外側タスクのタスク領域の一部ではありません。

task 構造には、生成されるタスクのタスク領域に (明示的なタスクの生成直後に) タスク・スケジューリング・ポイントがあります。 そして、それぞれの明示的なタスク領域には、その終了ポイントにタスク・スケジューリング・ポイントがあります。 タスク・スケジューリング・ポイントは、untied タスク領域の任意の場所に追加することができます。

明示的なタスク領域によってストレージが共有される場合は、その実行が完了する前にストレージが無効にならないように、適切な同期を追加する必要があります。

プログラムは、task プラグマの節の評価の順序や影響に依存してはなりません。 タスク領域の内側から外側へ、または外側から内側へ分岐するプログラムはサポートされません。

同じユニットの複数のタスクで、同期せずに C++ I/O 文を使用した場合の動作は不定です。

struct node {
struct node *left;
struct node *right;
};
extern void process(struct node *);
int depth, limit;

void traverse( struct node *p ) {

// When depth>limit, stop generating new tasks, and allow the 
// compiler to avoid creating a new data environment.

if (p->left)
#pragma omp task final(depth>limit) mergeable
     // p is firstprivate by default
traverse(p->left);
if (p->right)
#pragma omp task final(depth>limit) mergeable
     // p is firstprivate by default
traverse(p->right);
process(p);
}


このヘルプトピックについてのフィードバックを送信