インテル® Parallel Debugger Extension
この記事は、インテル® ソフトウェア・ネットワークに掲載されている「Intel® Parallel Debugger Extension」の日本語参考訳です。
はじめに
この記事では、インテル® Parallel Studio 2011、インテル® Parallel Studio XE 2011、インテル® Composer XE 2011 Windows* 版に含まれる Microsoft* Visual Studio* 用のインテル® Parallel Debugger Extension について説明します。この Microsoft* Visual Studio* 向けのデバッガー拡張を使用することで、アプリケーション開発者は複雑なマルチコア・プログラムをデバッグすることができます。
インテル® Parallel Debugger Extension は、Microsoft* Visual Studio* デバッガーのグラフィカル・ユーザー・インターフェイスに完全に統合され、その機能を拡張する、マルチスレッドおよびマルチコア・プログラム向けに設計されたデバッグ・ソリューションです。高度な機能により、プログラムのスレッド固有の特性に容易にアクセスできます。
この記事は、Microsoft* Visual Studio* デバッグ環境でインテル® Parallel Debugger Extension によって得られる並列データ構造に関する詳しい洞察を最大限に活用するヒントとコツを提供します。また、Microsoft* Visual Studio* 用のインテル® Parallel Debugger Extension の概要と主要機能についても紹介します。以下の項目を理解することでインテル® Parallel Debugger Extension を使用してデバッグ作業の効率を向上できます。
- インテル® C++ コンパイラーでビルドされたアプリケーションにおけるスレッド間のデータ共有
- SIMD (Single Instruction Multiple Data) レジスターで処理されるベクトル化されたデータストリーム
- 再入可能な関数呼び出しの使用と依存関係
- アクティブな OpenMP* タスクのロック情報とスレッドチームの階層
- OpenMP* とインテル® Cilk™ Plus を使用するアプリケーションのシリアル実行フローと並列実行フロー
- インテル® Cilk™ Plus スレッド・スタック・ビュー
データ共有イベントの検出では、強力なイベントフィルターを利用して不要なイベントのデータをマスクしたり、データ共有イベントの解析を特定のコード領域に限定することができます。詳細は、チュートリアル (英語) を参照してください (https://software.intel.com/sites/default/files/managed/8d/7d/paralleldebuggerextension2011.pdf)。
目的
続々と登場する「マルチコア・プロセッサー」や「メニーコア・プロセッサー」を搭載するシステムにおけるプログラム実行フローを活用し、より高いパフォーマンスを引き出すには、並列プログラミング・モデルを幅広く活用する必要があります。採用する並列プログラミング手法が高度であればあるほど、すべてのアクティブなスレッドとスレッド間のデータの依存関係を追跡するのは困難になります。
Microsoft* Visual Studio* 用のインテル® Parallel Debugger Extension は、高度なマルチスレッド並列アプリケーションの開発を支援するインテルのツールとデバッグ拡張を統合した、使いやすく優れたデバッガー機能を提供します。高度な並列プログラミング手法には、実行フローとランタイム問題の解析を容易に行い、迅速にエラーを修正できる、高度な並列デバッグ手法が必須です。
この記事では、Microsoft* Visual Studio* 用のインテル® Parallel Debugger Extension の概念と機能の概要を説明します。
必要条件
オペレーティング・システム: Microsoft* Windows* XP SP2 または SP3、Window Vista*、Windows* 7
ビルド環境: Microsoft* Visual Studio* 2005、2008、または 2010
ハードウェア・プラットフォーム: IA-32、インテル®64 アーキテクチャー、または互換プラットフォーム
デバッガー拡張の主要機能
インテル® Parallel Debugger Extension は、インテル® Parallel Studio に含まれるインテル® Parallel Composer コンポーネントの一部です。また、インテル® Parallel Studio XE、インテル® Composer XE 2011 Windows* 版、およびこれらの C++/Fortran 製品の一部としても提供されています。
インテル® Parallel Debugger Extension は、Visual Studio* の [デバッグ] メニューから利用できます。デバッグ対象コードの並列実行に関する詳しい洞察は、次の図に示すようにグループ化されています。
スレッドデータ共有の検出
アプリケーションが、並列デバッグチェックが有効な状態 (/debug:parallel) でインテルのデバッグ・ランタイム・ライブラリーを使いインテル® コンパイラーでビルドされている場合、データ共有違反が検出されます。スレッドデータ共有の検出は、Windows* ネイティブスレッドまたは OpenMP* 指示句を使用するアプリケーションをサポートします。
スレッドデータ共有の検出と関数の再入可能性検出は、/debug:parallel によりトリガーされるデバッグ情報のインストルメンテーションだけでなく、ランタイム・ライブラリーのインテル固有の並列言語拡張にも依存するため、並列言語拡張または OpenMP* を有効にするビルドオプションと /debug:parallel の両方を設定する必要があります。[Enable Detection (検出を有効にする)] メニューは、スレッドデータ共有イベントの検出を有効にします。デバッガー拡張で異なるスレッド間のデータ共有を検出すると、例外が発生します。
インテル® Parallel Debugger Extensions は、この例外を監視し、専用のウィンドウにデータ共有イベントを表示します。
データ共有イベントの検出を有効にし、イベントが発生したら実行を停止し、データ・ブレークポイントで停止した場合と同様に処理するように指定できます。データ共有イベントの検出機能では、強力なフィルターを利用して、特定のメモリー領域やデータオブジェクトのデータ共有違反だけを確認することができます。抑制フィルターを指定すると、データ共有解析において、1 つまたは複数のフィルターに該当するアクセスデータやデータ・アクセス・コードを無視できます。フォーカスフィルターを指定すると、データ共有解析において、1 つまたは複数のフィルターに該当しないものをすべて無視できます。データ共有イベントは専用のウィンドウで確認できます。
スレッドデータ共有イベントのツリービューで任意の共有イベントをダブルクリックすると、関連するソースコードやアセンブリー・コードにジャンプできます。
検出されたデータ共有イベントは、必ずプログラムの実行で問題を発生させるわけではありませんが、問題の可能性を示唆していることが多いため、よく調べたほうが良いでしょう。
調査の結果、問題ないと判断されたイベントについては、コンテキスト・メニューから今後その問題を報告しないようにすることができます。
再入可能関数呼び出しの検出
Visual Studio* の [デバッグ] -> [インテル® Parallel Debugger Extension] -> [再入可能呼び出しでブレーク] メニューから再入可能関数呼び出しの検出を有効にするダイアログを表示し、複数のスレッドが 1 つの関数を同時に呼び出そうとしたときに実行を停止するように Visual Studio* に指示できます。これにより、アクセス状況の詳細なデバッグと調査を行い、アプリケーションの実行動作を一貫させるために必要な手段を講じることができます。
再入可能関数呼び出しを検出するには、並列デバッグチェック (/debug:parallel) を有効にし、インテル® コンパイラーでコードをコンパイルする必要があります。そして、[デバッグ] メニューから対応するメニューを選択して検出を有効にし、特定の関数に関連付けられているメモリーアドレスを指定します。複数のスレッドがその関数に同時にアクセスしようとすると、実行は停止します。
[SSE Registers (SSE レジスター)] ウィンドウ
Visual Studio* の [デバッグ] メニューから、一般にデータのベクトル化や SIMD (Single Instruction Multipe Data) 処理に使用されるインテル® ストリーミング SIMD 拡張命令 (インテル® SSE)、SSE2、SSE3、SSE4、MMX レジスターにアクセスできます。レジスターは、表形式で表され、行 (または列) にベクトルが表示されます。そのため [SSE Registers (SSE レジスター)] ウィンドウには個々の値ではなく、値のベクトルの式が表示されます。このウィンドウを使用して、デバッグ対象のアプリケーションでそれぞれのレジスターのデータを変更したり、より透過的にデータをハードウェアに割り当てることができます。
OpenMP* デバッグサポート
[デバッグ] メニューまたはインテル® Parallel Debug Extension アイコンバーから、OpenMP* データ構造に関する情報にアクセスできます。このメニューを使用するには、OpenMP* ランタイム・ライブラリーを使って (つまり、/Qopenmp コンパイラー・オプションを指定して) アプリケーションをビルドする必要があります。
直接アクセスできる OpenMP* データ構造は、タスク、タスクウェイト、タスクウェイト・リスト、タスク・スポーン・ツリー、バリア、ロック、スレッドチームです。
並列領域をシリアル化
OpenMP*、インテル® Cilk™ Plus、インテルの並列スレッド化拡張ベースのコードでは、並列化されたコード領域をシリアル実行することで、タイミング問題の可能性を解析し、より良く理解することができます。
これにより、並列化によって生じた実行フローの正当性問題や、シリアル実行で明らかになる基本的なコーディング・エラーを特定することができます。
プログラムの実行動作を簡単に変更して、問題を詳しく調査する前に基本的なコードの正当性チェックを行うことができるため便利です。
インテル® Cilk™ Plus スレッド・スタック・ビュー
インテル® Cilk™ Plus スレッドは、ほかのスレッドが行った作業を再利用できるため、インテル® Cilk™ Plus ワーカースレッドのコールスタックは単純ではありません。このコールスタック・ビューアーは、インテル® Cilk™ Plus のスレッド化の実装の特性を考慮してスレッドのコールスタックを巻き戻します。
インテル® Cilk™ Plus スレッド・スタック・ウィンドウは、スレッド固有の依存関係を正しく認識し、通常のコールスタック・ウィンドウと同じ機能を備えた専用のウィンドウにワーカースレッドのコールスタックのリストをテキストで表示します。
まとめ
Microsoft* Visual Studio* 用のインテル® Parallel Debugger Extension は、並列アプリケーションにおける共有データやデータの依存関係について詳しい洞察やアクセス情報を提供します。これは、開発サイクルを短縮し、重大なランタイムエラーを引き起こす可能性のある潜在的なデータアクセス競合を早期に検出するには必須です。
SIMD (Single Instruction Multiple Data) 命令や、ネイティブ OS スレッド、インテル® Cilk™ Plus、OpenMP* を使用して並列化されたコードを利用する際には、Microsoft* Visual Studio* 用のインテル® Parallel Debug Extension を使用することを推奨します。スレッドの最適化と正当性検証を行うインテル® Inspector とともに使用することで、並列化されたコードとデータを認識して、コードの正当性をデバッグすることができます。詳細は、http://www.intel.com/go/parallel (英語) を参照してください。
関連情報
インテル® Parallel Debugger Extension の使用例について詳しく説明したチュートリアル (英語) もぜひお読みください。(https://software.intel.com/sites/default/files/managed/8d/7d/paralleldebuggerextension2011.pdf)
インテルl® Parallel Debugger Extension の入手方法
インテル® Parallel Debugger Extension は、インテル® Parallel Studio XE 2011 に含まれるインテル® Composer XE 2011 Windows* のコンポーネントです。本製品の評価版は、エクセルソフト株式会社のサイトからダウンロードできます。
インテル® ソフトウェア・ネットワークの Web サイトには、ソフトウェア製品情報、ユーザーフォーラム、ブログ、ナレッジベース、製品サポートの利用方法も掲載されています。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。