OpenMP 规范定义了各种类型的任务,程序员可以使用这些任务来减少任务处理开销。
不延迟 (undeferred) 任务是指相对于生成任务,不会延迟执行的任务;也就是说,在不延迟 (undeferred) 任务执行完成前,生成任务区域会暂停。不延迟 (undeferred) 任务可能不会被遇到该任务的线程立即执行。它可能会被放置在池中,然后由遇到该任务的线程或某个其他线程稍后执行。任务执行完成后,生成任务才会恢复执行。例如,if 子句表达式求值结果为 false 的任务即是一个不延迟 (undeferred) 任务。在这种情况下,将生成不延迟 (undeferred) 任务,且遇到该任务的线程必须暂停当前的任务区域。在包含 if 子句的任务完成前,不会恢复当前任务区域的执行。
与不延迟 (undeferred) 任务不同,包括 (included) 任务将由遇到该任务的线程立即执行,而不会放在池中稍后执行。此类任务的执行按顺序包含在生成任务区域中。与不延迟 (undeferred) 任务一样,在包括 (included) 任务的执行完成前将暂停生成任务,执行完成后才会恢复生成任务。举例来说,包括 (included) 任务是最终 (final) 任务的子孙。
合并 (merged) 任务是指其数据环境与其生成任务区域的数据环境一样的任务。如果 mergeable 子句存在于 task 指令中,且生成的任务为不延迟 (undeferred) 任务或包括 (included) 任务,则实现可能会选择生成合并 (merged) 任务。如果生成合并 (merged) 任务,则相应行为就好像根本没有 task 指令一样。
最终 (final) 任务是指会强制其所有子孙任务都成为最终 (final) 和包括 (included) 任务的任务。当 final 子句存在于 task 指令中,且 final 子句表达式求值结果为 true 时,生成的任务将为最终 (final) 任务。