インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

自動並列化の言語サポート

ここでは、コードの並列化に役立つ特定の C++ 言語機能について説明します。

関数を宣言でアノテーション付け

次のように、関数に宣言を付けると、より多くのループと直列型コードを並列化するようにコンパイラーに指示できます。

// (Windows*) __declspec(concurrency_safe(cost(cycles) | profitable))
- または - 
// (Linux*) __attribute__(concurrency_safe(cost(cycles) | profitable))
より多くのループと直列型コードを並列化するようにコンパイラーに指示します。

concurrency_safe 属性の使用は、アノテーション付けした関数の複数の呼び出し間、またはこの関数とプログラムの別の文 (同時に実行されていれば) の間で、影響を受けない副作用はないこと、不正な (または不適切に同期化された) メモリー・アクセス・インターフェイスはないことをコンパイラーに示します。

concurrency_safe 属性を付けた各関数について、副作用 (ある場合) を許容範囲 (または想定範囲) 内に抑え、メモリー・アクセス・インターフェイスを適切に同期化することは開発者の責任です。

cost 節は、アノテーション付けした関数の実行サイクルを指定して、その囲まれたループやブロックのコンパイル中にコンパイラーが並列化の有効性解析を実行できるようにします。profitable 節は、アノテーション付けした関数への呼び出しを含むループまたはブロックの並列化が有効であることを示します。

cycles の値は 2 バイトの符号なし整数 (unsigned short) で、最大値は 2^16-1 です。サイクルカウントが 2^16-1 を超える場合、profitable 節を使用してください。

次の例は、この宣言の使用方法を示します。

__declspec(concurrency_safe(cost(cycles) | profitable)) の使用例
#define N 10 
#define M 40 
#define NValue N
 
#if defined(COSTLOW)
 
// この関数は ~5 サイクル、"foo" を呼び出すループは並列化されない
__declspec(concurrency_safe(cost(5))) 
#elif defined(COSTHIGH)
 
// この関数は ~100 サイクル、"foo" を呼び出すループは並列化される
__declspec(concurrency_safe(cost(200))) 
#elif defined(PROFITABLE)
 
// この関数の並列実行は有効
// "foo" を呼び出すループは並列化すべき
__declspec(concurrency_safe(profitable)) 
#endif
 
__declspec(noinline) 
int foo(float A[], float B[]) {
   for (int i = 0; i < N; i++) {
   B[i] = A[i];
   }
   return N; 
}
 
int testp(float A[], float B[], float* In[], float* Out[]) {
   int i, j;
   for (i = 0; i < M; i++) {
     foo (A, B);
     for (j = 0; j < N; j++) {
       Out[i][j] = In[i][j] + (NValue*j);
     }
   }
   return N; 
}
 
[C:/temp] icl -c -DCOSTLOW -Qparallel -Qpar-report2 -Qansi-alias v.cpp 
C:\temp\v.cpp(28): (列 3) リマーク: ループは並列化されませんでした: 計算量が不足しています。
 
[C:/temp] icl -c -DCOSTHIGH -Qparallel -Qpar-report -Qansi-alias v.cpp 
C:\temp\v.cpp(28): (列 3) リマーク: ループが自動並列化されました。
 
[C:/temp] icl -c -DPROFITABLE -Qparallel -Qpar-report -Qansi-alias v.cpp 
C:\temp\v.cpp(28): (列 3) リマーク: ループが自動並列化されました。

関連情報