この記事は、インテル® デベロッパー・ゾーンに公開されている「Tutorial: Analyzing Threading Errors With Intel® Inspector and a C++ Sample Application for Linux*」の日本語参考訳です。
この記事の PDF 版はこちらからご利用になれます。
目次
スレッドエラー解析の使用例
ナビゲーションのクイックスタート
スタンドアロン GUI: アプリケーションのビルドと新規プロジェクトの作成
解析の設定
解析の実行
問題の選択
結果データの解釈
問題の解決
リビルドと解析の再実行
まとめ
法務上の注意書き
インテル® Inspector は、Windows* および Linux* でシリアル・アプリケーションおよびマルチスレッド・アプリケーションを開発するユーザー向けの、メモリーとスレッドのエラーを動的にチェックするツールです。
このチュートリアルでは、C++ サンプル・アプリケーションを使用して、Linux* プラットフォームでインテル® Inspector を利用してスレッドエラーを解析する方法を示します。
インテル® Inspector は、スタンドアロン製品として、または次の製品のコンポーネントとして利用できます。
- インテル® System Studio Professional Edition
- インテル® System Studio Ultimate Edition
- インテル® Parallel Studio XE Professional Edition
- インテル® Parallel Studio XE Cluster Edition
- ベータ版インテル® oneAPI HPC ツールキット
- ベータ版インテル® oneAPI IoT ツールキット
チュートリアルの概要 | このチュートリアルでは、最終的に独自のアプリケーションに適用可能なエンドツーエンドのワークフローを示します。
このチュートリアルは、バージョン 2017 以降向けに作成されています。バージョン 2018 以降では、スクリーンショットの背景色が異なります。 |
所要時間 | 10 – 15 分 |
目的 | このチュートリアルでは、以下のトピックについて説明します。
|
関連情報 | このチュートリアルの概念と手順は、プログラミング言語に関係なく適用されますが、別のプログラミング言語のサンプル・アプリケーションを使用したチュートリアルも用意されています。
これらのサイトでは、ほかのインテル® 製品のチュートリアルも提供されています。 さらに、以下のサイトから追加のリソースを利用できます。 |
スレッドエラー解析の使用例
強力で柔軟性に優れたインテル® Inspector を活用する方法はたくさんあります。並列プログラムのスレッドエラーを見つけて修正する次のワークフローは、生産性を迅速かつ最大限に高める 1 つの方法です。
このチュートリアルは、次の方法でこのワークフローを実装します。
ステップ 1: サンプルの展開と解析用の設定 |
スレッドエラーを調査するためアプリケーションをビルドして、インテル® Inspector 環境を設定して、新しいインテル® Inspector プロジェクトを作成します。 |
ステップ 2: 結果の収集 |
|
ステップ 3: 結果の調査 |
|
ステップ 4: 作業の確認 |
アプリケーションをリビルドして、スレッドエラー解析を再度実行します。 |
ナビゲーションのクイックスタート
- インテル® Inspector 環境を設定する
- インテル® Inspector スタンドアロン GUI を開く
- インテル® Inspector スタンドアロン GUI を使用する
- インテル® Inspector の結果タブを使用する
インテル® Inspector 環境を設定する
次のいずれかの方法でインテル® Inspector 環境を設定します。
- 次のいずれかの
source
コマンドを実行します。- csh/tcsh ユーザーの場合:
source <inspector-install-dir>/inspxe-vars.csh
- bash ユーザーの場合:
source <inspector-install-dir>/inspxe-vars.sh
注
インテル® oneAPI HPC ツールキットまたはインテル® oneAPI IoT ツールキットに含まれるインテル® Inspector では、このスクリプトの名前は inspxe-vars ではなく env\vars です。デフォルトのインストール先
<inspector-install-dir>
は、次のディレクトリー以下にあります。- root ユーザーの場合:
/opt/intel/
- 非 root ユーザーの場合:
$HOME/intel/
- csh/tcsh ユーザーの場合:
<inspector-install-dir>/bin32
または<inspector-install-dir>/bin64
をパスに追加します。
場合によっては、<studio-install-dir>/psxevars.csh
または <studio-install-dir>/psxevars.sh
コマンドを実行することもできます。デフォルトのインストール先 <studio-install-dir>
は、次のディレクトリー以下にあります。
- root ユーザーの場合:
/opt/intel/
- 非 root ユーザーの場合:
$HOME/intel/
インテル® Inspector スタンドアロン GUI を開く
inspxe-gui
コマンドを実行します。
インテル® Inspector スタンドアロン GUI を使用する
インテル® Inspector の結果タブを使用する
スタンドアロン GUI: アプリケーションのビルドと新規プロジェクトの作成
インテル® Inspector でスレッドエラーを調査可能なアプリケーションを作成します。
- ソフトウェア・ツールを取得する
- 最適なコンパイラー/リンカー設定を理解する
- アプリケーションをビルドする
- アプリケーションがインテル® Inspector の外部で実行されることを確認する
- インテル® Inspector 環境を設定する
- インテル® Inspector スタンドアロン GUI を開く
- 新しいプロジェクトを作成する
ソフトウェア・ツールを取得する
tachyon_insp_xe
サンプル・アプリケーションを使用してチュートリアルの手順を実施するには、次のツールが必要です。
- インテル® Inspector のインストール・パッケージとライセンス
.tgz
ファイルの展開ユーティリティー- サポートされるコンパイラー (詳細はリリースノートを参照)
- 編集者
インテル® Inspector をまだインストールしていない場合は、https://www.isus.jp/intel-inspector-xe/ から評価版をダウンロードします。
インテル® Inspector サンプル・アプリケーションをインストールして設定する
tachyon_inxp_xe.tgz
ファイルを<install-dir>/samples/<locale>/C++/
ディレクトリーから書き込み可能なディレクトリーへコピーするか、システムで共有します。デフォルトの<install-dir>
は/opt/intel
です。.tgz
ファイルからサンプルを展開して、tachyon_insp_xe
ディレクトリーを作成します。- EDITOR または VISUAL 環境変数が使用するテキストエディターに設定されていることを確認してください。
注
- サンプルは非決定的です。このチュートリアルで示すスクリーンショットは、実際の画面とは異なる場合があります。
- サンプルは、インテル® Inspector の機能を説明することを目的としており、コード作成のベスト・プラクティスを示すものではありません。
最適なコンパイラー/リンカー設定を理解する
インテル® Inspector は、デバッグモードとリリースモードの C++ および Fortran バイナリーでメモリーとスレッドのエラーを解析できますが、次の設定を使用してデバッグモードでコンパイル/リンクされたアプリケーションにおいて最も正確で完全な解析結果を生成します。
コンパイラー/リンカーのプロパティー | 適切な C/C++ 設定 | 不適切な設定による影響 |
---|---|---|
デバッグ情報 | 有効 (-g ) |
ファイル/行情報の欠落 |
最適化 | 無効 (-O0 ) |
正しくないファイル/行情報 |
ダイナミック・ランタイム・ライブラリー | 選択 (インテル® コンパイラーの場合は -shared-intel 、GNU* コンパイラーの場合はデフォルトまたは -Bdynamic ) |
誤検出またはコード位置の欠落 |
基本ランタイム・エラー・チェック | 無効 (-fmudflap は使用しない) |
誤検出 |
コンパイラー/リンカーのプロパティー | 適切な Fortran 設定 | 不適切な設定による影響 |
デバッグ情報 | 有効 (-debug または -g ) |
ファイル/行情報の欠落 |
最適化 | 無効 (-O0 ) |
正しくないファイル/行情報 |
ダイナミック・ランタイム・ライブラリー | 選択 (-shared-intel ) |
誤検出またはコード位置の欠落 |
基本ランタイム・エラー・チェック | なし (-check:none ) |
誤検出 |
アプリケーションをビルドする
- ターミナルセッションで、ディレクトリーを
tachyon_insp_xe
に変更します。 make
を実行します。
アプリケーションがインテル® Inspector の外部で実行されることを確認する
- 同じターミナルセッションで、次のコマンドを使用してサンプル・アプリケーションを実行します。
./tachyon.find_and_fix_threading_errors
- アプリケーションの非決定的な出力は次のようになります。
イメージ内に色落ちしたドットがあります。原因はスレッドエラーです。
インテル® Inspector 環境を設定する
次のいずれかの方法でインテル® Inspector 環境を設定します。
- 次のいずれかの
source
コマンドを実行します。- csh/tcsh ユーザーの場合:
source <inspector-install-dir>/inspxe-vars.csh
- bash ユーザーの場合:
source <inspector-install-dir>/inspxe-vars.sh
注
インテル® oneAPI HPC ツールキットまたはインテル® oneAPI IoT ツールキットに含まれるインテル® Inspector では、このスクリプトの名前は inspxe-vars ではなく env\vars です。デフォルトのインストール先
<inspector-install-dir>
は、次のディレクトリー以下にあります。- root ユーザーの場合:
/opt/intel/
- 非 root ユーザーの場合:
$HOME/intel/
- csh/tcsh ユーザーの場合:
<inspector-install-dir>/bin32
または<inspector-install-dir>/bin64
をパスに追加します。
場合によっては、<studio-install-dir>/psxevars.csh
または <studio-install-dir>/psxevars.sh
コマンドを実行することもできます。デフォルトのインストール先 <inspector-install-dir>
は、次のディレクトリー以下にあります。
- root ユーザーの場合:
/opt/intel/
- 非 root ユーザーの場合:
$HOME/intel/
インテル® Inspector スタンドアロン GUI を開く
同じターミナルセッションで、inspxe-gui &
コマンドを使用してインテル® Inspector スタンドアロン GUI をバックグラウンドで実行します。
新しいプロジェクトを作成する
- [File] > [New] > [Project…] を選択して、次のようなダイアログボックスを表示します。
- [Project name] フィールドに
threading
と入力します。[Create project] ボタンをクリックして、~/intel/inspxe/projects/threading/
ディレクトリー (デフォルトの場所) にconfig.inspxeproj
ファイルを生成します。次のようなダイアログボックスが表示されます。 - [Application] フィールドの横にある [Browse…] ボタンをクリックして、
tachyon_insp_xe/tachyon.find_and_fix_threading_errors
アプリケーションを選択します。インテル® Inspector によって [Working directory] フィールドに値が自動入力されます。[OK] ボダンをクリックして [Welcome] ページに戻ります。開いたプロジェクトの名前がタイトルバーと [Project Navigator] ペインに表示されます(必要に応じて、[View] > [Project Navigator] を選択して [Project Navigator] を表示します)。
解析の設定
インテル® Inspector には、解析の範囲とコストの制御を支援するため、事前定義済みのさまざまなスレッド解析タイプが用意されています。範囲が最も狭い解析タイプは、システムの負荷、および解析の実行に必要な時間とリソースが最小になりますが、最も少ないエラーセットを検出し、最小限の情報のみ提供します。範囲が最も広い解析タイプは、システムの負荷、および解析の実行に必要な時間とリソースが最大になりますが、最も多くのエラーセットを検出し、最も詳細な情報を提供します。
スレッドエラー解析を設定します。
[Analysis Type] ウィンドウを理解する
次のような [Analysis Type] ウィンドウを表示します。
- [File] > [New] > [Analysis…] を選択します。
- 解析タイプ・ドロップダウン・リストから [Threading Error Analysis] を選択します。
- スライダーを使用して [Detect Deadlocks and Data Races] 解析タイプを選択します。
注
ウィンドウに 3 つのインタラクティブなデバッガー・ラジオボタンが表示される場合があります。
スレッドエラー解析タイプを選択する
次のステップに進む前に、設定内容が上記のスクリーンショットと一致していることを確認してください。インタラクティブなデバッガー・ラジオボタンが表示されている場合は、[Analyze without Debugger] ラジオボタンがオンになっていることを確認してください。
解析の実行
修正が必要なスレッドエラーを検出するには、[Analysis Type] ウィンドウの [Start] ボタンをクリックします。インテル® Inspector は、次の処理を実行します。
tachyon.find_and_fix_threading_errors
アプリケーションを実行します。- 対応が必要なスレッドエラーを識別します。
intel/inspxe/projects/threading/
以下のディレクトリーに結果を収集します。- 結果をファイナライズします。
解析中、インテル® Inspector は次のような [Collection Log] ウィンドウを表示します。
注
このチュートリアルでは、インテル® Inspector スタンドアロン GUI から解析を実行する方法を説明します。インテル® Inspector コマンドライン・インターフェイス (inspxe-cl
コマンド) を使用して解析を実行することもできます。
解析が完了すると、[Summary] ウィンドウが自動的に表示されます。
問題の選択
検出されたスレッドエラーの調査を開始します。
主要な用語を理解する
code location (コード位置): 「書き込み」コード位置など、インテル® Inspector が観測したソースコードの場所。以前は observation (観測位置) と呼ばれていました。
problem (問題): 初期化されていないメモリーアクセスなど、1 回または複数回検出された問題。問題が複数回検出された場合、コールスタックは同じですが、スレッドやタイムスタンプは異なります。問題とそれぞれの検出に関する情報を確認できます。
problem set (問題セット): アプリケーション実行中のオブジェクトの割り当て解除が早すぎることに起因する問題セットなど、解決策が共通している可能性がある、共通の問題タイプと共有コード位置を持つ問題のグループ。問題セットは、解析が完了した後にのみ表示されます。
その他の主要な用語については、https://software.intel.com/en-us/articles/intel-inspector-glossary を参照してください。
[Summary] ウィンドウ内の各種ペインを理解する
解析が完了すると、次のような [Summary] ウィンドウが自動的に表示されます。
問題を選択する
確認が終わったら、次の操作を行います。
find_and_fix_threading_errors.cpp
ソースファイルの [Data race] 問題セットの横にある アイコンをクリックして、問題セットに含まれるすべての問題を確認します。- 問題セット内の最初の [Data race] 問題のデータ行をダブルクリックして、[Sources] ウィンドウでエラーの原因に関する詳細を確認します。
結果データの解釈
検出されたスレッドエラーの原因を特定します。
[Sources] ウィンドウ内の各種タブを理解する
問題セット内の最初の [Data race] 問題のデータ行をダブルクリックすると、次のような [Sources] ウィンドウが表示され、エラーの原因に関する詳細な情報を確認できます。
問題の解釈と解決に関する詳細情報にアクセスする
- ソースタブまたは [Disassembly] タブ内の任意の場所を右クリックします。
- [Explain Problem] を選択して、[Data race] 問題タイプに関するインテル® Inspector のヘルプを表示します。
問題の解決
検出されたスレッドエラーを修正します。
問題を調査する
find_and_fix_threading_errors.cpp
サンプルファイルに埋め込まれているコメントから、データ競合の原因は、複数のスレッドが同時にグローバル変数 col にアクセスしているためだと分かります。この問題を修正する 1 つの方法は、グローバル変数をローカル変数に変更することです。
エディターにアクセスする
ソースタブでコードの 80 行目付近にスクロールして color col; 行をダブルクリックし、エディターで find_and_fix_threading_errors.cpp
ソースファイルを開きます。
ソースコードを変更する
- color col; をコメントアウトして、88 行目付近の //color col; のコメントを外し、変数 col を関数 render_one_pixel のローカル変数にします。
- 編集内容を保存します。
- 結果タブをクリックして [Sources] ウィンドウに戻ります。
注
[Sources] ウィンドウのデータは、解析時のソースコードであるため、変更内容は反映されません。 - [Summary] ボタンをクリックして [Summary] ウィンドウを再度表示します。
リビルドと解析の再実行
ソースコードの変更により [Data race] 問題が修正されたかどうか確認します。
アプリケーションをリビルドする
ターミナルセッションで、次の操作を行います。
- ディレクトリーを
tachyon_insp_xe/
に変更します。 - make を実行します。
解析を再度実行する
同じ解析タイプの別の解析を実行するには、インテル® Inspector スタンドアロン GUI のメニューから、[File] > [New] > [Threading Error Analysis / Detect Deadlocks and Data Races] を選択します。
アプリケーションの出力が適切に表示されるようになります。
解析 (収集とファイナライズの両方) が完了すると、[Summary] ウィンドウが自動的に表示されます。
次のことに気付くでしょう。
- 新しい結果タブ「r002ti2」が作成されます。
find_and_find_threading_errors.cpp
ソースファイルで [Data race] 問題が検出されなくなりました。
まとめ
このチュートリアルでは、最終的に独自のアプリケーションに適用可能なエンドツーエンドのワークフローを示しました。
ステップ | チュートリアルの内容 | 要点 |
---|---|---|
1. 設定 | 最適なコンパイラー/リンカー設定でアプリケーションをビルドして、インテル® Inspector の外部で実行されることを確認し、インテル® Inspector 環境を設定して、解析結果を保持するプロジェクトを作成します。 | 次のオプションでデバッグモードでコンパイル/リンクされたアプリケーションは、最も正確で完全な結果を生成します: -g 、-O0 、-shared-intel (インテル® コンパイラー)、およびデフォルトまたは -Bdynamic (GNU* コンパイラー) を指定し、-fmudflap を指定しない。 |
2. 結果の収集 | 解析タイプを選択して解析を実行します。解析中、インテル® Inspector は次の処理を行います。
|
|
3. 結果の調査 | 検出された問題を調査し、結果データを解釈して、インテル® Inspector からエディターに直接アクセスしてソースコードを変更します。 |
|
4. 作業の確認 | アプリケーションをリビルド/再リンクして、再度調査します。 |
次のステップ: 解析用に独自のアプリケーションを準備して、インテル® Inspector でエラーを見つけて修正します。
法務上の注意書き
本資料は、明示されているか否かにかかわらず、また禁反言によるとよらずにかかわらず、いかなる知的財産権のライセンスも許諾するものではありません。
インテル® テクノロジーの機能と利点はシステム構成によって異なり、対応するハードウェアやソフトウェア、またはサービスの有効化が必要となる場合があります。実際の性能はシステム構成によって異なります。絶対的なセキュリティーを提供できる製品またはコンポーネントはありません。詳細については、各システムメーカーまたは販売店にお問い合わせいただくか、http://www.intel.co.jp/ を参照してください。
インテルは、明示されているか否かにかかわらず、いかなる保証もいたしません。ここにいう保証には、商品適格性、特定目的への適合性、および非侵害性の黙示の保証、ならびに履行の過程、取引の過程、または取引での使用から生じるあらゆる保証を含みますが、これらに限定されるわけではありません。
本資料には、開発中の製品、サービスおよびプロセスについての情報が含まれています。本資料に含まれる情報は予告なく変更されることがあります。最新の予測、スケジュール、仕様、ロードマップについては、インテルの担当者までお問い合わせください。
本資料で説明されている製品およびサービスには、設計上の不具合が含まれている可能性があり、公表されている仕様とは異なる動作をする場合があります。現在確認済みのエラッタについては、インテルまでお問い合わせください。
Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation またはその子会社の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。
© Intel Corporation.
本ソフトウェアおよび関連ドキュメントは、インテルが著作権を有する著作物であり、その使用には付随する明示的なライセンス (「ライセンス」) が適用されます。ライセンスで特に明記されていない限り、インテルから書面による許可を得た場合を除き、本ソフトウェアまたは関連ドキュメントを使用、改変、複製、公表、配布、公開することはできません。
本ソフトウェアおよび関連ドキュメントは現状のまま提供され、ライセンスに明記されているものを除き、明示されているか否かにかかわらず、いかなる保証もいたしません。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。