<< 8 >>
インテル® C/C++ コンパイラー OpenMP* 活用ガイド
デュアルコア・マルチコア対応アプリケーション開発A
3.3 OpenMP* の適用の阻害要因とその対策
OpenMP* によるマルチスレッド化の適用に際しては、いくつかの条件を満たしている必要があります。逆に、この
ような条件に適応できないケースでは、OpenMP* による並列化はできません。
ここでは、OpenMP* によるマルチスレッドの適用の対象となるのは、C/C++ と Fortran などでの「ループ」による反
復計算部分として説明します。
ループの反復回数が、ループの実行
を開始される時に明らかになっている必要があります。従って、while ルー
プなどの並列化は通常はできません。
ループの並列化に際して、十分な計算負荷がそのループにあることが必要となります。
ループ内の演算は、相互に独立である必要があります。言い換えれば、各反復計算の実行順序が計算の整合
性に影響を与えないことが必須です(この場合、計算の丸め誤差などでの計算順序の差異については、自動並
列化では考慮はなされません)。ループの各反復が他の反復計算の結果を参照したりする場合には並列化はでき
ません(依存関係)。
for (i=1;i<= n; i++){
a[インデックス計算式1] = ・・・・・
・・・・・= a[インデックス計算式2] ・・・・・・;
}
ここでは、インデックス計算式1の値は、各反復時に異なった値となることが必要です。また、インデックス計算
式1とインデックス計算式2の値が異なる場合には、参照関係に依存性が生じます。
配列の総和を計算するような場合には、実際には各反復計算の結果は相互依存します。しかし、ループ構造が
明確な場合などはコンパイラーがソースコードを変換し、この見かけの依存性を排除することも可能となります。
ループ内に外部関数の呼び出しがあるような場合には、外部関数の呼び出しによる依存関係を明確にして、関数
のデータのスコーピングを行う必要があります。