2017-10-06 7 views
2

OpenMP仕様書では「スレッドがタスク構成に遭遇したときに、
タスクをただちに実行するか、後の時間 "。しかし、この仕様書はどのようにしてこの選択がなされるかを述べていない。OpenMP - タスクを延期するタイミングと即時実行するタイミングをスレッドがどのように決めるのか

スレッドは、タスクをすぐに実行するタイミングと実行を延期するタイミングをどのように決定しますか?これが実装固有の場合、gccのようなコンパイラはこれをどのように解決しますか?

答えて

3

標準から来る二つの条件があります。

  1. if句が存在し、falseに評価され、その後、新しいタスクが現在のスレッドによって、今実行されundeferredタスクですが、 (古いタスクはです。)。

  2. final句は、新しいタスクとそのすべての子タスク最終を含まします。 のタスクは、が不一致であり、のスレッドに直ちに実行されます。

上記緩くもアクティブなスレッドのチームがありません(GOMP_TASK_UNDEFERRED

  • 場合、すなわちAすぐにタスクを実行する(現在のマスターに)the standard

    GCCからコピーされますタスクが並列領域外に構築されています。

  • 現在のスレッドチームのタスク数は、64 *チーム内のスレッド数より大きくなっています。

も参照してください。task.cGOMP_taskを探してください。

LLVM OpenMPランタイムは、最大サイズのタスクデキューを使用し、この両端キューがいっぱいの場合はすぐにタスクを実行します。デフォルトのサイズは256(1 << 8)ですが、倍になる条件があるようです。タスクキューがチーム内でどのくらい正確に構成されているかはわかりません。

参照:kmp_tasking.cppTASK_NOT_PUSHEDを探してください。

関連する問題