prime_pthr.c でのデータの競合を調べるには、「2.2.2 データの競合の検出実験を作成する」で作成したいずれかの実験を使用できます。
er_print で prime_pthr_instr.er 実験のデータの競合情報を表示するには、次のコマンドを入力します。
% er_print prime_pthr_inst.er |
(er_print) プロンプトで races と入力すると、次のような出力が表示されます。
(er_print) races Total Races: 4 Experiment: prime_pthr_inst.er Race #1, Vaddr: (Multiple Addresses) Access 1: Write, is_prime + 0x00000270, line 27 in "prime_pthr.c" Access 2: Write, is_prime + 0x00000270, line 27 in "prime_pthr.c" Total Callstack Traces: 2 Race #2, Vaddr: 0xffbfe714 Access 1: Write, main + 0x0000025C, line 60 in "prime_pthr.c" Access 2: Read, work + 0x00000070, line 40 in "prime_pthr.c" Total Callstack Traces: 1 Race #3, Vaddr: (Multiple Addresses) Access 1: Write, work + 0x00000150, line 44 in "prime_pthr.c" Access 2: Write, work + 0x00000150, line 44 in "prime_pthr.c" Total Callstack Traces: 2 Race #4, Vaddr: 0x21a90 Access 1: Write, work + 0x00000198, line 45 in "prime_pthr.c" Access 2: Write, work + 0x00000198, line 45 in "prime_pthr.c" Total Callstack Traces: 2 (er_print) |
この特定のプログラム実行中に、4 つのデータの競合が生じました。
スレッドアナライザで prime_pthr_inst.er 実験結果を開くには、次のコマンドを入力します。
% tha prime_pthr_inst.er |
次のスクリーンショットには、スレッドアナライザに表示された、prime_pthr.c で検出された競合が示されています。er_print で示された競合と同じであることに注意してください。
prime_pthr.c には、次の 4 つのデータの競合が示されています。
Race #1 は、行 27 での関数 is_prime における pflag[ ] 配列への書き込みと、同じ行での pflag[ ] への別の書き込みとのデータの競合です。
Race #2 は、行 60 での main() における i というメモリー位置への書き込みと、行 40 での (work() における *arg という) 同じメモリー位からの読み取りとのデータの競合です。
Race #3 は、行 44 での primes[total]
への書き込みと、同じ行での primes[total]
への別の書き込みとのデータの競合です。
Race #4 は、行 45 での total への書き込みと、同じ行での total への別の書き込みとのデータの競合です。
Race #2 を選択した後に「デュアルソース (Dual Source)」タブをクリックした場合、次のスクリーンショットのように、2 つのソース位置が表示されます。
Race #2 の最初のアクセスは行 60 で行われ、上部のパネルに表示されます。2 番目のアクセスは行 40 で行われ、下部のパネルに表示されます。ソースコードの左側に「競合アクセス (Race Accesses)」メトリックが強調表示されます。このメトリックは、その行でデータの競合アクセスが報告された回数を示します。