自動スコープ宣言を有効にするには、最適化レベルを -xO3 かそれ以上に設定してから -xopenmp オプションでプログラムをコンパイルする必要があります。自動スコープ宣言は、プログラムが -xopenmp=noopt でコンパイルされている場合は有効になりません。
C および C++ の並列およびタスク構文の自動スコープ宣言では、基本的なデータ型、つまり整数型、浮動小数点型、およびポインタ型しか処理できません。
タスクの自動スコープ宣言では、配列は処理できません。
C および C++ でのタスクの自動スコープ宣言では、グローバル変数は処理できません。
タスクの自動スコープ宣言では、結合解除されたタスクは処理できません。
タスクの自動スコープ宣言では、ほかのタスクに字句的に包含されているタスクは処理できません。次に例を示します。
#pragma omp task /* task 1 */ { ... #pragma omp task /* task 2 */ { ... } ... }
この例では、コンパイラは、task 1 に字句的に入れ子になった task 2 の自動スコープ宣言は試行しません。コンパイラは task 2 で参照されているすべての変数を shared とスコープ宣言し、task 2 を if(0) (Fortran では if(.false.)) 節がタスクで指定されているかのように処理します。
解析では、OpenMP ディレクティブのみ認識、使用されます。OpenMP 実行時ルーチンの呼び出しは認識されません。たとえばプログラムが omp_set_lock() および omp_unset_lock() を使用してクリティカル領域を実装している場合、コンパイラはそのクリティカル領域の存在を検出できません。可能な場合は critical ディレクティブを使用してください。
データ競合解析では、barrier や master などの OpenMP 同期ディレクティブを使用して指定された同期のみが認識され、使用されます。ビジー待ちなどのユーザー実装の同期は認識されません。