parallel プラグマは、コンパイラーによる依存性の解決に役立ちます。そのため、FOR ループの直後の自動並列化を促進します。noparallel プラグマは、FOR ループ直後の自動並列化を抑止します。
#pragma parallel #pragma parallel {always} #pragma noparallel |
always |
ループの並列化がパフォーマンスを向上させる可能性を推定するコンパイラー・ヒューリスティックを無効にします。 このキーワードを使用すると、コンパイラーにより、並列化がパフォーマンスを向上しないと推定された場合でも、ループが並列化されます。 |
parallel プラグマは、ループの直後にあることが想定され、正常な自動並列化を妨げる潜在的な依存を無視するようにコンパイラーに指示します。しかし、依存が証明されると無視されません。
#pragma parallel always を使用すると、ループの並列化がパフォーマンスを向上させる可能性を推定するコンパイラー・ヒューリスティックを無効にします。これにより、コンパイラーにより、並列化がパフォーマンスを向上しないと推定された場合でも、ループが並列化されます。
#pragma noparallel は、DO ループの直後の自動並列化を抑止します。
これらのプラグマは、自動並列化が /Qparallel スイッチ (Windows* オペレーティング・システム) または -parallel (Linux* または Mac OS* X オペレーティング・システム) で有効にされている場合にのみ効果があります。
#pragma parallel always は注意して使用してください。コンパイラーのヒューリスティックの変更は、並列化によりパフォーマンスが向上することが確実である場合にのみ行います。
次の例は、#pragma parallel の使用方法を示します。
void add(int k, float *a, float *b)
{
#pragma parallel
for (int i = 0; i < 10000; i++)
a[i] = a[i+k] + b[i];
}