プログラムでデータの競合の検出を可能にするには、実行時にメモリーアクセスをモニターするコードをあらかじめ計測しておく必要があります。計測機構の組み込みは、アプリケーションのソースコードまたはアプリケーションバイナリで行えます。このチュートリアルでは、プログラムを計測する両方のメソッドの使用方法を示します。
ソースコードを計測するには、特別なコンパイラオプション -xinstrument=datarace を使ってアプリケーションをコンパイルする必要があります。このオプションは、データの競合の検出用に生成したコードを計測するようにコンパイラに指示します。
-xinstrument=datarace コンパイラオプションを、プログラムのコンパイルに使用する既存のオプションセットに追加します。
このチュートリアル用にソースコードを計測するには、次のコマンドを使用できます。
% 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.4: Discover および Uncover ユーザーズガイド に記載されています。
チュートリアルの例では、次のコマンドを入力してコードをコンパイルします。
% cc -xopenmp=noopt -g -o prime_omp prime_omp.c -lm
% cc -g -O2 -o prime_pthr prime_pthr.c -lm
続いて、discover を、作成した prime_omp および prime_pthr 最適化済みバイナリで実行します。
% discover -i datarace -o prime_omp_disc prime_omp
% discover -i datarace -o prime_pthr_disc prime_pthr
これらのコマンドは計測済みバイナリ、prime_omp_disc および prime_pthr_disc を作成するので、これらのバイナリを collect で使用して、スレッドアナライザで検証する実験を作成できます。