Sun Studio 12 Update 1:OpenMP API 用户指南

5.1 任务处理模型

OpenMP 规范版本 3.0 引入了一个称为任务处理的新功能。任务处理功能有助于应用程序的并行化,其中任务单元是动态生成的,就像在递归结构或 while 循环中一样。

在 OpenMP 中,使用 task 指令指定显式任务。task 指令定义了与任务及其数据环境关联的代码。任务构造可以放置在程序中的任何位置,只要线程遇到任务构造,就会生成新任务。

当线程遇到任务构造时,可能会选择立即执行任务或延迟执行任务直到稍后某个时间再执行。如果延迟执行任务,则任务会被放置在与当前并行区域关联的概念任务池中。当前组中的线程会将任务从该池中取出,并执行这些任务,直到该池为空。执行任务的线程可能与最初遇到该任务的线程不同。

与任务构造关联的代码将只被执行一次。如果代码从始至终都由相同的线程执行,则任务为绑定 (tied) 任务。如果代码可由多个线程执行,使得不同的线程执行代码的不同部分,则任务为非绑定 (untied) 任务。缺省情况下,任务为绑定 (tied) 任务,可以通过将 untied 子句与 task 指令一起使用来将任务指定为非绑定 (untied) 任务。

为了执行不同的任务,允许线程在任务调度点暂停执行任务区域。如果暂停的任务为绑定 (tied) 任务,则同一线程稍后会恢复执行暂停的任务。如果暂停的任务为非绑定 (untied) 任务,则当前组中的任何线程都可能会恢复执行该任务。

OpenMP 规范为绑定 (tied) 任务定义了以下任务调度点:

在 Sun Studio 编译器中实现时,以上调度点也是非绑定 (untied) 任务的任务调度点。

除了使用 task 指令指定的显式任务外,OpenMP 规范版本 3.0 还介绍了隐式任务的概念。隐式任务是由隐式并行区域生成的任务,或是在执行期间遇到并行构造时生成的任务。每个隐式任务的代码都是 parallel 构造内的代码。每个隐式任务会分配给组中的不同线程,且隐式任务为绑定 (tied) 任务,即隐式任务从始至终总是由最初分配给的线程执行。

对于在遇到 parallel 构造时生成的所有隐式任务,都要保证在主线程退出并行区域末尾的隐式屏障时完成。另一方面,对于在并行区域中生成的所有显式任务,都要保证在从并行区域中的下一个隐式或显式屏障退出时完成。

task 构造中存在 if 子句,并且标量表达式的值计算为 false 时,遇到任务的线程必须立即执行任务。if 子句可用于避免生成许多细粒度任务以及将这些任务放在概念池中所造成的开销。