インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
ループ直後の自動並列化を行う依存性を解決するか (parallel)、ループ直後の自動並列化を抑止します (noparallel)。
#pragma parallel[clause[ [,]clause]...] |
#pragma noparallel |
clause |
次のいずれかです。
|
||||||||||
private 節と同様に、firstprivate 節と lastprivate 節はプライベート化するスカラー変数と配列変数 (var) を指定します。配列またはポインター変数では、オプションの引数 (expr) を指定できます。この引数は、プライベート化する配列の要素数を示す int32 式または int64 式です。 同じ var を同じループの private 節と lastprivate 節の両方に記述することはできません。 また、同じ var を同じループの private 節と firstprivate 節の両方に記述することもできません。 expr がない場合、var の規則は OpenMP* と同じです。次に規則の一覧を示します。
expr が指定されている場合は、同じ規則が適用されますが、var は配列またはポインター変数でなければなりません。
|
parallel プラグマは、ループの直後にあることが想定され、正常な自動並列化を妨げる潜在的な依存性を無視するようにコンパイラーに指示します。しかし、依存性が証明されると無視されません。
noparallel プラグマは、ループ直後の自動並列化を抑止します。
これらのプラグマは、自動並列化が [Q]parallel コンパイラー・オプションで有効にされている場合にのみ効果があります。このオプションを使用すると、互換マイクロプロセッサーおよびインテル製マイクロプロセッサーの両方で並列化が有効になります。実行ファイルは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーにおいてより優れたパフォーマンスが得られる可能性があります。また、並列化は、arch、m、[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]; } } |