Sun Studio 12: スレッドアナライザユーザーズガイド

2.1.2.1 omp_prime.cpthr_prime.c 内のデータ競合

「2.1.1 omp_prime.c の全コード」 で記したように、コードに競合状態が含まれている場合、メモリーアクセスの順序は非決定的であり、実行のたびに演算結果は異なります。omp_prime.c のコードにはデータ競合があるため、実行のたびに不正な結果や矛盾する結果が出されます。次にその出力例を示します。

% cc -xopenmp=noopt omp_prime.c -lm
% a.out | sort -n
0
0
0
0
0
0
0
Number of prime numbers between 2 and 3000: 336
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
...
2971
2999

% a.out | sort -n
0
0
0
0
0
0
0
0
0
Number of prime numbers between 2 and 3000: 325
3
5
7
13
17
19
23
29
31
41
43
47
61
67
71
73
79
83
89
101
...
2971
2999

同様に、pthr_prime.c にもデータ競合があるため、プログラムの実行のたびに、次に示すような不正な結果や矛盾する結果が出されることがあります。

% cc pthr_prime.c -lm -mt                             .
% a.out | sort -n
Number of prime numbers between 2 and 3000: 304
751
757
761
769
773
787
797
809
811
821
823
827
829
839
853
857
859
863
877
881
...
2999
2999

% a.out | sort -n
Number of prime numbers between 2 and 3000: 314
751
757
761
769
773
787
797
809
811
821
823
827
839
853
859
877
881
883
907
911
...
2999
2999