在自动确定没有隐式作用域的变量的作用域时,编译器将根据上述规则按给定顺序 S1–S3(如果变量为标量)以及上述规则 A1(如果变量为数组)检查变量的使用情况。如果符合某个规则,编译器将按照匹配的规则确定变量的作用域。如果不符合某个规则,编译器将尝试使用下一个规则。如果编译器找不到匹配项,它将放弃确定该变量的作用域的尝试,并将该变量的作用域确定为 SHARED,然后像指定了 IF (.FALSE.) 或 if(0) 子句一样,将绑定并行区域序列化。
作用域的自动确定失败的原因有两个。一个原因是使用的变量不匹配任何规则。第二个原因是源代码对于编译器来说过于复杂,因而无法执行全面的分析。函数调用、复杂的数组下标、内存别名和用户实现的同步都是常见原因。(请参见5.5 当前实现的已知限制。)
对于 Fortran,如果由 __auto 或 default(__auto) 子句自动确定某个变量的作用域,并且该变量具有根据 OpenMP 规范预先确定的作用域,则编译器将根据该预先确定的作用域来确定变量的作用域。
对于 Fortran,下列变量具有预先确定的作用域:
threadprivate 指令中出现的变量和通用块为 threadprivate。
DO 或 PARALLEL DO 构造的 DO 循环中的循环迭代变量在该构造中为 private。
在并行构造的顺序循环中作为循环迭代变量使用的变量在该并行构造中为 private。
隐含的 DO 或 FORALL 索引为 private。
Cray pointee 会继承其 Cray Fortran 指针关联的存储的共享属性。
对于 C/C++,如果由 __auto 或 default(__auto) 子句自动确定某个变量的作用域,并且该变量具有根据 OpenMP 规范预先确定的作用域,则编译器将根据该预先确定的作用域来确定变量的作用域。
对于 C/C++,下列变量具有预先确定的作用域:
threadprivate 指令中出现的变量为 threadprivate。
在构造内部的作用域中声明的具有自动存储持续时间的变量为 private。
具有堆分配存储的变量为 shared。
静态数据成员为 shared。
for 或 parallel for 构造的 for 循环中的循环迭代变量在该构造中为 private。
具有 const 限定的类型,且不具有 mutable 成员的变量为 shared。
C 和 C++ 中的自动确定作用域仅适用于基本数据类型:整型、浮点型和指针。如果用户指定了要自动确定作用域的结构变量或类变量,则编译器会将该变量的作用域确定为 shared,并且封闭并行区域将由单个线程执行。