Sun Studio 12: スレッドアナライザユーザーズガイド

付録 B スレッドアナライザについてよく受ける質問

この付録では、スレッドアナライザについてよく受ける質問とその回答をまとめています。Sun Developer Network に、この FAQ の最新版があります。

B.1 FAQ

質問:

行番号情報に誤りがあります。どうしてでしょうか。

回答:

最適化を無効にするか、最適化レベルを -x03 以下にしてみてください。コンパイラの最適化による変換で行番号情報が不正になり、実験結果がわかりにくくなることがあります。

質問:

collect コマンドが主張するパッチを本当にインストールする必要があるのでしょうか。

回答:

はい。実験システムに必須パッチがすべてインストールされていることを確認してください。必須パッチが欠けていると、実験結果が正しくないことがあります。

質問:

アーカイブ版 malloc() ライブラリとコードをリンクさせて問題ないでしょうか。

回答:

いいえ、問題があります。スレッドアナライザは malloc() ルーチンに割り込むため、アーカイブ版の malloc() ライブラリとリンクさせると誤検出データ競合が生じる可能性があります。

質問:

スレッドアナライザは OpenMP アプリケーション内のデータ競合を検出できるでしょうか。POSIX あるいは Solaris スレッドアプリケーションについてはどうでしょうか。

回答:

スレッドアナライザは、POSIX スレッド API や Solaris OS(R) スレッド API、OpenMP 指令、Sun 並列指令、Cray(R) 並列指令、あるいはそれらの組み合わせを使用して記述されたコードで発生するデータ競合を検出できます。

質問:

スレッドアナライザは異なるプロセス間のデータ競合を検出できるでしょうか。

回答:

まだ、できません。現在は、1 つのプロセスから生成された異なるプロセス間のデータ競合のみ検出できます。

質問:

スレッドアナライザはあらゆるデータ競合を検出できるでしょうか。

回答:

いいえ、できません。スレッドアナライザは実行時のデータ競合を検出します。アプリケーションの正確な実行時動作は、入力データの組み合わせによって異なります。入力データの組み合わせによっては、データ競合にならないことがあります。スレッドアナライザは、オペレーティングシステムによるスケジューリングの影響を最小限に抑えるため、高いレベルでスレッド間の並行性をモデリングします。しかしながら、それでもメモリー割り当てやストレージの再利用はオペレーティングシステムによるスケジューリングの影響を受け、データ競合が発生する可能性が変わることがあります。

できる限りデータ競合が検出されるようにするには、スレッド数や入力データの組み合わせを変えてスレッドアナライザを使用したり、1 つのデータ組み合わせで実験を繰り返したりします。

質問:

実行のたびにデータ競合の結果が異なります。どうしてでしょうか。

回答:

実行間のタイミングの違いが原因です。スレッドがメモリーにアクセスする順序が実行ごとに異なるため、異なるデータ競合結果が報告されます。

質問:

スレッドアナライザによって、アプリケーションに存在しないデータ競合が 報告されます。どうしてでしょうか。データ競合を解消するには、どうすればよいでしょうか。

回答:

いくつかのケースで、プログラム内に実際には発生しないデータ競合をスレッドアナライザが報告することがあります。そうしたデータ競合を誤検出 (false positive) と呼んでおり、通常、ユーザーが実装した同期化機構が使用されているか、スレッド間でメモリーが再利用されている場合に発生します。たとえばコードにスピンロックを実装している手動コーディングのアセンブリが含まれている場合、スレッドアナライザはその同期化ポイントを認識しません。誤検出について詳細に説明したチュートリアル、および API を利用した誤検出を取り除く方法を参照してください。

質問:

librdthooks.so とは何で、どのような働きをするのでしょうか。

回答:

librdthooks.so は、データ競合検出計測機構の呼び出しとユーザー API 呼び出しのエントリポイントを満たすライブラリです。-xinstrument=datarace を付けてプログラムをコンパイル、リンクすると、自動的にリンクされます。詳細は、librdthooks(3) のマニュアルページを参照してください。

質問:

実行可能ファイルまたはライブラリに計測機構が組み込まれているかどうか、どのようにしてわかるでしょうか。

回答:

nm を使用してください。詳細は、nm(1) のマニュアルページを参照してください。 __rdt_src_read または __rdt_src_write という未定義の大域シンボルがある場合、その実行可能ファイルまたはライブラリには計測機構が組み込まれています。

質問:

アナライザを使用してデータ競合の実験を見ることはできますか。

回答:

はい。アナライザは従来からあるすべてのパフォーマンス解析タブに加えて、「競合」、「競合ソース」、および「競合の詳細」という新しいタブを表示します。スレッドアナライザは、より特化されたもので、従来からあるアナライザのタブを表示しません。

質問:

C/C++ または F90 でコンパイラオプションの -xinstrument=datarace を使用すると、-xinstrument=datarace オプションが不正とのエラーメッセージが出力されます。どうしてでしょうか。

回答:

スレッドアナライザをサポートしていない古いバージョンの Sun Studio を使用しているためです。次のように入力して、使用している Sun Studio のバージョンを確認してください。cc -Version。2006 年 6 月より新しいバージョンを使用してください。

質問:

er_print ユーティリティーを使用すると、races コマンドが無効であるとのエラーメッセージが出力されます。どうしてでしょうか。

回答:

スレッドアナライザをサポートしていない古いバージョンの Sun Studio を使用しているためです。次のように入力して、使用している Sun Studio のバージョンを確認してください。er_print -V。2006 年 6 月より新しいバージョンを使用してください。

質問:

collect -r on を実行すると、-r が認識されないとのエラーメッセージが出力されます。どうしてでしょうか。

回答:

スレッドアナライザをサポートしていない古いバージョンの Sun Studio を使用しているためです。collect -V を入力して、使用している Sun Studio のバージョンを確認してください。2006 年 6 月より新しいバージョンを使用してください。

質問:

スレッドアナライザのバグを報告したり、ほかの人と体験を共有したりするには、どうすればよいでしょうか。

回答:

スレッドアナライザの技術者やユーザーとフィードバックを共有するための最良のリソースは、Sun Studio Tools フォーラムです。このフォーラムに参加して投稿を読んだり、投稿したりしてください。質問事項についてすでに回答が寄せられていることがあります。