OpenMP规范文档说"当一个线程遇到任务构造时,它可能是 选择立即执行任务或将其执行推迟到以后的时间"。但是,规范并未说明如何做出这种选择。
线程如何决定何时立即执行任务以及何时推迟执行?如果这是特定于实现的,那么像gcc这样的编译器如何解决这个问题?
答案 0 :(得分:3)
标准有两个条件:
当if
子句存在且评估为false
时,新任务是未延迟任务,由当前线程立即执行(旧任务暂停)。
final
子句使新任务及其所有子任务最终和包含。 包含的任务 未使用并由遇到线程立即执行。
以上内容是从the standard
中松散复制的 GCC(在当前主站中)也会立即执行任务(GOMP_TASK_UNDEFERRED
),如果
另请参阅:task.c,查找GOMP_task
。
LLVM OpenMP运行时使用具有最大大小的任务deque,并在此双端队列已满时立即执行任务。默认大小为256(1 << 8
),但似乎存在双倍的条件。我不太确定团队中的任务队列是如何组织的。
另请参阅:kmp_tasking.cpp
,查找TASK_NOT_PUSHED
。