インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド
ループに関数呼び出しが含まれる場合、呼び出される関数についてのより詳しい情報がないと、コンパイラーはこのループを並列化できません。
ただし、ループの中で呼び出される関数が定数関数またはコンカレント・セーフな関数の場合、その呼び出しはループの並列化の妨げにはなりません。
次の例について考えてみます。
#define N 10000
double A[N], B[N];
int bar(int);
void foo(){
int i;
for (i=0;i<N;i++){
A[i] = B[i] * bar(i);
}
}
この例では、呼び出されるルーチン bar についてのより詳しい情報がなければコンパイラーはループを並列化しません。
安全であることが分かっている場合は、次のようにプログラムコードを変更します。
#define N 10000
double A[N], B[N];
__declspec(const) int bar(int);
void foo(){
int i;
for (i=0;i<N;i++){
A[i] = B[i] * bar(i);
}
}
また、次の方法が安全であることが分かっている場合は、次のようにコードを変更することもできます。
#define N 10000
double A[N], B[N];
__declspec(concurrency_safe(profitable)) int bar(int);
void foo(){
int i;
for (i=0;i<N;i++){
A[i] = B[i] * bar(i);
}
}