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