コンパイラーは、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) で定義され、同期の前に使用されています。