OpenMP* 解析

コンパイラーは、OpenMP API 2.0 と 2.5 のいくつかの制限をチェックします。スタティックの検証機能が有効な場合、コンパイラーでは OpenMP API の制限に対して、次の項目を含む追加の確認を行います。

データ依存性の解析

スタティックの検証機能では、並列領域内部の !$OMP PARALLEL DO や !$OMP DO など、並列宣言子を持つループにあるオブジェクト間のデータの依存関係をチェックします。

そして、依存性の解析にコンパイラーのアルゴリズムを適用し、またデータ依存解析をグローバルなプログラム・コンテキストにまで拡張する別のアルゴリズムも適用します。

例 1:

1   #include <stdio.h>

2     int

3     main() {

4        int j;

5        float a[100], b[100];

6        b[0] = 1.0;

7        a[0] = 2.0 ;

8   #pragma omp parallel shared(a,b)

9   #pragma omp for

10      for (j=1;j<100;j++) {

11         a[j] = 3.6*b[j-1];

12         b[j] = a[j-1]/3;

13      }

14      for(j=0;j<100;j++)

15         printf("%f %f\n", a[j], b[j]);

16      printf("\n");

17      return 0;

18  }

スタティックの検証機能で次の警告が発行されます。

omp.c(11): warning #12251: flow data dependence from line 11 to line 12, due to "a" may lead to incorrect program execution in parallel mode

omp.c(12): warning #12251: flow data dependence from line 12 to line 11, due to "b" may lead to incorrect program execution in parallel mode