OpenMP - 线程如何决定何时推迟任务以及何时立即执行
问题描述:
OpenMP规范文档说:“当线程遇到任务构造时,它可能会立即选择执行任务,或将其执行推迟到以后的时间“。但是,规范并未说明如何做出这种选择。OpenMP - 线程如何决定何时推迟任务以及何时立即执行
线程如何决定何时立即执行任务以及何时推迟执行?如果这是特定实现,像gcc这样的编译器如何解决这个问题?
答
有两个条件与标准来:
当
if
条款存在并评估为false
,那么新的任务是由当前线程执行现在一个undeferred任务 (旧任务是中止)。一个
final
条款,使新的任务和它所有的子任务最后和包括。一个包含的任务是undeferred并立即执行遇到线程。
以上是松散从the standard
GCC复制(在当前主)也立即执行任务(GOMP_TASK_UNDEFERRED
)如果
- 没有活动的线程组,即任务正在并行区域之外构建。
- 当前线程组的任务计数大于64 *队中的线程数。
另请参阅:task.c,寻找GOMP_task
。
LLVM OpenMP运行时使用具有最大大小的任务双端队列,并在该双端队列满时立即执行任务。默认大小是256(1 << 8
),但似乎有条件下它加倍。我不太清楚团队中的任务队列是如何组织的。
另请参阅:kmp_tasking.cpp
,寻找TASK_NOT_PUSHED
。