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

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

スレッドアナライザは、Oracle Solaris Studio パフォーマンスアナライザが使用するものと同じ「収集-分析」モデルに従います。

    スレッドアナライザを使用するには、次の 3 つの手順を行います。

  1. 「2.2.1 コードを計測する」

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

  3. 「2.2.3 データの競合の検出実験を検証する」

2.2.1 コードを計測する

プログラムでデータの競合の検出を可能にするには、実行時にメモリーアクセスを監視するコードをあらかじめ計測しておく必要があります。この計測は、アプリケーションソースコードに行うことも、特定の Oracle コンパイラ最適化フラグでコンパイルされているアプリケーションバイナリに行うこともできます。このチュートリアルでは、プログラムを計測する両方のメソッドの使用方法を示します。

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

ソースコードを計測するには、特別なコンパイラオプション -xinstrument=datarace を使ってアプリケーションをコンパイルする必要があります。このオプションは、データの競合の検出用に生成したコードを計測するようにコンパイラに指示します。

-xinstrument=datarace コンパイラオプションを、プログラムのコンパイルに使用する既存のオプションセットに追加します。


注 –

-xinstrument=datarace を使ってプログラムをコンパイルするときには、必ず -g オプションも指定してください。アナライザの全機能を有効にするための追加情報が生成されます。データの競合の検出用にプログラムをコンパイルするときには、高度な最適化を指定しないでください。-xopenmp=noopt を使って OpenMP プログラムをコンパイルしてください。高度な最適化を使用した場合、行番号や呼び出しスタックなど、報告された情報が間違っていることがあります。


このチュートリアル用にソースコードを計測するには、次のコマンドを使用できます。


% cc -xinstrument=datarace -g -xopenmp=noopt -o prime_omp_inst prime_omp.c -lm

% cc -xinstrument=datarace -g -o prime_pthr_inst prime_pthr.c -lm

例では、バイナリが計測済みバイナリであることがわかるように、出力ファイルの末尾に _inst と指定されていることに注意してください。これは必須ではありません。

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

ソースコードの代わりにプログラムのバイナリコードを計測するには、discover ツールを使用する必要があります。このツールは、Oracle Solaris Studio に含まれ、discover(1) のマニュアルページと『Oracle Solaris Studio 12.2 Discover および Uncover ユーザーズガイド』で説明されています。

バイナリ計測の要件については、「バイナリレベルの計測」を参照してください。

チュートリアルの例では、次のコマンドを入力して、最適化レベル 3 でコードをコンパイルし、discover で使用できるバイナリを作成します。


% cc -xopenmp=noopt -g -o prime_omp_opt prime_omp.c -lm

% cc -g -O3 -o prime_pthr_opt prime_pthr.c -lm

続いて、discover を、作成した prime_omp_opt および prime_pthr_opt 最適化済みバイナリで実行します。


% discover -i datarace -o prime_omp_disc prime_omp_opt

% discover -i datarace -o prime_pthr_disc prime_pthr_opt

これらのコマンドは計測済みバイナリ、prime_omp_disc および prime_pthr_disc を作成します。これらのバイナリを collect で使用して、スレッドアナライザで検証する実験を作成できます。

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

-r race フラグを付けて collect コマンドを使用してプログラムを実行し、プロセスの実行中にデータの競合の検出実験を作成します。OpenMP プログラムの場合、使用されるスレッド数が 1 より大きいことを確認してください。チュートリアルの例では 4 つのスレッドが使用されます。

ソースコードを計測して作成したバイナリから実験を作成するには、次のスレッドを使用します。


% collect -r race -o prime_omp_inst.er prime_omp_inst

% collect -r race -o prime_pthr_inst.er prime_pthr_inst

discover ツールを使用して作成したバイナリから実験を作成するには、次のスレッドを使用します。


% collect -r race -o prime_omp_disc.er prime_omp_disc

% collect -r race -o prime_pthr_disc.er prime_pthr_disc

データの競合を検出する可能性を高めるには、-r race フラグ付きで collect を使用して、複数のデータの競合の検出実験を作成することをお勧めします。実験ごとに異なるスレッド数と異なる入力データを使用してください。

たとえば prime_omp.c では、スレッド数は次の行で設定されます。


#define THREADS 4

この 4 を 1 より大きな他の整数 (たとえば 8) に変えると、スレッド数を変更できます。

prime_omp.c の次の行は、2 ~ 3000 の素数を検出するようにプログラムを制限します。


#define N 3000

N の値を変更して別の入力データを指定すると、プログラム作業量を増減できます。

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

スレッドアナライザ、パフォーマンスアナライザ、er_print ユーティリティで、データの競合の検出実験を検証できます。スレッドアナライザおよびパフォーマンスアナライザはどちらも GUI インタフェースを表示します。スレッドアナライザはデフォルトの簡略セットのタブを表示しますが、それ以外はパフォーマンスアナライザと同じです。

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

スレッドアナライザを開始するには、次のコマンドを入力します。


% tha

スレッドアナライザ GUI は、メニューバー、ツールバー、および各種表示用のタブを含む分割区画で構成されます。

左側の区画には、デフォルトで次の 3 つのタブが表示されます。

スレッドアナライザ画面の右側区画には、次の 2 つのタブが表示されます。

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

er_print ユーティリティは、コマンド行インタフェースを表示します。インタラクティブセッションで er_print ユーティリティを使用して、セッション中にサブコマンドを指定します。コマンド行オプションを使用して、インタラクティブでない方法でもサブコマンドを指定できます。

次のサブコマンドは、er_print ユーティリティで競合を調べるときに役立ちます。

詳細は、collect(1)、tha(1)、analyzer(1)、および er_print(1) のマニュアルページを参照してください。