prime_omp.c でのデータの競合を調べるには、データの競合の検出実験を作成するで作成したいずれかの実験を使用できます。
er_print で prime_omp_instr.er 実験のデータの競合情報を表示するには、次のコマンドを入力します。
% er_print prime_omp_inst.er
(er_print) プロンプトで races と入力すると、次のような出力が表示されます。
(er_print) races Total Races: 3 Experiment: prime_omp_inst.er Race #1, Vaddr: 0x219c8 Access 1: Write, line 25 in "prime_omp.c", is_prime Access 2: Read, line 22 in "prime_omp.c", is_prime Total Callstack Traces: 1 Race #2, Vaddr: (Multiple Addresses) Access 1: Write, line 49 in "prime_omp.c", main Access 2: Write, line 49 in "prime_omp.c", main Total Callstack Traces: 1 Race #3, Vaddr: 0xffbff604 Access 1: Write, line 50 in "prime_omp.c", main Access 2: Write, line 50 in "prime_omp.c", main Total Callstack Traces: 1
この特定のプログラム実行中に、3 つのデータの競合が生じました。
スレッドアナライザで prime_omp_inst.er 実験結果を開くには、次のコマンドを入力します。
% tha prime_omp_inst.er
次のスクリーンショットには、スレッドアナライザに表示された、prime_omp.c で検出された競合が示されています。
図 2-1 prime_omp.c で検出されたデータの競合
prime_omp.c には、次の 3 つのデータの競合が示されています。
Race #1 は、行 25 での関数 is_prime における書き込みと、行 22 での同じ関数における読み取りとの競合を示しています。ソースコードを見ると、これらの行で、pflag[ ] 配列がアクセスされていることがわかります。スレッドアナライザで「デュアルソース」ビューをクリックすると、両方の行番号でのソースコードとともに、コードの影響を受けた行での競合アクセス数を示すメトリックを簡単に確認できます。
Race #2 は、main 関数の行 49 への 2 つの書き込み間の競合を示しています。「デュアルソース」ビューをクリックすると、行 49 の primes [ ] 配列の値にアクセスする複数回の試行があることがわかります。
Race #3 は、main 関数の行 50 への 2 つの書き込み間の競合を示しています。「デュアルソース」ビューをクリックすると、行 50 の primes [ ] 配列の値にアクセスする複数回の試行があることがわかります。
Race #3 は、配列 primes[ ] の異なる要素で生じたデータの競合のグループを表します。これは、Multiple Addresses と指定された Vaddr で示されます。
スレッドアナライザの「デュアルソース」ビューでは、データの競合に関連付けられた 2 つのソース位置を同時に確認できます。たとえば、「競合」ビューで prime_pthr.c の Race #3 を選択してから、「デュアルソース」ビューをクリックします。次のように表示されます。
図 2-2 prime_omp.c で検出されたデータの競合のソースコード