囲まれた task プラグマに指定された作業単位をエンキューする while ループの環境を指定します。
#pragma intel_omp_taskq |
[clause[[,]clause]...] |
structured-block |
clause (節) は次のいずれかです。
private (variable-list)
firstprivate (variable-list)
lastprivate (variable-list)
reduction (operator : variable-list)
ordered
nowait
private(variable-list) |
private 節は、taskq の variable-list にある各オブジェクトの default-constructed バージョンの private を生成します。囲まれた各タスクで、captureprivate も含みます。各変数に参照されるオリジナルのオブジェクトは、構造に入る時点で中間値を持ちます。構造の動的範囲内では、オブジェクトは変更してはなりません。そして、構造から出る時点で中間値を持ちます。 |
firstprivate (variable-list) |
firstprivate 節は、taskq の variable-list に各オブジェクトにある copy-constructed バージョンの private を生成します。囲まれた各タスクで、captureprivate も含みます。各変数に参照されるオリジナルのオブジェクトは、構造の動的範囲内では、変更してはなりません。そして、構造から出る時点で中間値を持ちます。 |
lastprivate (variable-list) |
lastprivate 節は、taskq の variable-list にある各オブジェクトの default-constructed バージョンの private を生成します。囲まれた各タスクで、captureprivate も含みます。各変数に参照されるオリジナルのオブジェクトは、構造に入る時点で中間値を持ちます。構造の動的範囲内では、オブジェクトは変更してはなりません。そして、タスクの実行が終了した後に、オブジェクトは囲まれた最後のタスクからのオブジェクトの値をコピー割り当てされます。 |
reduction(operator : variable-list) |
reduction 節は、variable-list にある各オブジェクトの囲まれたタスク構造で与えられた演算子を持つリダクション演算を実行します。operator と variable-list は、OpenMP 仕様と同じように定義されます。 |
ordered |
ordered 節は、オリジナルのシーケンシャル実行順序で、囲まれた task 構造で、ordered コンストラクターを実行します。ordered と結合される taskq 宣言子には ordered 節がなければなりません。 |
nowait |
nowait 節は、taskq の最後にある暗黙的なバリアを削除します。taskq 構造にキューされたすべての task 構造が処理される前に、スレッドは taskq 構造を終了できます。 |
intel_omp_taskq/taskq プラグマは、囲まれた作業 (タスク) 単位が実行される環境を指定します。最初に、taskq プラグマを実行するすべてのスレッド間の中から、1 つのスレッドが選択されます。
概念的には、taskq プラグマは、選択したスレッドを実行する空のキューを生成し、次に、taskq ブロック内のコードがシングルスレッドで実行されます。他のすべてのスレッドは、この概念キューに作業がキューイングされるのを待ちます。
task プラグマは、潜在的に異なるスレッドで実行される作業単位を指定します。taskq ブロック内に task プラグマが存在すると、task ブロックの内側のコードは、taskq に関連付けられている概念キューにキューイングされます。キューイングされたすべての作業が終了し、taskq ブロックの最後に達すると、概念キューはなくなります。
taskq プラグマの使用例は、「ワークキューイング関数例」(「アプリケーションの最適化」>「並列化の使用: OpenMP* のサポート」>「インテルのワークキューイング・モデル」) を参照してください。