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

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

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

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

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

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

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

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

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

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

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