Linux* ホスト上でインテル® Xeon Phi™ コプロセッサー向けアプリケーションをデバッグ
この記事は、インテル® デベロッパー・ゾーンに掲載されている「Debugging Intel® Xeon Phi™ Applications on Linux* Host」の日本語参考訳です。
目次
はじめに
インテル® Xeon Phi™ コプロセッサーは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャー・ベースの製品です。インテルでは、このアーキテクチャー向けに、インテル® Xeon Phi™ コプロセッサー上で実行するアプリケーションをデバッグできるデバッグ・ソリューションを提供しています。
インテル® MIC 向けのデバッグ・ソリューションが必要な理由は多数あります。以下は、そのうち最も重要なものです。
-
IA-32 ホストおよびインテル® 64 ホストと同様に、ネイティブのインテル® MIC アプリケーションを簡単に開発できるようにするため。多くの場合、クロスコンパイル (-mmic) が必要なだけですが、インテル® MIC アーキテクチャーはホスト・アーキテクチャーとは異なるため、既存の問題が明らかになることがあります。また、インテル® MIC 向けに不適切なチューニングを行うと、新たな問題 (例えば、データのアライメント、不適切なスレッド数、非効率的なメモリー消費など) が生じます。
-
ホストとコプロセッサーがワークロードを共有するオフロード型アプリケーションの開発はより複雑なため。
-
下位レベルの全般解析、実行パスのトレース、インテル® MIC アーキテクチャーの命令セットの理解のため。
インテル® MIC 向けデバッグ・ソリューション
Linux* ホストでは、インテル® MIC 向けに GNU* GDB ベースのデバッグ・ソリューションが提供されています。このソリューションは、ホストとコプロセッサーのいずれのコマンドラインからも使用できます。また、Eclipse* IDE 統合も提供されており、数百のスレッドを使用するアプリケーションのデバッグを簡単に行えます。さらに、オフロード型アプリケーションのデバッグもサポートしています。
入手方法
現在、Linux* ホストのインテル® MIC アーキテクチャー向けデバッグ・ソリューションを入手する方法は 2 つあります。
-
インテル® メニーコア・プラットフォーム・ソフトウェア・スタック (インテル® MPSS):
https://www.isus.jp/article/mic-article/software-stack-mpss/
(現在のインテル® MPSS Linux* 版のバージョンは 3.1)
最初のバージョンはインテル® MPSS 2.1 で導入されました。 -
インテル® Composer XE (C/C++ または Fortran):
http://software.intel.com/en-us/intel-composer-xe (英語)
インテル® Composer XE 2013 SP1 以降が必要です。
どちらのパッケージにも、同じインテル® MIC アーキテクチャー向けデバッグ・ソリューションが含まれています。
インテルから提供される GNU* GDB を使用する理由
- GNU* コミュニティーでも機能が公開される
- 将来のリリースで最新の GNU* GDB バージョンが含まれる
- Project Archer とインテルによって C/C++ および Fortran サポートが向上している
- インテル® アーキテクチャー (特にインテル® MIC) のサポートが強化されている
- C/C++ および Fortran に Eclipse* IDE 統合を利用できる
- 追加のデバッグ機能を利用できる (今後さらに増える予定)
インテルからコマンドラインと Eclipse* IDE 統合が提供されている理由
GNU* GDB のコマンドラインを使用する利点は以下のとおりです。
- 使い慣れた構文
- 軽量: 依存性なし
- セットアップが簡単: プロジェクトの作成が不要
- 数百のスレッドを高速にデバッグ
- 自動化/スクリプト化可能
Eclipse* IDE ではさらに多くの機能を利用できます。
- 使いやすいユーザー・インターフェイス
- Linux* で最もよく使用されている IDE
- 既存の Eclipse* プロジェクトを使用可能
- インテルの GNU* GDB 拡張を簡単に統合可能
- Fortran をサポートする Photran* プラグインとも動作
- オフロード型アプリケーションのデバッグをサポート
(コマンドラインでは未サポート)
廃止予定
インテル® デバッガーは、インテル® MIC 向けの最初のデバッグ・ソリューションとして提供されましたが、今後廃止される予定です。
- 最終バージョンは 13.0 (新機能はありません)
- インテル® Composer XE の次のメジャーリリースで廃止予定
新しいプロジェクトには、インテルから提供される GNU* GDB をご利用ください。
この件に関するご意見、ご要望は、インテル® プレミアアカウント (英語) またはデバッグ・ソリューションのユーザーフォーラム (英語) までお寄せください。
機能
インテルの GNU* GDB バージョン 7.5 以降では、コマンドラインで次の拡張機能を利用できます。
-
インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーのサポート:
レジスター (zmmX & kX) の表示と命令セットの逆アセンブル -
インテル® トランザクショナル・シンクロナイゼーション・エクステンション (インテル® TSX) のサポート:
Restricted Transactional Memory (RTM) モデル用のヘルパー
(ホストのみ) -
データ競合の検出 (pdbx):
POSIX* スレッド (Pthread*) または OpenMP* によりスレッド化されたアプリケーションにおけるデータ競合とその位置の特定 -
分岐トレースストア (btrace):
クラッシュ、信号、例外などのイベント発生後に簡単にバックトレースできるように実行フロー中の分岐を記録
(ホストのみ) - ポインターチェッカー:
ポインターチェッカー機能を有効にして、インテル® C++ コンパイラーでコンパイルしたバイナリーのポインター問題の特定を支援
(ホストのみ) -
インテル® Memory Protection Extensions (インテル® MPX) とインテル® アドバンスト・ベクトル・エクステンション 512 (インテル® AVX-512) のレジスターサポート:
将来の世代にも対応
以下は、これらのインテル® MIC 向け機能の説明です。
レジスターと命令セットのサポート
インテル® MIC アーキテクチャーの命令セットとレジスターセットは、ホストシステムのインテル® アーキテクチャーとは異なります。インテルの GNU* GDB は、インテル® MIC アーキテクチャーの命令セットとレジスターセットを透過的にサポートしています。使用法はホストシステムで使用する場合と同じです。次に例を示します。
-
命令の逆アセンブル:
(gdb) disassemble $pc, +10 Dump of assembler code from 0x11 to 0x24: 0x0000000000000011
: vpackstorelps %zmm0,-0x10(%rbp){%k1} 0x0000000000000018 : vbroadcastss -0x10(%rbp),%zmm0 ⁞ 上記の例では、命令ポインター ($pc) から 10 個の命令が逆アセンブルされます。ここでは、最初の 2 つの命令のみ表示しています。この 2 つの命令はインテル® MIC 固有で、上記ではニーモニックが表示されています。
-
マスク (kX) およびベクトル (zmmX) レジスターのリスト:
(gdb) info registers zmm k0 0x0 0 ⁞ zmm31 {v16_float = {0x0
}, v8_double = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v64_int8 = {0x0 }, v32_int16 = {0x0 }, v16_int32 = {0x0 }, v8_int64 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_uint128 = {0x0, 0x0, 0x0, 0x0}} レジスターは、インテル® MIC の kX (マスク) および zmmX (ベクトル) レジスターセット向けに拡張されています。
Eclipse* IDE 統合では、同じ情報が専用のウィンドウに表示されます。
-
命令の逆アセンブル:
-
マスク (kX) およびベクトル (zmmX) レジスターのリスト:
データ競合の検出
以下は、データ競合についての簡単な説明です。
-
データ競合は、次の場合に発生します。
2 つ以上のスレッド/タスクが同期せずに同じメモリー位置にアクセスし、少なくとも 1 つが書き込みを行う場合。 -
例:
異なるスレッドによって同時に実行される 2 つの関数 thread1() と thread2() について考えてみます。int a = 1; int b = 2; | t int thread1() { int thread2() { | i return a + b; b = 42; | m } } | e v
thread1() の戻り値は、タイミングに応じて 3 または 43 になります。
これは、データ競合の一例です。
典型的なデータ競合の兆候
-
データ競合の兆候:
- 破損した結果
- 実行ごとの変動
- 破損したデータによるクラッシュ
- 非決定論的な動作
-
同時アクセスの同期により解決:
- スレッドレベルの順序付け (グローバル同期)
- 命令レベルの順序付け/可視性 (アトミック)
注: 競合が発生しないのに実行ごとに再現性のある結果が得られない場合 - 同期なし: データ競合が許容される場合
インテルの GNU* GDB のデータ競合検出機能は、正当性の解析に役立ちます。
データ競合の検出方法
-
データ競合を検出する準備を行います。
-
インテル® C++/Fortran コンパイラー (インテル® Composer XE に含まれる) でのみサポート:
(icc、icpc 、ifort で) -debug parallel オプションを指定してコンパイルします。
-debug parallel オプションを指定してコンパイルされたオブジェクトのみ解析されます。 - オプションで –g を指定して、デバッグ情報を含めることができます。
-
-
デバッガーでデータ競合の検出 (PDBX) を有効にします。
(gdb) pdbx enable (gdb) c data race detected 1: write shared, 4 bytes from foo.c:36 3: read shared, 4 bytes from foo.c:40 Breakpoint -11, 0x401515 in L_test_..._21 () at foo.c:36 *var = 42; /* bp.write */
データ競合の検出には、libpdbx.so.5 ライブラリーが必要です。
- 同期を追跡できます。
- インテル® C++/Fortran コンパイラーの一部です。
- 必要に応じて、コプロセッサーにコピーされます。
(/compiler/lib/mic/libpdbx.so に配置されます。)
次の並列プログラミング・モデルがサポートされます。
- OpenMP*
- POSIX* スレッド
データ競合の検出は、いつでも有効/無効にできます。
- 特定の時間内のメモリーアクセスのみ解析されます。
- メモリー・フットプリントとランタイム・オーバーヘッドを最小限に抑えられます。
フィルターを使って、オーバーヘッドの軽減と解析するコードの選択をより細かく制御できます。
フィルターにより解析対象をより細かく制御:
-
フィルターに監視対象を追加できます。次に例を示します。
(gdb) pdbx filter line foo.c:36 (gdb) pdbx filter code 0x40518..0x40524 (gdb) pdbx filter var shared (gdb) pdbx filter data 0x60f48..0x60f50 (gdb) pdbx filter reads # read accesses
命令または変数に対してさまざまなフィルターを定義できます。命令の場合はソースファイルと行またはアドレス (範囲) で指定し、変数の場合はシンボル名またはアドレス (範囲) で指定します。データ競合が発生した場合、そのデータへのアクセス (読み込み) のみ報告するようにフィルターを設定することもできます。
-
次の排他的な 2 つの基本設定があります。
-
フィルターで指定されたイベントを無視します (デフォルトの動作)。
(gdb) pdbx fset suppress
-
フィルターで指定されていないイベントを無視します。
(gdb) pdbx fset focus
1 つ目の設定はホワイトリストを定義し、2 つ目の設定はブラックリスト (解析しないコードまたはデータ領域) を定義します。
-
-
デバッグに関するコマンドライン・ヘルプを表示します。
(gdb) help pdbx
コマンドに関する詳しい情報が表示されます。
フィルターの使用例:
-
集中的にデバッグする場合 (例えば、1 つのソースファイルや特定のメモリー位置のみ)。
-
オーバーヘッドを抑えて、誤検出を制御する場合。検出には、実行時のランタイム・オーバーヘッドとメモリー・オーバーヘッドが伴います。より多くのフィルターで解析範囲を絞り込むほどオーバーヘッドを減らせます。これは、誤検出の除外にも適用できます。例えば、データ競合が検出されても、アプリケーションの正当性に影響しない場合 (例えば、複数のスレッドの結果を厳密な順序でグローバルにストアする必要がない場合) です。
-
解析からサードパーティーのコードを除外する場合。
PDBX を使用する場合のヒント:
-
最適化されたコード (診断結果):
(gdb) run data race detected 1: write question, 4 bytes from foo.c:36 3: read question, 4 bytes from foo.c:40 Breakpoint -11, 0x401515 in foo () at foo.c:36 *answer = 42; (gdb)
-
より詳しい解析が必要な場合:
- メモリー・オブジェクトに対するデータ競合が報告されます。
- シンボル名が解決できない場合は、アドレスのみ報告されます。
-
推奨事項:
最適化されていないコード (-O0) のほうが、一時性などが排除されるため、理解しやすいでしょう。
-
報告されたデータ競合が誤検出の可能性がある場合:
- すべてのデータ競合が問題になるとは限りません。意図的なデータ競合の可能性もあります。
- OpenMP*: 同じ変数 (同じスタックフレーム) を使用する別の並列領域は誤検出になる可能性があります。
注: PDBX は Eclipse* IDE で利用できません。また、ネイティブ・コプロセッサー・アプリケーションのリモートデバッグのみ行えます。使用法については、「PDBX でのリモートデバッグ」を参照してください。
コマンドラインでのデバッグ
次の方法を選択できます。
- インテル® Xeon Phi™ コプロセッサー上のネイティブデバッグ
- ホスト上で GNU* GDB を実行してリモートデバッグ
インテル® Xeon Phi™ コプロセッサー上のネイティブデバッグ
この方法のインテルの GNU* GDB は、コプロセッサー上でネイティブに実行します。インテル® MPSS にのみ含まれています。実行する場合は、最初にコプロセッサー上で利用可能にする必要があります。以下の場所にインストールされます。
- インテル® MPSS 2.1 の場合: /usr/linux-k1om-4.7/linux-k1om/usr/bin/gdb
- インテル® MPSS 3.1の場合: gdb-7.5+mpss3.1*.k1om.rpm (パッケージ mpss-3.1*-k1om.tar(*) の一部)
(*): ビルドの問題により、インテル® MPSS 3.1.2 にはこの tar ファイルが含まれていません。
ホスト上で GNU* GDB を実行してリモートデバッグ
ホスト上で GNU* GDB を起動し、コプロセッサー上で GDBServer を使ってリモートデバッグを行う方法は 2 つあります。
-
インテル® MPSS
- インテル® MPSS 2.1 の場合:
/bin/gdb - インテル® MPSS 3.1 の場合:
/sysroots/x86_64-mpsssdk-linux/usr/bin/k1om-mpss-linux/k1om-mpss-linux-gdb - GDBServer の場合:
/usr/linux-k1om-4.7/linux-k1om/usr/bin/gdbserver
(インテル® MPSS 2.1、3.1 ともに同じパス)
- インテル® MPSS 2.1 の場合:
-
インテル® Composer XE:
- GNU* GDB を開始するため、次のコマンドで環境を source します。
$ source debuggervars.[sh|csh] $ gdb-mic
- GDBServer:
/debugger/gdb/target/mic/bin/gdbserver
- GNU* GDB を開始するため、次のコマンドで環境を source します。
デバッガー環境は一度だけ source が必要です。compilervars.[sh|csh] スクリプトですでに source している場合は、gdb-mic がデフォルトの検索パスに含まれているため、このステップをスキップできます。
注: 異なるパッケージの GNU* GDB と GDBServer を混在させないでください。必ずインテル® MPSS またはインテル® Composer XE のいずれかに含まれる GNU* GDB と GDBServer を使用してください。
ネイティブデバッグ
-
次のいずれかの方法で、GNU* GDB をターゲットに配置します。
- 次のように、gdb を手動でコピーします。
$ scp /usr/linux-k1om-4.7/linux-k1om/usr/bin/gdb mic0:/tmp
- コプロセッサーのイメージに追加します (インテル® MPSS ドキュメントを参照してください)。
- 次のように、gdb を手動でコピーします。
-
インテル® Xeon Phi™ コプロセッサー上で GNU* GDB を実行します。
$ ssh –t mic0 /tmp/gdb
-
デバッグセッションを初期化します。
- アタッチする場合:
(gdb) attach
は、コプロセッサーの PID です。
- ロードして実行する場合:
(gdb) file
は、コプロセッサー上のパスです。
- アタッチする場合:
ヒント:
-
ネイティブ・アプリケーションが追加のライブラリーを必要とする場合:
次のように、$LD_LIBRARY_PATH を設定します。(gdb) set env LD_LIBRARY_PATH=/tmp/
または、GDB を開始する前にこの変数を設定します。
-
ソースコードを移動している場合は、デバッガーが見つけられるようにします。
(gdb) set substitute-path
このコマンドは、パスを
から へ変更します。このコマンドにより、ソース (サブ) ツリー全体を変更できます。
コプロセッサーは通常の Linux* 環境であるため、ホスト上と同様の手順でデバッグできます。
リモートデバッグ
-
次のように、GDBServer をコプロセッサーにコピーします。
$ scp
/debugger/gdb/target/mic/bin/gdbserver mic0:/tmp 開発時に GDBServer をコプロセッサー・イメージに含めることもできます。
-
次のように、ホスト上で GDB を開始します。
$ source debuggervars.[sh|csh] $ gdb-mic
注: IA-32/インテル® 64 専用のバージョン gdb-ia もあります。
-
接続します。
(gdb) target extended-remote | ssh -T mic0 /tmp/gdbserver --multi –
-
デバッグします。
- アタッチする場合:
(gdb) file
(gdb) attach はホスト上のパスです。 はコプロセッサー上の PID です。 -
ロードして実行する場合:
(gdb) file
(gdb) set remote exec-file はホスト上のパスです。 はコプロセッサー上のパスです。
- アタッチする場合:
ヒント:
-
リモート・アプリケーションが追加のライブラリーを必要とする:
次のように、$LD_LIBRARY_PATH を設定します。(gdb) target extended-remote | ssh mic0 LD_LIBRARY_PATH=/tmp/ /tmp/gdbserver --multi -
-
ソースコードを移動している場合は、デバッガーが見つけられるようにします。
(gdb) set substitute-path
このコマンドは、パスを
から へ変更します。このコマンドにより、ソース (サブ) ツリー全体を変更できます。 -
ホストとターゲットでライブラリーのパスが異なる場合は、デバッガーが見つけられるようにします。
(gdb) set solib-search-path
は、コロンで区切られたホスト上のライブラリー検索パスのリストです。
コプロセッサーは通常の Linux* 環境であるため、ホスト上と同様にデバッグできます。
PDBX でのリモートデバッグ
PDBX には、適切に動作するための必要条件がいくつかあります。pdbx check コマンドで PDBX が動作しているかどうかを確認できます。
-
第 1 ステップ:
(gdb) pdbx check checking inferior...failed.
解決方法:
リモート・アプリケーション (inferior) を起動し、ブレークポイント (例: b main & run) まで実行します。
-
第 2 ステップ:
(gdb) pdbx check checking inferior...passed. checking libpdbx...failed.
解決方法:
set solib-search-path
-
第 3 ステップ:
(gdb) pdbx check checking inferior...passed. checking libpdbx...passed. checking environment...failed.
解決方法:
OpenMP* 用にターゲット上で追加の環境変数を設定します。これらの環境変数は、($LD_LIBRARY_PATH の設定と同様に) GDBServer の起動時に設定する必要があります。
- $INTEL_LIBITTNOTIFY32=””
- $INTEL_LIBITTNOTIFY64=””
- $INTEL_ITTNOTIFY_GROUPS=sync
Eclipse* IDE でのデバッグ
インテルでは、次の機能を備えたインテル® MIC 向け Eclipse* IDE デバッガープラグインを提供しています。
- ホストとコプロセッサーのシームレスなデバッグ
- ホストとコプロセッサーのスレッドを同時に表示
- 複数のコプロセッサー・カードをサポート
- C/C++ と Fortran をサポート
- オフロード拡張 (オフロードコードへの自動アタッチ) をサポート
- インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーのサポート: レジスターと逆アセンブル
このプラグインは、インテル® MPSS およびインテル® Composer XE の両方に含まれています。
必要条件
プラグインを使用するには、次の必要条件を満たしている必要があります。
- サポートされている Eclipse* IDE バージョン:
- バージョン 4.2 + Eclipse* C/C++ Development Tools (CDT) 8.1 以降 (推奨)
- バージョン 3.8 + Eclipse* C/C++ Development Tools (CDT) 8.1 以降
- バージョン 3.7 + Eclipse* C/C++ Development Tools (CDT) 8.0 以降
- Java* Runtime Environment (JRE) 6.0 以降
- Fortran の場合: オプションの Photran* プラグイン
- ネイティブ・コプロセッサー・アプリケーションをデバッグする場合: Remote System Explorer (別名 Target Management)
- インテル® Composer XE のプラグインを使用する場合: source debuggervars.[sh|csh] コマンドによる Eclipse* IDE 環境の設定
インテル® C++ コンパイラーのインストール (オプション):
[Install New Software…] からプラグインを追加します。このプラグインは、インテル® Composer XE (
注: [Group items by category] チェックボックスをオフにします。オフにしないと、リストは空になります。
オフロードデバッグ用のプラグインのインストール
[Install New Software…] からプラグインを追加します。このプラグインは、次の製品に含まれています。
- インテル® MPSS
- インテル® MPSS 2.1:
/eclipse_support/ - インテル® MPSS 3.1: /usr/share/eclipse/mic_plugin/
- インテル® MPSS 2.1:
- インテル® Composer XE:
/debugger/cdt/
オフロードデバッグの設定
- [C/C++ Application] の新しいデバッグ構成を作成します。
-
[Select other…] をクリックして MPM (DSF) Create Process Launcher を選択します。
プラグインには、MPM (DSF) Create Process Launcher が必要です。この手順は、C/C++ および Fortran アプリケーション用です。Photran* がインストールされている場合、Fortran Local Application エントリーが表示されていても (上記のスクリーンショットでは表示されていません) 使用しないでください。このエントリーでは、MPM を使用できません。
-
[Debugger] タブでインテルの GNU* GDB の MPM スクリプトを指定します。
- インテル® MPSS
- インテル® MPSS 2.1:
/mpm/bin/start_mpm.sh - インテル® MPSS 3.1: /usr/bin/start_mpm.sh
- インテル® MPSS 2.1:
-
インテル® Composer XE:
/debugger/mpm/bin/start_mpm.sh ここで、(MPM (DSF) を使用して) オフロードデバッグ用のインテルの GNU* GDB を追加します。このスクリプトは必要な環境を設定します。追加の設定 (プロセッサー・カード、GDBServer とポート、IP アドレスなどの指定) は不要で、完全に自動かつ透過的に動作します。
- インテル® MPSS
オフロードデバッグの開始
オフロード型アプリケーションのデバッグは、ホスト用のネイティブ・アプリケーションのデバッグとほぼ同じです。
-
オフロード拡張を使用して実行ファイルを作成し、ビルドします (C/C++ または Fortran)。
- offload プラグマ/宣言子または OpenMP* 4.0 を使用します。
- MYO (_Cilk_shared、_Cilk_spawn、…) を使用します。
サンプル:/Samples/en_US/[C++|Fortran]/mic_samples - http://software.intel.com/en-us/articles/offload-programming-fortran-and-c-code-examples (英語)
- インテル® デベロッパー・ゾーンのコンテンツ・ライブラリー内のサンプル:
http://software.intel.com/en-us/search/site (英語)
-
必ずデバッグ情報 (-g) を追加し、可能であれば最適化レベルを下げます (-O0)。
-
デバッグセッションを開始します。
- ホストデバッガーとターゲットデバッガーが連動してシームレスに動作します。
- ホストとターゲットのすべてのスレッドとその情報が表示されます。
- Eclipse* IDE からデバッグする場合と同じです。
上記は、オフロードデバッグの例 (Fortran) です。左側のペインで実行中のホストと mic0 のスレッドを確認できます。コプロセッサーの thread (11) が、オフロードコードのループ内に設定したブレークポイントで停止しています。実行制御 (ステップ処理、続行など)、ブレークポイントの設定、変数/メモリーの評価などの動作は通常の場合と同じです。
オフロードデバッグの追加要件
オフロード型アプリケーションのデバッグでは、環境変数を追加設定する必要があります。
-
インテル® MPSS 2.1:
COI_SEP_DISABLE=FALSE
MYO_WATCHDOG_MONITOR=-1 -
インテル® MPSS 3.1:
AMPLXE_COI_DEBUG_SUPPORT=TRUE
MYO_WATCHDOG_MONITOR=-1
Eclipse* IDE を起動する前にこれらの変数を設定します。
現在はこれらの変数が必要ですが、将来は不要になる可能性があります。デバッガーとインテル® VTune™ Amplifier XE は同時に使用できません。そのため、SEP (インテル ® VTune™ Amplifier XE の一部) を無効にしても問題ありません。デバッガーは不特定期間実行を停止する可能性があるため、ウォッチドッグ・モニターは無効にする必要があります。デバッガーによる停止中に、システム・ウォッチドッグは、デバッグ対象のアプリケーションが動作していないと判断して終了する可能性があります。デバッグ時にそうならないように注意してください。
注: プロダクション・システムでは、これらの変数を設定しないでください。
ネイティブデバッグの設定
Remote System Explorer の設定
ネイティブ・コプロセッサー・アプリケーションをデバッグするには、Remote System Explorer (RSE) を設定する必要があります。
注: 続行する前に、(コマンドラインなどで) SSH が動作することを確認してください。RSE により異なる認証情報 (ユーザーアカウント) を指定し、パスワードを保存することもできます。
次の簡単な基本手順に従って、操作を行います。
-
[Remote Systems] ウィンドウを表示します。
メニュー: [Window] > [Show View] > [Other…]
選択項目: Remote Systems->Remote Systems -
各コプロセッサー向けに新しいシステムノードを追加します。
[Remote Systems] ウィンドウのコンテキスト・メニュー: New Connection…
- [Linux] を選択して [Next>] をクリックします。
- コプロセッサーのホスト名 (この例では mic0) を指定して、[Next>] をクリックします。
- 次の項目を選択します。
- ssh.files
- processes.shell.linux
- ssh.shells
- ssh.terminals
コプロセッサーごとにこの手順を繰り返します。
GDBServer の転送
リモートデバッグを行うには、GDBServer をコプロセッサーに転送する必要があります。ここでは、コプロセッサーのターゲットとして /tmp/gdberver を使用します (この情報は後続の節で重要になります)。
次のように、GDBServer をコプロセッサー・ターゲットに転送します。
$ scp/debugger/gdb/target/mic/bin/gdbserver mic0:/tmp
開発時に GDBServer をコプロセッサー・イメージに含めることもできます。
注: GDBServer の正しいパスは、パッケージ (インテル® MPSS またはインテル® Composer XE) により異なります。「コマンドラインでのデバッグ」 を参照してください。
デバッグ構成
ネイティブ・コプロセッサー・アプリケーション用に新しい C/C++ Remote Application デバッグ構成 (この例では native_c++ とします) を作成します。
RSE で設定したコプロセッサー・ターゲット (この例では mic0) を [Connection] に指定します。
アプリケーションのリモートパス、つまりコピー先 (この例では /tmp/native_c++) を指定します。ファイルの手動転送については後述します。
デバッガーによって実行ファイルが指定したパスにアップロードされないようにする場合は、[Skip download to target path] チェックボックスをオンにします。このオプションは、プロジェクトが外部依存性 (ライブラリーなど) を持つ複雑なもので、バイナリーを手動で転送しない場合に役立ちます。
この例では、C/C++ Remote Application を使用します。Photran* プラグインではリモートデバッグ構成が提供されないため、Fortran アプリケーションでもこれを使用します。
注: GDBServer の正しいパスは、パッケージ (インテル® MPSS またはインテル® Composer XE) により異なります。「コマンドラインでのデバッグ」 を参照してください。
[Debugger] タブの [GDBServer Settings] で、アップロードされた GDBServer (この例では /tmp/gdbserver) を指定します。
コプロセッサー用のネイティブ・アプリケーションのビルド
インストールされているプラグインにより構成は異なります。C/C++ アプリケーションの場合、インテル® Composer XE に含まれるインテル® C++ コンパイラー XE プラグインをインストールすることを推奨します。Fortran の場合、Photran* (サードパーティー・プラグイン) をインストールし、手動でインテル® Fortran コンパイラーを選択します。
ホスト上でデバッグする場合と同様のデバッグ構成を使用し、オプション (-g) を指定します。デバッグ時に命令フローを理解しやすくするため、–O0 を指定して最適化を無効にすることもできます。
ホストビルドとの唯一の違いは、次のように –mmic オプションを使って、コプロセッサー用にクロスコンパイルする必要がある点です。
構成が完了したら、ビルドをクリーンします。Eclipse* IDE はすべての依存関係を把握できないことがあるため、この処理が必要になります。最後にビルドします。
注: ここで示した構成ダイアログは、インテル® C++ コンパイラー・プラグインでのみ利用できます。Fortran では、Photran* プラグインをインストールし、手動でコンパイラー/リンカーを ifort に切り替え、コンパイラーとリンカーの両方で -mmic を手動で指定する必要があります。
ネイティブデバッグの開始
次のいずれかの方法で、実行ファイルをコプロセッサーに転送します。
-
(ターミナルでスクリプトを使用して) 手動でコピーします。
-
[Remote Systems] ウィンドウ (RSE) でホストからコプロセッサー・ターゲット (この例では mic0) へファイルをコピーします。
ツリー (Local Files) でファイルを選択し、ターゲット (この例では mic0) 上の任意の場所にペーストします。
-
NFS でビルドをコプロセッサーへミラーリングします (この場合、更新の必要はありません)。
-
(前述のように) デバッガーを使って転送します。
注: コプロセッサー上で実行ファイルが実行可能なことを確認してください。コピーした場合、実行ビットが設定されないことがあります。
前節で作成した C/C++ Remote Application 構成を使ってデバッグを開始します。コプロセッサー・ターゲットに接続し、GDBServer により指定したアプリケーションが起動されます。デバッグ操作は、ローカル/ホスト・アプリケーションと同じです。
注: これは、コプロセッサー用のネイティブ Fortran アプリケーションでも同様です。
ドキュメント
詳細は、製品のドキュメント (英語) を参照してください。
-
インテル® MPSS
- インテル® MPSS 2.1:
/docs/gdb/gdb.pdf
/eclipse_support/README-INTEL - インテル® MPSS 3.1:
まだ含まれていません(*)
- インテル® MPSS 2.1:
-
インテル® Composer XE:
/Documentation/[en_US|ja_JP]/debugger/gdb/gdb.pdf
/Documentation/[en_US|ja_JP]/debugger/gdb/eclmigdb_config_guide.pdf
gdb.pdf は、さまざまな機能により拡張されたインテルの GNU* GDB ベースバージョンの GNU* GDB マニュアルです。新しいコマンド、動作などに関する情報が得られます。
インテル® MPSS の README-INTEL には、Eclipse* IDE プラグインのインストールと設定に関する簡単な説明があります。
eclmigdb_config_guide.pdf は、コマンドラインまたは Eclipse* IDE を使ってデバッグする方法を紹介しています。
「Using Intel® C++ Compiler with the Eclipse* IDE on Linux*」 (英語) は、Eclipse* IDE にインテル® C++ コンパイラーを統合し、設定および使用する方法を掲載したナレッジベースの記事です。
(*): 最近のインテル® MPSS 2.1 から 3.1 への変更に伴い、いくつかのパッケージには一部のドキュメントしか含まれていないか、あるいは全く含まれていません。これは将来のアップデートで改良される予定です。現在、GNU* GDB ドキュメントは含まれていません。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。