ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
Oracle Solaris Studio 12.3: スレッドアナライザユーザーズガイド Oracle Solaris Studio 12.3 Information Library (日本語) |
2.1.1 データの競合チュートリアルのソースファイルの入手
2.1.3.1 prime_omp.c および prime_pthr.c でのデータの競合の影響
2.2.3.1 スレッドアナライザを使用したデータの競合実験の表示
2.2.3.2 er_print を使用したデータの競合実験の表示
2.4.1 データの競合が誤検知であるかどうかをチェックする
この節では、er_print コマンド行とスレッドアナライザ GUI の両方を使用して、検出したデータの競合それぞれに関する次の情報を表示する方法について説明します。
データの競合の一意の ID。
データの競合に関連付けられた仮想アドレス、Vaddr。複数の仮想アドレスがある場合は、Multiple Addresses のラベルが括弧に囲まれて表示されます。
2 つの異なるスレッドによる仮想アドレス Vaddr へのメモリーアクセス。アクセスの種類 (読み取りまたは書き込み) のほか、関数、オフセット、およびアクセスが行われたソースコード内の行番号が表示されます。
データの競合に関連付けられた呼び出しスタックトレースの総数。各トレースは、2 つのデータの競合アクセスが行われた時点で、スレッド呼び出しスタックの組を参照します。GUI を使用している場合、個々の呼び出しスタックトレースを選択すると、2 つの呼び出しスタックが「競合の詳細」タブに表示されます。er_print ユーティリティーを使用している場合、rdetail コマンドによって 2 つの呼び出しスタックが表示されます。
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 で検出された競合が示されています。
図 2-1 prime_omp.c で検出されたデータの競合
prime_omp.c には、次の 2 つのデータの競合が示されています。
Race #1 は、行 26 での関数 is_prime における書き込みと、行 23 での同じ関数における読み取りとの競合を示しています。ソースコードを見ると、これらの行で、pflag[ ] 配列がアクセスされていることがわかります。スレッドアナライザで「デュアルソース」タブをクリックすると、両方の行番号でのソースコードとともに、コードの影響を受けた行での競合アクセス数を示すメトリックを簡単に確認できます。
Race #2 は、main 関数の行 50 への 2 つの書き込み間の競合を示しています。「デュアルソース」タブをクリックすると、行 50 の primes [ ] 配列の値にアクセスする複数回の試行があることがわかります。
Race #2 は、配列 primes[ ] の異なる要素で生じたデータの競合のグループを表します。これは、Multiple Addresses と指定された Vaddr で示されます。
スレッドアナライザの「デュアルソース」タブでは、データの競合に関連付けられた 2 つのソース位置を同時に確認できます。たとえば、「競合」タブで prime_pthr.c に Race #2 を選択し、続いて「デュアルソース」タブをクリックします。次のように表示されます。
図 2-2 prime_omp.c で検出されたデータの競合のソースコード
ヒント - 「デュアルソース」タブの左マージンに「競合アクセス」メトリックを表示するには、各ソースパネルのヘッダー上にマウスをドラッグする必要があります。
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 で示された競合と同じであることに注意してください。
図 2-3 prime_pthr.c で検出されたデータの競合
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 を選択した後に「デュアルソース」タブをクリックした場合、次のスクリーンショットのように、2 つのソース位置が表示されます。
図 2-4 データの競合のソースコード詳細
Race #2 の最初のアクセスは行 60 で行われ、上部のパネルに表示されます。2 番目のアクセスは行 40 で行われ、下部のパネルに表示されます。ソースコードの左側に「競合アクセス」メトリックが強調表示されます。このメトリックは、その行でデータの競合アクセスが報告された回数を示します。
スレッドアナライザの「競合」タブで一覧表示されたデータの競合ごとに、1 つまたは複数の呼び出しスタックトレースが関連付けられています。呼び出しスタックは、データの競合を招く、コード内の実行パスを表示します。「呼び出しスタックトレース」をクリックすると、右側パネルの「競合の詳細」タブに、データの競合を招く関数呼び出しが表示されます。
図 2-5 prime_omp.c の呼び出しスタックトレースを示した「競合」タブ