Windows* ホスト上でインテル® Xeon Phi™ コプロセッサー向けアプリケーションをデバッグする
この記事は、インテル® デベロッパー・ゾーンに公開されている「Debugging Intel® Xeon Phi™ Applications on Windows* Host」の日本語参考訳です。
内容
はじめに
インテル® Xeon Phi™ コプロセッサーは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャー・ベースの製品です。インテルでは、このアーキテクチャー向けに、インテル® Xeon Phi™ コプロセッサー上で実行するアプリケーションをデバッグできるデバッグ・ソリューションを提供しています。
インテル® MIC 向けのデバッグ・ソリューションが必要な理由は多数あります。以下は、そのうち最も重要なものです。
- IA-32 ホストおよびインテル® 64 ホストと同様に、ネイティブのインテル® MIC アプリケーションを簡単に開発できるようにする。多くの場合、クロスコンパイル (/Qmic) が必要なだけですが、インテル® MIC アーキテクチャーはホスト・アーキテクチャーとは異なるため、既存の問題が明らかになることがあります。また、インテル® MIC 向けに不適切なチューニングを行うと、新たな問題 (例えば、データのアライメント、不適切なスレッド数、非効率的なメモリー消費など) が生じます。
- ホストとコプロセッサーがワークロードを共有するオフロード型アプリケーションの開発はより複雑なため。
- 下位レベルの全般解析、実行パスのトレース、インテル® MIC アーキテクチャーの命令セットの理解のため。
インテル® MIC 向けデバッグ・ソリューション
Windows* ホスト向けに、インテル® MIC アーキテクチャー・アプリケーション向けのインテル® デバッガー拡張が提供されます。インテル® Xeon Phi™ コプロセッサー上で実行されるインテル® MIC ネイティブ・アプリケーションとオフロードを使用するアプリケーションがサポートされます。
入手方法
Windows* ホスト上のインテル® MIC アーキテクチャー向けのインテル® デバッガー拡張を入手するには、次の製品が必要です:
- インテル® Parallel Studio XE 2015 Composer Edition (C/C++ もしくは Fortran):
https://www.isus.jp/article/intel-software-dev-products/intel-parallel-studio-xe/ - インテル® Parallel Studio XE 2015 Composer Edition 以上には、Windows* ホスト向けのデバッグ・ソリューションが含まれます。また、インテル® メニーコア・プラットフォーム・ソフトウェア・スタック (インテル® MPSS) も必要です:
https://www.isus.jp/article/mic-article/software-stack-mpss/
(Windows* 向けは現在 3.4.2 です)
統合環境のデバッグ・ソリューション
GNU* GDB に基づいたインテルからのデバッグ・ソリューション:
- Microsoft* Visual Studio* に完全に統合され、コマンドライン版は提供されません
- インテル® Composer XE 2013 SP1 以降に含まれています
注:
コプロセッサー上での完全なネイティブ・デバッグは、コプロセッサー向けの GNU* GDB 版を使用して行うことができます。これは、Linux* ホスト向けの以下の記事で触れています:
http://software.intel.com/en-us/articles/debugging-intel-xeon-phi-applications-on-linux-host
なぜ、Microsoft* Visual Studio* へ統合するのか?
- Microsoft* Visual Studio* は、Windows* ホスト上の確立された IDE です
- 統合することで、既存の利便性と機能を再利用できます
- インテル® Fortran Composer XE では、Fortran のサポートが追加されています
必要なコンポーネント
インテル® MIC アーキテクチャーの開発とデバッグを行うには次のコンポーネントが必要です:
- インテル® Xeon Phi™ コプロセッサー
- Windows Server* 2008 RC2、Windows* 7 以降
- Microsoft* Visual Studio* 2012 以降
Microsoft* Visual Studio* 2013 のサポートは、インテル® Composer XE 2013 SP1 Update 1 で追加されました。 - インテル® MPSS 3.1 以降
- C/C++ 開発:
インテル® C++ Composer XE 2013 SP1 Windows* 版 以降 - Fortran 開発:
インテル® Fortran Composer XE 2013 SP1 Windows* 版 以降
設定とテスト
コプロセッサーの設定が正しく動作していることを確認することは非常に重要です。そうしないと、デバッガーが完全に機能しない可能性があります。
インテル® MPSS の設定:
- 設定は、インテル® MPSS の readme-windows.pdf に従ってください。
- インテル® Xeon Phi™ コプロセッサーが動作していることを確認します。
オフロード拡張を持つアプリケーションをデバッグする前に:
- 次の場所のサンプルを使用します:
C:\Program Files (x86)\Intel\Composer XE 2013 SP1\Samples\ja_JP - オフロードコードが動作することを確認します。
コプロセッサーの設定が正しく動作していることを確認することは非常に重要です。そうしないと、デバッガーが完全に機能しない可能性があります。
デバッグの要求準備
インテル® MIC アーキテクチャー向けのデバッガー統合は、デバッグ情報が利用可能な場合にのみ動作します。
- 少なくとも次のオプションを指定してデバッグモードでコンパイルします:
/Zi (コンパイラー) と /DEBUG (リンカー) - オプション: 最適化されていないコード (/Od) のほうが、一時性などが排除されるため、理解しやすいでしょう。
64 ビットのアプリケーションのみをデバッグできます。
オフロード拡張を持つアプリケーションのデバッグ
Microsoft* Visual Studio* IDE を起動し、オフロード拡張を持つインテル® Xeon Phi™ プロジェクトを開くか作成します。次のディレクトリーにサンプルコードがあります:
C:\Program Files (x86)\Intel\Composer XE 2013 SP1\Samples\ja_JP
- C++\mic_samples.zip or
- Fortran\mic_samples.zip
ここでは、C++ の intro_SampleC を使用します。
インテル® C++ もしくは Fortran コンパイラーでプロジェクトをビルドします。
デバッグの特徴
- コードにブレークポイントを設定 (デバッグセッション中もしくは前に):
- ホストとコプロセッサー向けの混在したコード
- デバッガー統合は、自動的にホストとコプロセッサーに対しディスパッチします
- 実行制御は、ネイティブ・アプリケーションと同等です:
- 実行/続行
- 停止/割り込み
- …
- オフロードされたコードは、ホスト上で実行を停止します (スレッドのオフロード)
- オフロードされたコードは、他のスレッドでコプロセッサー上で実行されます
- IDE は、ホスト/コプロセッサーの情報を同時に表示します:
- ブレークポイント
- スレッド
- プロセス/モジュール
- …
- 複数コプロセッサーがサポートされます:
- データは混在して表示されます:
異なるプロセスとアドレス空間を持つことに留意してください - これ以上設定を行う必要はありません:
デバッグを行いましょう!
- データは混在して表示されます:
ブレークポイントの設定
ブレークポイントが混在することに注意してください:
通常のコード (オフロードされない) に設定されたブレークポイントは、ホストに適用されます。オフロードされるコードに設定されたブレークポイントは、コプロセッサーにのみ適用されます。
ブレークポイント・ウィンドウには、すべてのブレークポイント (ホストとコプロセッサー) が表示されます。
デバッグの開始
デバッグを開始するには通常のメニューもしくは <F5> キーを使用します:
コプロセッサーのコードをデバッグするには、オフロードされたブレークポイントに到達するまでデバッグを継続します。
スレッド情報
ホストとコプロセッサーの情報が混在しています。上記の例では、スレッドウィンドウは 2 つのプロセスとそのスレッドを示しています。1 つはホストのプロセスで、オフロードを行っています。もう一つは、ホスティングとオフロードされたコードを実行するコプロセッサー上のプロセスです。
追加要件
オフロード型アプリケーションのデバッグでは、環境変数を追加設定する必要があります。
- インテル® MPSS 2.1:
COI_SEP_DISABLE=FALSE
MYO_WATCHDOG_MONITOR=-1 - インテル® MPSS 3.*:
AMPLXE_COI_DEBUG_SUPPORT=TRUE
MYO_WATCHDOG_MONITOR=-1
Visual Studio* IDE を起動する前にこれらの変数を設定します。
現在はこれらの変数が必要ですが、将来は不要になる可能性があります。デバッガーとインテル® VTune™ Amplifier XE は同時に使用できません。そのため、SEP (インテル ® VTune™ Amplifier XE の一部) を無効にしても問題ありません。デバッガーは不特定期間実行を停止する可能性があるため、ウォッチドッグ・モニターは無効にする必要があります。デバッガーによる停止中に、システム・ウォッチドッグは、デバッグ対象のアプリケーションが動作していないと判断して終了する可能性があります。デバッグ時にそうならないように注意してください。
注:
プロダクション・システムでは、これらの変数を設定しないでください。
ネイティブ・コプロセッサー・アプリケーションのデバッグ
要求事項
インテル® Xeon Phi™ コプロセッサーのネイティブ・アプリケーションを作成して、アプリケーションをコプロセッサーに転送し実行します。
- C:\Temp\mic-examples\bin\myApp アプリケーションを実行するためインテル® MPSS で提供される、micnativeloadex.exe を使用します。
例:
> “C:\Program Files\Intel\MPSS\bin\micnativeloadex.exe” “C:\Temp\mic-examples\bin\myApp” -d 0 - オプション –d 0 は、システムに複数のコプロセッサー・カードが存在する場合、最初のデバイス (ゼロがベース) を指定することを意味します。
- アプリケーションは、転送後すぐに実行されます。
micnativeloadex.exe は、指定されたアプリケーションを、指定されたコプロセッサーへ転送し、直接実行します。転送されたアプリケーションの実行が完了するまで、コマンドはブロックされます。
micnativeloadex.exe を使用すると、依存関係のあるコンポーネント (ライブラリーなど) も同時に転送されます。
ネイティブ・アプリケーションを転送して実行するには他の方法もあります (少し複雑です):
- SSH/SCP
- NFS
- FTP
- …
Visual Studio* IDE でのネイティブ・アプリケーションのデバッグは、プロセスにアタッチすることでのみ可能です:
- micnativeloadex.exe は、ネイティブ・アプリケーションの転送と実行に利用されます。
- アプリケーションが、次のようにアタッチされるまで待機することを確実にします:
static int lockit = 1; while(lockit) { sleep(1); }
- アタッチされると、lockit に 0 がセットされ処理を続行します。
- Visual Studio* ソリューション/プロジェクトは必要ありません。
この方法では、同時に 1 枚のカードのみデバッグできます。
設定
[ツール] > [オプション] メニューからオプションを開きます:
これは、デバッガー拡張にバイナリーとソースを見つけることを指示します。異なるネイティブ・アプリケーション (コプロセッサーの) をデバッグするたびに変更する必要があります。
エントリー solib-search-path directories は、GNU* GDB コマンドと同様に動作します。これにより、デバッグを実行しているホストシステムに、ビルドシステムからのパスをマップすることができます。
エントリー Host Cache Directory は、シンボル・ファイルをキャッシュするために使用します。アプリケーション・サイズが大きな場合、シンボルの検索を高速化できます。
アタッチ
[ツール] > [プロセスにアタッチ] メニューからオプションを開きます:
“Intel(R) Debugger Extension for Intel(R) MIC Architecture” を選択します。IP と port を設定し、GDBServer を実行する必要があります。通常 GDBServer は port 2000 を使用しますが、非特権 port (例えば 16000) を使用することを推奨します。
少し待機した後、コプロセッサー・カードのプロセスがリストされます。アタッチするカードを選択します。
注:
チェックボックス “Show processes from all users” は、ユーザーアカウントがホストからターゲットにそしてその逆に (Linux* 対 Windows*) マップできないため、コプロセッサー向けの機能を提供していません。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください