Oracle Solaris Studio 12.2: スレッドアナライザユーザーズガイド

2.3 実験結果について

この節では、er_print コマンド行とスレッドアナライザ GUI の両方を使用して、検出したデータの競合それぞれに関する次の情報を表示する方法について説明します。

2.3.1 prime_omp.c でのデータの競合

prime_omp.c でのデータの競合を調べるには、「2.2.2 データの競合の検出実験を作成する」で作成したいずれかの実験を使用できます。

er_printprime_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 で検出された競合が示されています。

図 2–1 prime_omp.c で検出されたデータの競合

prime_omp.c の「競合 (Races)」タブを表示した「スレッドアナライザ (Thread Analyzer)」ウィンドウのスクリーンショット。

prime_omp.c には、次の 2 つのデータの競合が示されています。

スレッドアナライザの「デュアルソース (Dual Source)」タブでは、データの競合に関連付けられた 2 つのソース位置を同時に確認できます。たとえば、「競合 (Races)」タブで prime_pthr.cRace #2 を選択し、続いて「デュアルソース (Dual Source)」タブをクリックします。次のように表示されます。

図 2–2 prime_omp.c で検出されたデータの競合のソースコード

prime_omp.c でのデータの競合について「デュアルソース (Dual Sources)」タブを示した、「スレッドアナライザ (Thread Analyzer)」ウィンドウのスクリーンショット。


ヒント –

「デュアルソース (Dual Source)」タブの左マージンに「競合アクセス (Race Accesses)」メトリックを表示するには、各ソースパネルのヘッダー上にマウスをドラッグする必要があります。


2.3.2 prime_pthr.c でのデータの競合

prime_pthr.c でのデータの競合を調べるには、「2.2.2 データの競合の検出実験を作成する」で作成したいずれかの実験を使用できます。

er_printprime_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 で示された競合と同じであることに注意してください。

図 2–3 prime_pthr.c で検出されたデータの競合

prime_pthr.c の「競合 (Races)」タブを表示した「スレッドアナライザ (Thread Analyzer)」ウィンドウのスクリーンショット

prime_pthr.c には、次の 4 つのデータの競合が示されています。

Race #2 を選択した後に「デュアルソース (Dual Source)」タブをクリックした場合、次のスクリーンショットのように、2 つのソース位置が表示されます。

図 2–4 データの競合のソースコード詳細

「デュアルソース (Dual Source)」タブを示した「スレッドアナライザ (Thread Analyzer)」ウィンドウのスクリーンショット。

Race #2 の最初のアクセスは行 60 で行われ、上部のパネルに表示されます。2 番目のアクセスは行 40 で行われ、下部のパネルに表示されます。ソースコードの左側に「競合アクセス (Race Accesses)」メトリックが強調表示されます。このメトリックは、その行でデータの競合アクセスが報告された回数を示します。

2.3.3 データの競合の呼び出しスタックトレース

スレッドアナライザの「競合 (Race)」タブで一覧表示されたデータの競合ごとに、1 つまたは複数の呼び出しスタックトレースが関連付けられています。呼び出しスタックは、データの競合を招く、コード内の実行パスを表示します。「呼び出しスタックトレース (Call Stack Trace)」をクリックすると、右側パネルの「競合の詳細 (Race Details)」タブに、データの競合を招く関数呼び出しが表示されます。

図 2–5 prime_omp.c の呼び出しスタックトレースを示した「競合 (Races)」タブ

prime_omp.cでのデータの競合の呼び出しスタックトレースを示した「競合の詳細 (Race Details)」タブを表示した「スレッドアナライザ (Thread Analyzer)」ウィンドウのスクリーンショット