OpenMP仕様書では「スレッドがタスク構成に遭遇したときに、
タスクをただちに実行するか、後の時間 "。しかし、この仕様書はどのようにしてこの選択がなされるかを述べていない。OpenMP - タスクを延期するタイミングと即時実行するタイミングをスレッドがどのように決めるのか
スレッドは、タスクをすぐに実行するタイミングと実行を延期するタイミングをどのように決定しますか?これが実装固有の場合、gccのようなコンパイラはこれをどのように解決しますか?
OpenMP仕様書では「スレッドがタスク構成に遭遇したときに、
タスクをただちに実行するか、後の時間 "。しかし、この仕様書はどのようにしてこの選択がなされるかを述べていない。OpenMP - タスクを延期するタイミングと即時実行するタイミングをスレッドがどのように決めるのか
スレッドは、タスクをすぐに実行するタイミングと実行を延期するタイミングをどのように決定しますか?これが実装固有の場合、gccのようなコンパイラはこれをどのように解決しますか?
標準から来る二つの条件があります。
if
句が存在し、false
に評価され、その後、新しいタスクが現在のスレッドによって、今実行されundeferredタスクですが、 (古いタスクはです。)。
final
句は、新しいタスクとそのすべての子タスク最終とはを含まします。 のタスクは、が不一致であり、のスレッドに直ちに実行されます。
上記緩くもアクティブなスレッドのチームがありません(GOMP_TASK_UNDEFERRED
)
GCCからコピーされますタスクが並列領域外に構築されています。
も参照してください。task.c、GOMP_task
を探してください。
LLVM OpenMPランタイムは、最大サイズのタスクデキューを使用し、この両端キューがいっぱいの場合はすぐにタスクを実行します。デフォルトのサイズは256(1 << 8
)ですが、倍になる条件があるようです。タスクキューがチーム内でどのくらい正確に構成されているかはわかりません。
参照:kmp_tasking.cpp
、TASK_NOT_PUSHED
を探してください。