OpenMP - 线程如何决定何时推迟任务以及何时立即执行

问题描述:

OpenMP规范文档说:“当线程遇到任务构造时,它可能会立即选择执行任务,或将其执行推迟到以后的时间“。但是,规范并未说明如何做出这种选择。OpenMP - 线程如何决定何时推迟任务以及何时立即执行

线程如何决定何时立即执行任务以及何时推迟执行?如果这是特定实现,像gcc这样的编译器如何解决这个问题?

有两个条件与标准来:

  1. if条款存在并评估为false,那么新的任务是由当前线程执行现在一个undeferred任务 (旧任务是中止)。

  2. 一个final条款,使新的任务和它所有的子任务最后包括。一个包含的任务undeferred并立即执行遇到线程

以上是松散从the standard

GCC复制(在当前主)也立即执行任务(GOMP_TASK_UNDEFERRED)如果

  • 没有活动的线程组,即任务正在并行区域之外构建。
  • 当前线程组的任务计数大于64 *队中的线程数。

另请参阅:task.c,寻找GOMP_task

LLVM OpenMP运行时使用具有最大大小的任务双端队列,并在该双端队列满时立即执行任务。默认大小是256(1 << 8),但似乎有条件下它加倍。我不太清楚团队中的任务队列是如何组织的。

另请参阅:kmp_tasking.cpp,寻找TASK_NOT_PUSHED