在 OpenMP 中,显式任务使用 task 构造指定,该构造可放置在程序中的任一位置。只要线程遇到 task 构造,就会生成一个新任务。
当线程遇到 task 构造时,可以选择立即执行任务或将任务延迟到稍后某个时间再执行。如果延迟执行任务,则任务会被放置在与当前并行区域关联的概念任务池中。当前组中的线程会将任务从该池中取出,并执行这些任务,直到该池为空。执行任务的线程可能不是最初遇到该任务并将该任务放在池中的线程。
与任务关联的代码仅执行一次。如果代码从始至终都必须由相同的线程执行,则任务为绑定 (tied) 任务。如果代码可由多个线程执行,即由不同的线程执行任务代码的不同部分,则任务为非绑定 (untied) 任务。缺省情况下,任务为绑定 (tied) 任务,可以通过在 task 指令中使用 untied 子句将任务指定为非绑定 (untied) 任务。
允许线程在任务调度点暂停执行任务区域,以便执行另一任务。如果暂停的任务为绑定 (tied) 任务,则同一线程稍后会恢复执行暂停的任务。如果暂停的任务为非绑定 (untied) 任务,则当前组中的任何线程都可能会恢复执行该任务。
任务调度点隐含在多个位置中,包括以下位置:
紧随在显式任务生成之后的点
task 区域完成点之后的位置
在 taskyield 区域中
在 taskwait 区域中
taskgroup 区域末尾
在隐式和显式 barrier 区域中
除了使用 task 构造指定的显式任务外,OpenMP 规范还介绍了隐式任务的概念。隐式任务是由隐式并行区域生成的任务,或是在执行期间遇到 parallel 构造时生成的任务。在后一种情况中,每个隐式任务的代码都是 parallel 构造内的代码。每个隐式任务分配给组中不同的线程,且为绑定 (tied) 任务。
对于在遇到 parallel 构造时生成的所有隐式任务,都要保证在主线程退出并行区域末尾的隐式屏障时完成。另一方面,对于在并行区域中生成的所有显式任务,都要保证在从并行区域中的下一个隐式或显式屏障退出时完成。