Oracle® Solaris Studio 12.4: OpenMP API ユーザーズガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

6.6 自動スコープ宣言を使用する際の制限事項

  • 自動スコープ宣言を有効にするには、最適化レベルを -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 2if(0) (Fortran では if(.false.)) 節がタスクで指定されているかのように処理します。

  • 解析では、OpenMP ディレクティブのみ認識、使用されます。OpenMP 実行時ルーチンの呼び出しは認識されません。たとえばプログラムが omp_set_lock() および omp_unset_lock() を使用してクリティカル領域を実装している場合、コンパイラはそのクリティカル領域の存在を検出できません。可能な場合は critical ディレクティブを使用してください。

  • データ競合解析では、barriermaster などの OpenMP 同期ディレクティブを使用して指定された同期のみが認識され、使用されます。ビジー待ちなどのユーザー実装の同期は認識されません。