JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:OpenMP API 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  OpenMP API 简介

2.  编译并运行 OpenMP 程序

3.  实现定义的行为

4.  嵌套并行操作

5.  任务处理

5.1 任务处理模型

5.2 数据环境

5.3 任务处理示例

5.4 编程注意事项

5.4.1 THREADPRIVATE 和线程特定的信息

5.4.2 锁

5.4.3 对堆栈数据的引用

6.  自动确定变量的作用域

7.  作用域检查

8.  性能注意事项

A.  子句在指令中的放置

索引

5.1 任务处理模型

任务处理功能有助于应用程序的并行化,其中任务单元是动态生成的,就像在递归结构或 while 循环中一样。

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

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

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

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

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

在 Oracle Solaris Studio 编译器中实现时,这些调度点也是非绑定 (untied) 任务的任务调度点。

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

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

OpenMP 3.1 规范定义了各种类型的任务,程序员可能会选择这些任务用来减少任务处理开销。

未延迟 (undeferred) 任务是指相对于其生成任务区域,不会延迟执行的任务。即,其生成任务区域会暂停,直至未延迟 (undeferred) 任务执行完成。例如,if 子句表达式求值结果为 false 的任务即是一个未延迟 (undeferred) 任务。在这种情况下,将会生成未延迟 (undeferred) 任务,并且遇到该任务的线程必须暂停当前任务区域,直到完成具有 if 子句的任务后才能恢复执行该任务区域。

包括 (included) 任务是指其执行按顺序包括在生成任务区域的任务。即,该任务不会被延迟,由遇到该任务的线程立即执行。例如,属于最终 (final) 任务(如下所述)后代的任务即是一个包括 (included) 任务。

包括 (included) 任务和未延迟 (undeferred) 任务之间的差异很细微。对于未延迟 (undeferred) 任务,生成任务区域会暂停,直至未延迟 (undeferred) 任务执行完成,但是未延迟 (undeferred) 任务可能不会在被遇到时立即执行。未延迟 (undeferred) 任务可能会被放置在概念池中,由遇到该任务的线程或某个其他线程稍后执行;同时,生成任务将被暂停。未延迟 (undeferred) 任务执行完成后,生成任务才能恢复。

对于包括 (included) 任务,一旦被遇到,就立即由遇到该任务的线程执行该包括 (included) 任务。该任务不会被放置在池中以在稍后执行。生成任务会暂停,直到包括 (included) 任务执行完成。包括 (included) 任务执行完成后,生成任务才能恢复。

合并 (merged) 任务是指其数据环境与其生成任务区域的数据环境相同的任务。当 mergeable 子句存在于 task 构造中,且生成的任务为未延迟 (undeferred) 任务或包括 (included) 任务时,则实现可能会选择生成合并 (merged) 任务。如果生成合并 (merged) 任务,则相应行为就好像根本没有 task 指令一样。

最终 (final) 任务是指强制其所有子任务成为最终 (final) 和包括 (included) 任务的任务。当 final 子句存在于 task 构造中,且 final 子句表达式求值结果为 TRUE 时,生成的任务将为最终 (final) 任务。该最终 (final) 任务的所有后代将既是最终 (final) 任务,又是包括 (included) 任务。