OpenMP* 解析

コンパイラーは、OpenMP API のいくつかの制限をチェックします。 OpenMP 解析では、OpenMP API の誤った使用についてのチェックも行われます。

例 1: OpenMP 宣言子 の誤った使用

f1.c ファイルには、次の コードが含まれています。

1 #include <stdio.h>

2 #include <omp.h>

3

4 void fff(int ii) {

5 #pragma omp barrier

6 printf("Val = %d \n", ii);

7 }

8

9 int main(void) {

10 int i=3;

11 omp_set_num_threads(3);

12 #pragma omp parallel

13 #pragma omp master

14 fff(i);

15 return 0;

16 }

ソースコードの解析 で次のメッセージが発行されます。

f1.c(5): エラー #12200: BARRIER 宣言子は MASTER 宣言子のダイナミック・エクステントでは許可されていません (ファイル:f1.c 行:13)

例 2: 不正なデータ依存性

並列プログラムのデータ依存性を解析するには、診断レベル 3 を有効にします。

1 int main(void) {

2 int i,sum = 0;

3 int a[1000];

4

5 #pragma omp parallel for reduction(+:sum)

6 for (i=1; i<999; i++) {

7 a[i] = i;

8 sum = sum + a[i + 1];

9 }

10 }

ソースコードの解析 で次のメッセージが発行されます。

f1.c(8): 警告 #12247: (ファイル:f1.c 行:8) から (ファイル f1.c 行:7) までアンチデータ依存関係があります。"a" により、並列モードでプログラムが正しく実行されないことがあります。

例 3: 不正な同期化

f1.c ファイルには、次の コードが含まれています。

1 #include <stdio.h>

2 #include <omp.h>

3

4 int a[1000];

5 int sum = 0;

6

7 void moo() {

8 int i;

9

10 #pragma omp task

11 for (i=0; i<1000; i++) {

12 a[i] = i;

13 sum = sum + a[i];

14 }

15 }

16

17 void foo() {

18 printf("%d\n",sum);

19 }

20

21 int main(void) {

22 int i;

23

24 #pragma omp parallel shared(sum)

25 #pragma omp single

26 {

27 moo();

28 foo();

29 }

30 return 0;

31 }

ソースコードの解析 で次のメッセージが発行されます。

f1.c(18): エラー #12365: 変数 "sum" はファイル:f1.c、行:13 (TASK 領域 (ファイル:f1.c 行:10) で定義され、同期の前に使用されています。