インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド
指定されたループの最初でスカラー変数を無条件で初期化できるかどうか確認します。できる場合は、初期化を行うようにコードを変更するか (標準的なアドバイス)、parallel プラグマの private 節に変数をリストします (高度なアドバイス)。これにより、パラレライザーが各反復においてこれらの変数をプライベート化し、ループを並列化できるようになります。
次の例について考えてみます。
#define N 100000
double A[N], B[N];
void foo(int cond1, int cond2){
int i, t=7;
for (i=0; i<N; i++){
if (cond1) {
t = i+1;
}
if (cond2) {
t = i-1;
}
A[i] = t;
}
}
この例では、より詳しい情報がなければ変数 t をプライベート化できないため、コンパイラーはこのループを並列化しません。cond1 と cond2 のいずれか、または両方が true であることが分かっている場合、t を使用するすべての反復において t を使用する前に同じ反復で書き込みが行われることをパラレライザーに知らせることができます。この 1 つの方法として、各反復の最初で t に値を代入します。
安全であることが分かっている場合は、次のようにプログラムコードを変更します。
#define N 100000
double A[N], B[N];
void foo(int cond1, int cond2){
int i, t=7;
for (i=0; i<N; i++){
t=0;
if (cond1) {
t = i+1;
}
if (cond2) {
t = i-1;
}
A[i] = t;
}
}