Oracle Solaris Studio 12.2: OpenMP API ユーザーガイド

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

タスクの自動スコープ宣言規則と、自動スコープ宣言の結果は、今後のリリースで変更される可能性があります。また、暗黙的に決定されたスコープ宣言規則と自動スコープ宣言規則が適用される順序も、今後のリリースで変更される可能性があります。

プログラマは _auto(list-of-variables) 節または default(_auto) 節を使用し、明示的に自動スコープ宣言を要求します。default(_auto) または _auto(list-of-variables) 節を parallel 構文に対して指定しても、parallel 構文に字句的または動的に包含される task 構文にも同じ節が適用されることを意味するわけではありません。

事前定義された暗黙的スコープを持たない変数を自動スコープ宣言する場合、コンパイラは、変数の使用について、前述の規則に対して順番に確認します。規則に一致する場合、コンパイラはその規則に従って変数のスコープを決定します。一致する規則がない場合、または自動スコープ宣言が変数を処理できない場合 (ただし、後述のように、いくつかの制限事項はあります)、コンパイラは変数を SHARED とスコープ宣言し、parallel または task 構文を IF (.FALSE.) または if(0) 節が指定されているかのように結合並列領域が直列化されます。

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