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

6.3 关于自动作用域的通用注释

在自动确定没有隐式作用域的变量的作用域时,编译器将根据上述规则按给定顺序 S1–S3(如果变量为标量)以及上述规则 A1(如果变量为数组)检查变量的使用情况。如果符合某个规则,编译器将按照匹配的规则确定变量的作用域。如果不符合某个规则,编译器将尝试使用下一个规则。如果编译器找不到匹配项,它将放弃确定该变量的作用域的尝试,并将该变量的作用域确定为 SHARED,然后像指定了 IF (.FALSE.)if(0) 子句一样,将绑定并行区域序列化。

作用域的自动确定失败的原因有两个。一个原因是使用的变量不匹配任何规则。第二个原因是源代码对于编译器来说过于复杂,因而无法执行全面的分析。函数调用、复杂的数组下标、内存别名和用户实现的同步都是常见原因。(请参见6.5 当前实现的已知限制。)

6.3.1 Fortran 95 的自动确定作用域规则:

对于 Fortran,如果由 __autodefault(__auto) 子句自动确定某个变量的作用域,并且该变量具有根据 OpenMP 规范预先确定的作用域,则编译器将根据该预先确定的作用域来确定变量的作用域。

对于 Fortran,下列变量具有预先确定的作用域:

6.3.2 C/C++ 的自动确定作用域规则:

对于 C/C++,如果由 __autodefault(__auto) 子句自动确定某个变量的作用域,并且该变量具有根据 OpenMP 规范预先确定的作用域,则编译器将根据该预先确定的作用域来确定变量的作用域。

对于 C/C++,下列变量具有预先确定的作用域:

C 和 C++ 中的自动确定作用域仅适用于基本数据类型: 整型、浮点型和指针。如果用户指定了要自动确定作用域的结构变量或类变量,则编译器会将该变量的作用域确定为 shared,并且封闭并行区域将由单个线程执行。