数据共享属性规则
数据共享属性的规则确定 parallel 和 task 伪指令以及工作共享区域中引用的变量的属性。
针对构造中所引用变量的数据共享属性规则
可以将构造中引用的变量的数据共享属性分为以下类别:
- 预先确定的数据共享属性
- 显式确定的数据共享属性
- 隐式确定的数据共享属性
在包含的构造的 firstprivate, lastprivate或 reduction 子句中指定变量会启动对包含的构造中的变量的隐式引用。 此类隐式引用也遵循数据共享属性规则。
某些变量和对象具有预先确定的数据共享属性,如下所示:
threadprivate伪指令中指定的变量是 threadprivate。- 在构造内的作用域中声明的具有自动存储持续时间的变量是私有变量。
- 共享具有动态存储器持续时间的对象。
- 共享静态数据成员。
for或parallel for构造的关联for循环中的循环迭代变量是私有的。- 如果具有
const限定类型的变量没有可变成员,那么将共享这些变量。 - 对于具有静态存储持续时间的变量,如果在构造内的作用域中声明这些变量,那么将共享这些变量。
不能在数据共享属性子句中指定具有预先确定的数据共享属性的变量。 但是,在以下情况下,允许在数据共享属性子句中指定预定变量,并覆盖该变量的预定数据共享属性。
- 可以在
private或lastprivate子句中指定for或parallel for构造的关联for循环中的循环迭代变量。 - 对于具有
const限定类型的变量,如果它们没有可变成员,那么可以在firstprivate子句中指定这些变量。
满足以下条件的变量已显式确定数据共享属性:
- 在构造中引用变量。
- 这些变量在构造上的数据共享属性子句中指定。
满足以下所有条件的变量隐式确定了数据共享属性:
- 在构造中引用变量。
- 这些变量没有预先确定的数据共享属性。
- 未在构造上的数据共享属性子句中指定变量。
对于具有隐式确定的数据共享属性的变量,规则如下所示:
- 在
parallel或task构造中,变量的数据共享属性由default子句 (如果存在) 确定。 - 在
parallel构造中,如果不存在default子句,那么将共享变量。 - 对于
task以外的构造,如果不存在default子句,那么变量将从外层上下文继承其数据共享属性。 - 在
task构造中,如果不存在default子句,那么将共享确定为由绑定到当前团队的所有隐式任务在外层上下文中共享的变量。 - 在
task构造中,如果不存在default子句,那么其数据共享属性不是由以上规则确定的变量为 firstprivate。
针对在区域中引用但未在构造中引用的变量的数据共享属性规则
在区域中引用但不在构造中引用的变量的数据共享属性如下所示:
- 如果在区域中的被调用例程中声明了具有静态存储持续时间的变量,那么将共享这些变量。
- 如果具有
const限定类型的变量没有可变成员,那么将共享这些变量并在调用的例程中声明这些变量。 - 除非在
threadprivate伪指令中指定了在区域中的被调用例程中引用的文件作用域或名称空间作用域变量,否则将共享这些变量。 - 共享具有动态存储器持续时间的对象。
- 除非在
threadprivate伪指令中指定静态数据成员,否则将共享静态数据成员。 - 区域中通过引用传递的被调用例程的形参继承关联实际参数的数据共享属性。
- 在区域中的被调用例程中声明的其他变量是私有变量。