この記事は、インテル® ソフトウェア・ネットワークに掲載されている「Using Intel® Inspector XE on Fortran Applications – Threading Analysis (http://software.intel.com/en-us/articles/using-intel-inspector-xe-on-fortran-applications-threading-analysis/)」の日本語参考訳です。
インテル® Inspector XE は、C/C++、C#、Fortran 言語で記述されたプログラムの解析をサポートします。この記事は、Fortran アプリケーションにおけるインテル® Inspector XE の使用方法を紹介するシリーズ (全 3 パート) の 2 つ目です。ここでは、Fortran によるサンプル・アプリケーションを使って、インテル® Inspector XE のスレッド解析について説明します。パート 1 ではメモリー解析について説明しました。パート 3 では Fortran でのスタティック・セキュリティー解析の使用方法を説明します。
デバッグ設定 (最適化を無効にし、デバッグ情報を含む) が完了し、コンパイルに成功したら、インテル® Inspector XE プロジェクトを作成します。Microsoft* Visual Studio* を使用している場合、インテル® Inspector XE は Visual Studio* プロジェクトを使用するため、このステップはスキップします。新しいプロジェクトを作成する際は、インテル® Inspector XE のプロジェクト・プロパティーで、起動するアプリケーションの場所、アプリケーションへの引数、作業ディレクトリーを設定します。この手順に関する詳細は、パート 1 を参照してください。
スレッド解析の実行は、完全かつ詳細な解析が行われるため、アプリケーションの実行時間のオーバーヘッドが著しく増加します。このオーバーヘッドを軽減するには、アプリケーションのワークロードを減らしてみてください。ほとんどのコードパスをできるだけ同じパスを通らずに実行される入力データや入力パラメーターを選択すると良いでしょう。
アプリケーションのスレッド解析を行うには、[New Analysis (新しい解析)] をクリックし、[Analysis Type (解析タイプ)] を選択して、[Start (開始)] をクリックします (以下のスクリーンショットを参照)。以下のスクリーンショットでは、[Detect Deadlocks and Data Races (デッドロックとデータ競合の検出)] 解析タイプが選択されています。インテル® Inspector XE には、[Detect Deadlocks (デッドロックの検出)] と [Locate Deadlocks and Data Races (デッドロックとデータ競合の特定)] という定義済みの解析タイプもあります。
それぞれの解析タイプには、オーバーヘッド、検出される問題、詳細レベルに関するトレードオフがあります。解析コストの制御に関する詳細は、http://software.intel.com/en-us/articles/intel-inspector-xe-2011-controlling-analysis-cost/ の記事を参照してください。[Analysis Type (解析タイプ)] ウィンドウの [Details (詳細)] に各解析タイプの詳細情報が表示されます。新しい解析タイプを作成し、設定することもできます。すべての解析タイプの詳細は、インテル® Inspector XE のヘルプに記述されています。
インテル® Inspector XE は、アプリケーションを起動し、監視して、スレッド問題を検出します。アプリケーションが終了すると、[Summary (サマリー)] に検出された内容が表示されます。
この例では、インテル® Inspector XE により、アプリケーションで 2 件の [Data race (データ競合)] が検出されています。[Code Locations (コードの場所)] ペインに、選択した問題に関連したソースコードの場所が表示されます。リストされた各問題をダブルクリックすると、[Sources (ソース)] ビューが開き、完全なソースコード情報とコールスタックのデータが表示されます。以下に、上記スクリーンショットの 1 つ目のデータ競合の [Sources (ソース)] ビューを示します。
このビューでソース行をダブルクリックすると、コードエディターが開き、ソースファイルを変更することができます。この特定の問題は、”queens” 配列でメモリーを再利用しているのが原因です。つまり、複数のスレッドでデータが共有されていないにもかかわらず、同じ場所にデータを格納していることが問題です。これを修正するには、スレッドごとに配列のローカルコピーを作成します。
以下に、2 つ目のデータ競合の [Sources (ソース)] ビューを示します。
この問題を修正するには、複数のスレッドが同時にアクセスしないように “nrOfSolutions” 変数を保護する必要があります。そのためには、ATOMIC 宣言子を使います。
これらの問題を修正したら、アプリケーションをリビルドし、再度解析を実行してみてください。すべての問題が解決されると、以下のような解析結果が表示されます。
インテル® Inspector XE を使用することで、Fortran アプリケーションを容易に解析し、アプリケーションの正当性とセキュリティーを向上させることができます。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。
編集部追加
本記事では、Fortran プログラムを並列化した際に生じる問題を検出する方法について紹介しています。マルチスレッドによる並列化を実施した場合、実行ごとに異なる結果となりやすく、デバッグが難しくなります。インテル® Inspector XE の動的解析では、たとえその実行中では問題が無かったとしても、並列実行された場合に問題になりうる点について検出し、報告します。これにより潜在的な問題を発見し、誤りのないマルチスレッド・アプリケーションを作成することができます。評価版のダウンロード、お問い合わせはエクセルソフト株式会社まで。