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

时间:2017-10-06 08:11:09

标签: gcc parallel-processing task openmp

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

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

1 个答案:

答案 0 :(得分:3)

标准有两个条件:

  1. if子句存在且评估为false时,新任务是未延迟任务,由当前线程立即执行(旧任务暂停)。

  2. final子句使新任务及其所有子任务最终包含包含的任务 未使用并由遇到线程立即执行。

  3. 以上内容是从the standard

    中松散复制的

    GCC(在当前主站中)也会立即执行任务(GOMP_TASK_UNDEFERRED),如果

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

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

    LLVM OpenMP运行时使用具有最大大小的任务deque,并在此双端队列已满时立即执行任务。默认大小为256(1 << 8),但似乎存在双倍的条件。我不太确定团队中的任务队列是如何组织的。

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