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