JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.3: スレッドアナライザユーザーズガイド     Oracle Solaris Studio 12.3 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  スレッドアナライザとその機能について

2.  データの競合チュートリアル

2.1 データの競合チュートリアルのソースファイル

2.1.1 データの競合チュートリアルのソースファイルの入手

2.1.2 prime_omp.c のソースコード

2.1.3 prime_pthr.c のソースコード

2.1.3.1 prime_omp.c および prime_pthr.c でのデータの競合の影響

2.2 スレッドアナライザを使用したデータの競合の検出方法

2.2.1 コードを計測する

2.2.1.1 ソースコードを計測する

2.2.1.2 バイナリコードを計測する

2.2.2 データの競合の検出実験を作成する

2.2.3 データの競合の検出実験を検証する

2.2.3.1 スレッドアナライザを使用したデータの競合実験の表示

2.2.3.2 er_print を使用したデータの競合実験の表示

2.3 実験結果について

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

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

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

2.4 データの競合の原因の診断

2.4.1 データの競合が誤検知であるかどうかをチェックする

2.4.2 データの競合が影響のないものであるかどうかを確認する

2.4.3 データの競合ではなくバグを修正する

2.4.3.1 prime_omp.c でのバグの修正

2.4.3.2 prime_pthr.c でのバグの修正

2.5 誤検知

2.5.1 ユーザー定義の同期

2.5.2 さまざまなスレッドでリサイクルされるメモリー

2.6 影響のないデータの競合

2.6.1 素数検索用のプログラム

2.6.2 配列値の型を検証するプログラム

2.6.3 二重検査されたロックを使用したプログラム

3.  デッドロックのチュートリアル

A.  スレッドアナライザで認識される API

B.  役に立つヒント

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 で検出されたデータの競合

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

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

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

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

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

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


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 で検出されたデータの競合

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

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

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

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

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

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

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

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

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

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