プログラムでデータの競合の検出を可能にするには、実行時にメモリーアクセスを監視するコードをあらかじめ計測しておく必要があります。この計測は、アプリケーションソースコードに行うことも、特定の Oracle コンパイラ最適化フラグでコンパイルされているアプリケーションバイナリに行うこともできます。このチュートリアルでは、プログラムを計測する両方のメソッドの使用方法を示します。
ソースコードを計測するには、特別なコンパイラオプション -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 と指定されていることに注意してください。これは必須ではありません。
ソースコードの代わりにプログラムのバイナリコードを計測するには、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 で使用して、スレッドアナライザで検証する実験を作成できます。