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

印刷ビューの終了

更新: 2014 年 12 月
 
 

4.5.1 タスクの依存関係に関する注意

    タスクの依存関係に関する次のヒントに留意してください。

  • depend 節の inout、および inout 依存関係タイプは読み取りと書き込みの操作に似ています。ただし、inout、および inout 依存関係タイプはタスクの依存関係を確立するためだけのものです。それらは、タスク領域内でメモリーアクセスパターンを一切示しません。depend(in:a)depend(out:a)、または depend(inout:a) 節を含むタスクは、その領域内で変数 a の読み取りまたは書き込みを行うことはできますが、変数 a にアクセスすることは一切できません。

  • 同じ task ディレクティブに if 節と depend 節の両方があると、if 節の条件が false と評価されたときに負荷が高くなる可能性があります。task に if(false) 節が含まれている場合、それを検出したスレッドは生成されたタスク (if(false) 節を含むタスク) が完了するまで、現在のタスクを中断させる必要があります。同時に、タスクスケジューラはタスクの依存関係が満たされるまで、生成されたタスクをスケジュールしてはいけません。明示的タスクの生成直後のポイントがタスクスケジューリングポイントとなるため、タスクスケジューラは非延期タスクのタスク依存関係が満たされるようにタスクをスケジュールしようとします。プール内の該当するタスクを検索してスケジュールすると、負荷が高くなる可能性があります。最悪のケースでは、taskwait 領域を使用する場合と同じ負荷がかかる可能性があります。

  • 同じタスクまたは兄弟タスクの depend 節で使用されるリスト項目は、同一ストレージまたは別個のストレージを示す必要があります。そのため、配列セクションが depend 節にある場合は、配列セクションが同一または別個のストレージを示していることを確認してください。