Sun Studio 12 Update 1: OpenMP API ユーザーズガイド

6.3 自動スコープ宣言に関する一般的な注意事項

暗黙のスコープを持たない変数を自動スコープ宣言するときに、コンパイラは、スカラーの場合は指定された順序で前述の S1 ~ S3 の規則に対して、および配列の場合は前述の A1 の規則に対して、変数の使われ方を比較検査します。規則に一致する場合、コンパイラはその規則に従って変数のスコープを決定します。規則に一致しない場合、コンパイラは次の規則を試します。コンパイラは、一致するものが見つからなかった場合は、その変数のスコープ判定を中止します。その変数のスコープは SHARED と宣言され、あたかも IF (.FALSE.) または if(0) 節が指定されているかのように結合並列領域が直列化されます。

自動スコープ宣言が失敗する理由は 2 つあります。1 つは、変数の使われ方が前述のどれにも一致しないため、もう 1 つは、ソースコードが複雑すぎて、コンパイラが十分な解析を行えないためです。こうした原因としてよくあるのは、たとえば、関数呼び出しや複雑な配列添え字、メモリー別名、ユーザー実装の同期などです。「6.5 現在の実装の既知の制限事項」を参照してください。

6.3.1 Fortran 95 の自動スコープ宣言規則

Fortran では、変数が __auto または default(__auto) 節を使用して自動スコープ宣言され、その変数に OpenMP 仕様に従って事前定義されたスコープがある場合、コンパイラはその事前定義されたスコープに従って変数のスコープを宣言します。

Fortran では、次の変数に事前定義されるスコープがあります。

6.3.2 C/C++ の自動スコープ宣言規則

C/C++ では、変数が __auto または default(__auto) 節を使用して自動スコープ宣言され、その変数に OpenMP 仕様に従って事前定義されたスコープがある場合、コンパイラはその事前定義されたスコープに従って変数のスコープを宣言します。

C/C++ では、次の変数に事前定義されるスコープがあります。

C および C++ の自動スコープ宣言が適用されるのは、基本データ型の 整数、浮動小数点、ポインタのみです。ユーザーが構造変数またはクラス変数の自動スコープ宣言を指定する場合、コンパイラは変数を shared としてスコープ宣言し、それを包含する並列領域は 1 つのスレッドとして実行されます。