インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス

parallel/noparallel

ループ直後の自動並列化を行う依存性を解決するか (parallel)、ループ直後の自動並列化を抑止します (noparallel)。

構文

#pragma parallel [clause[ [,]clause]...]

#pragma noparallel

引数

clause

次のいずれかです。

always [assert]

ループの並列化によりパフォーマンスが向上するかどうかを判断するコンパイラー・ヒューリスティックを無効にします。 コンパイラーが並列化可能であると判断したループでこの節を使用すると、並列化によりパフォーマンスが向上しない場合でもループを並列化するようにコンパイラーに指示します。

assert を指定すると、コンパイラーはエラーレベルのアサーション・テストを生成し、コンパイラーの効率ヒューリスティックによってループのベクトル化が不可能であることが示す旨のメッセージを表示します。

firstprivate( var [ :expr ] ... )text

private 節で指定される機能のスーパーセットを指定します。 firstprivate 節でリストする変数には、private 節のセマンティクスが適用されます。 さらに、その初期値は、並列ループに入る前に、すべてのプライベート・インスタンスにブロードキャストされます。

lastprivate(var [ :expr ] ... )

private 節で指定される機能のスーパーセットを指定します。 lastprivate 節でリストする変数には、private 節のセマンティクスが適用されます。 さらに、並列領域の終了時の各変数の値は、最後のループ反復の結果になります。

num_threads(n)

n スレッドでループを並列化します。n は整数です。

private( var [ :expr ] ...)

プライベート化するスカラー変数と配列変数 (var) を指定します。 配列またはポインター変数では、オプションの引数 (expr) を指定できます。この引数は、プライベート化する配列の要素数を示す int32 式または int64 式です。

private 節と同様に、firstprivate 節と lastprivate 節はプライベート化するスカラー変数と配列変数 (var) を指定します。 配列またはポインター変数では、オプションの引数 (expr) を指定できます。この引数は、プライベート化する配列の要素数を示す int32 式または int64 式です。

同じ var を同じループの private 節と lastprivate 節の両方に記述することはできません。

また、同じ var を同じループの private 節と firstprivate 節の両方に記述することもできません。

expr がない場合、var の規則は OpenMP* と同じです。 次に規則の一覧を示します。

  • var は別の変数の一部 (配列または構造体の要素) であってはなりません。

  • var は、mutable メンバーを持つクラス型の場合を除き、定数修飾型であってはなりません。

  • var は不完全な型または参照型であってはなりません。

  • var がクラス型 (またはその配列) の場合は、アクセス可能なあいまいでないデフォルト・コンストラクターが必要です。 また、varlastprivate 節内にある場合は、アクセス可能なあいまいでないコピー代入演算子も必要です。

expr が指定されている場合は、同じ規則が適用されますが、var は配列またはポインター変数でなければなりません。

  • var が配列の場合は、最初の expr 要素のみがプライベート化されます。 expr が指定されていない場合は、配列全体がプライベート化されます。

  • var がポインターの場合は、最初の expr 要素がプライベート化されます (要素サイズは、ポイント先の型によって指定されます)。 expr が指定されていない場合は、そのポインター変数のみがプライベート化されます。

  • expr が正の値でない場合、または配列サイズを超える場合、プログラムの動作は未定義です。

説明

parallel プラグマは、ループの直後にあることが想定され、正常な自動並列化を妨げる潜在的な依存性を無視するようにコンパイラーに指示します。 しかし、依存性が証明されると無視されません。

noparallel プラグマは、ループ直後の自動並列化を抑止します。

これらのプラグマは、自動並列化が [Q]parallel コンパイラー・オプションで有効にされている場合にのみ効果があります。 このオプションを使用すると、互換マイクロプロセッサーおよびインテル製マイクロプロセッサーの両方で並列化が有効になります。 実行ファイルは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーにおいてより優れたパフォーマンスが得られる可能性があります。 また、並列化は、archm[Q]x などの特定のオプションによる影響を受けます。

注意

このプラグマは注意して使用してください。ループに繰り返し間の依存関係がある場合、このプラグマでアノテーションすると、プログラムが正しく動作しなくなる可能性があります。

parallel プラグマは、アノテーション付きのループの並列化がパフォーマンスを向上させることが分かっている場合のみ使用してください。

parallel プラグマの使用例

void example(double *A, double *B, double *C, double *D) {
  int i;
  #pragma parallel
  for (i=0; i<10000; i++) {
    A[i] += B[i] + C[i];
    C[i] += A[i] + D[i];
  } 
}

関連情報