この記事は、インテル® ソフトウェア・ネットワークに掲載されている「Analyzing Fortran Program Correctness on Linux* using Intel Parallel Studio XE」 (http://software.intel.com/en-us/articles/analyzing-fortran-program-correctness-on-linux-using-intel-parallel-studio-xe/) の日本語参考訳です。
インテル® Parallel Composer 2011 XE には、解析ツールの機能を試すことができる C、C++、Fortran によるサンプルプログラムが含まれています。この記事では、それらのサンプルプログラムの 1 つを使って、インテル® Inspector XE の操作方法を説明します。
最初に、利用可能なサンプルプログラムを見てみましょう。インテル® Composer XE のデフォルトのインストール・ディレクトリーは /opt/intel/ です。/opt/intel/composerxe からのシンボリック・リンクはこのディレクトリーを参照します。また、この下に各バージョンのディレクトリーが作成されます。/opt/intel/composerxe 以下にある Samples/en_US/Fortran (ロケールによっては en_US ではないことがあります) に、各種サンプルプログラムがあります。
ここでは、”openmp_samples” ディレクトリーのサンプルプログラムを使用します。ただし、インストール・ディレクトリー以下では、権限によっては新しいファイルを作成できない場合があるので、”openmp_samples” ディレクトリー以下のファイル (openmp_sample.f90) をホーム・ディレクトリー以下 (例えば ~/projects/ompsample) にコピーします。
bash シェルを使ってこのファイルをコンパイルするには、最初に環境を source して、プロジェクト・ディレクトリーでコンパイラーを実行できるようにします。
. /opt/intel/composerxe/bin/compilervars.sh intel64
(上記のコマンドでは、64 ビットのコンパイラーを使用するため、intel64 引数を指定しています。) ソースファイルに、推奨されるいくつかのコンパイルオプションが記述されています。
解析用のプログラムを準備するため、コンパイル時に引数を1 つ追加し (“-debug”)、bash シェルで PATH にインテル® Inspector XE を追加するスクリプトを source します。
[~/projects/ompsample] $ ifort -debug -openmp -fpp -o openmp_sample openmp_sample.f90 [~/projects/ompsample] $ . /opt/intel/inspector_xe_2011/inspxe-vars.sh Copyright (C) 2009-2011 Intel Corporation. All rights reserved. Intel(R) Inspector XE 2011 (build 147581) [~/projects/ompsample] $ inspxe-gui
そして、インテル® Inspector XE を起動します。
まず、解析結果を格納するためのプロジェクトを作成し、プロジェクト・プロパティーで openmp_sample を起動するように設定します。
ここでは、ソースコード・ディレクトリーにプロジェクトを作成します。
ここでは、ompsample というプロジェクト名にしています。
ここで設定が必要なプロパティーは [Application: (アプリケーション:)] だけです。
これで、解析準備ができました。
定義済みの解析の中から、[Locate Deadlocks and Data Races (デッドロックとデータ競合の特定)] を選択し、[Start (開始)] をクリックします。
ダイヤルが回転し、プログラムが実行され、データの収集と後処理が進むにつれて進行状況が更新されます。
最後に、結果が出力されます。
このサンプルプログラムでは、メインループの並列化に使用されている OpenMP* 宣言子でデータ競合が検出されました。問題の個所を調査した結果、実際に OpenMP* ランタイム・ライブラリーに問題があることが分かりました。プライベートにすべきループ変数がプライベートになっていないため、競合状態が発生していたのです。害のない競合ですが、すべてのスレッドがその変数に同じ固定値を設定していました。これはコンパイラー側の問題であり、これによりコードの動作に影響があるわけではありませんが、将来のリリースで修正される予定です。
次に、インテル® Inspector XE の private suppression (プライベートを表示しない) という別の機能についても見てみましょう。この機能を使用することで、すでに確認済みの問題を表示しないようにすることができます。上記のスクリーンショットで、問題レポートの最初の解析結果を右クリックします。
[Suppress (表示しない)] メニューを選択して、プライベートを表示しないルールを作成します。 [Create (作成)] をクリックすると、リストにルールが追加され、そのルールに従って問題レポートが更新されます。ここで、いくつか注意すべき点があります。問題のセットを完全に非表示にするためには、複数のルールを設定しなければならない場合があります。例えば、上記の例では、3 つの解析結果のうち 1 つ目を表示しないようにすると、2 つ目も表示されなくなりますが、3 つ目は表示されたままです。
3 つ目も表示しないようにするには、別のルールを作成し、解析結果 X3 に直接適用します。
2 つのルールを適用した後に再度解析を実行すると、異なる解析結果が出力されます。
(ここでは、該当個所だけを表示するようにスクリーンショットを調整していますが、通常は大きなペインの中央にテキストが表示されます。)
表示しないルールのリストは、重要な問題に関する新しい観察結果が表示されるように不要なルールを削除したり、(ソースの変更やツール/ライブラリーのアップデートにより) 問題の原因が修正されたルールを削除して、更新/管理しなければなりません。インテル® Inspector XE のプロジェクト・プロパティーには、ルールを管理するためのテーブルがあります。
ここでコンパイラーに付属するサンプルコードを使って紹介したように、インテル® Inspector XE は、Fortran アプリケーションのメモリーとスレッドの使用に関する不具合を発見することができます。是非、このサンプルアプリケーションやほかのアプリケーションを使って実際に試してみてください。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。
編集部追加
本記事では、インテル® Inspector XE により、マルチスレッド・プログラムに潜むエラーを検出する例を紹介しています。本記事においては Fortran 言語および Linux 環境を使用していますが、C/C++ 言語と Windows 環境においても同様にご利用いただくことができます。インテル® Inspector XE は、メモリーリークの問題やマルチスレッドによる並列化にて生じうる問題の早期検出に貢献します。また、インテル® Parallel Studio XE および各 Studio XE 製品にバンドルされる場合には、インテル® コンパイラーとの併用にてソースコードの静的解析を行えます。評価版のダウンロード、お問い合わせはエクセルソフト株式会社まで。
なお、本記事で報告された問題は既に修正済みです。バージョン 12.1 の日本語版において再現しないことを確認しています。