インテル® Advisor 2017 for Windows® スレッド化アドバイザー 入門ガイド
インテル® Advisor には、Fortran、C および C++ (ネイティブ/マネージド) アプリケーションでインテル® Xeon® プロセッサーのような最新のプロセッサーのパフォーマンスを最大限に引き出すことができるように支援する 2 つのツール (ベクトル化最適化ツールとスレッド化設計/プロトタイプ生成ツール) が含まれています。このトピックでは、Windows® プラットフォームでのスレッド化アドバイザー GUI の使用方法を説明します。
主な機能
スレッド化アドバイザーには次のような機能があります。
- 調査レポート (Survey Report) - アプリケーションで最も時間を費やしているループおよび関数を示します。この情報を使用して、スレッドによる並列化の候補を判断します。
- トリップカウント (Trip Counts) 解析 - ループ本体を実行する最小、最大、中間の回数と、ループが呼び出される回数を示します。この情報を使用して、特定のループのスレッド化方法に関する決定をより適切に行います。
- アノテーション (Annotations) - 後でスレッド化並列実行が可能な並列フレームワーク・コードに置換できるように、最適な候補であるアプリケーションの場所をマークします。アノテーションは、現在のコンパイラーで処理可能なアプリケーションの計算を変更しないサブルーチン呼び出しまたはマクロです (プログラミング言語に依存します)。
- 適合性レポート (Suitability Report) - 挿入されたアノテーションおよびさまざまな what-if モデル化パラメーターに基づいて、アプリケーションの最大スピードアップを予測します。この情報を使用して、スレッドによる並列化の最適な候補を選択します。
- 依存性レポート (Dependencies Report) - 挿入されたアノテーションに基づいて並列データ共有問題を予測します。予測された最大のスピードアップが労力に見合う場合は、この情報を使用して、データ共有問題を修正します。
必要条件
正確で完全なスレッド化アドバイザーの解析結果が得られるアプリケーションを作成するには、以下の設定を使用してリリースモードでアプリケーションの最適化されたバイナリーをビルドします。
インテル® Advisor のアノテーションの定義に関連する追加ディレクトリーを検索します。
コマンドライン: /I"%ADVISOR_XE_[product_year]_DIR%"\include
Microsoft® Visual Studio® IDE: [C/C++] > [General (全般)] > [Additional Include Directories (追加のインクルード・ディレクトリー)] > $(ADVISOR_XE_[product_year]_DIR)\include;%(AdditionalIncludeDirectories)
完全なデバッグ情報を要求します (コンパイラーおよびリンカー)。
コマンドライン:
Visual Studio® IDE:
- [C/C++] > [General (全般)] > [Debug Information Format (デバッグ情報の書式)] > [Program Database (/Zi) (プログラム・データベース (/Zi))]
- [Linker (リンカー)] > [Debugging (デバッグ)] > [Generate Debug Info (デバッグ情報の作成)] > [Yes (/DEBUG) (はい (/DEBUG))]
コマンドライン:
またはそれ以上
Visual Studio® IDE:
- [C/C++] > [Optimization (最適化)] > [Optimization (最適化)] > [Maximize Speed (/O2) (実行速度 (/O2))] またはそれ以上
- [C/C++] > [Optimization (最適化)] > [Inline Function Expansion (関数のインライン展開)] > [Only __inline (/Ob1) (__inline のみ (/Ob1))]
マルチスレッドのダイナミック・リンク・ライブラリーにある未解決の参照を検索します。
コマンドライン: /MD または /MDd
Visual Studio® IDE: [C/C++] > [Code Generation (コード生成)] > [Runtime Library (ランタイム・ライブラリー)] > [Multi-threaded DLL (/MD) (マルチスレッド DLL (/MD))] または [Multi-threaded Debug DLL (/MDd) (マルチスレッド・デバッグ DLL (/MDd))]
インテル® Advisor のアノテーションの定義に関連する追加ディレクトリーを検索します。
コマンドライン:
- /I"%ADVISOR_XE_[product_year]_DIR%"\include\ia32 または /I"%ADVISOR_XE_[product_year]_DIR%"\include\intel64
- /L"%ADVISOR_XE_[product_year]_DIR%"\lib32 または /L"%ADVISOR_XE_[product_year]_DIR%"\lib64
- /ladvisor
Visual Studio® IDE:
- [Fortran] > [General (全般)] > [Additional Include Directories (追加のインクルード・ディレクトリー)] > "$(ADVISOR_XE_[product_year]_DIR)\include\ia32\" または "$(ADVISOR_XE_[product_year]_DIR)\include\intel64\"
- [Linker (リンカー)] > [General (全般)] > [Additional Library Directories (追加のインクルード・ディレクトリー)] > "$(ADVISOR_XE_[product_year]_DIR)\lib32" または "$(ADVISOR_XE_[product_year]_DIR)\lib64"
- [Linker (リンカー)] > [Input (入力)] > [Additional Dependencies (追加の依存ファイル)] > [.lib] > [libadvisor]
完全なデバッグ情報を要求します (コンパイラーおよびリンカー)。
コマンドライン:
Visual Studio® IDE:
- [Fortran] > [General (全般)] > [Debug Information Format (デバッグ情報の書式)] > [Full (/debug=full) (フル (/debug=full))]
- [Linker (リンカー)] > [Debugging (デバッグ)] > [Generate Debug Info (デバッグ情報の作成)] > [Yes (/DEBUG) (はい (/DEBUG))]
コマンドライン:
またはそれ以上
Visual Studio® IDE:
- [Fortran] > [Optimization (最適化)] > [Optimization (最適化)] > [Maximize Speed (実行速度)] またはそれ以上
- [Fortran] > [Optimization (最適化)] > [Inline Function Expansion (関数のインライン展開)] > [Only INLINE Directive (/Ob1) (INLINE ディレクティブのみ (/Ob1))]
マルチスレッドのダイナミック・リンク・ライブラリーにある未解決の参照を検索します。
コマンドライン: /MD または /MDd
Visual Studio® IDE: [Fortran] > [Libraries (ライブラリー)] > [Runtime Library (ランタイム・ライブラリー)] > [Multithread DLL (/libs:dll /threads) (マルチスレッド DLL (/libs:dll /threads))] または [Debug Multithread DLL (/libs:dll /threads /dbglibs) (デバッグ・マルチスレッド DLL (/libs:dll /threads /dbglibs))]
追加の操作: インテル® Advisor でアプリケーションを解析する前に、アプリケーションが正しく動作することを確認します。
環境の設定
注意:
- インテル® Advisor 環境の設定は、advixe-gui コマンドを使用してインテル® Advisor スタンドアロン GUI を起動する (または advixe-cl コマンドを使用してコマンドライン・インターフェイスを実行する) 場合にのみ必要です。インテル® Advisor 環境を設定するには、<advisor-install-dir>\advixe-vars.bat または <parallel-studio-install-dir>\psxevars.bat を実行します。
- <advisor-install-dir> および <parallel-studio-install-dir> のデフォルトのインストール・パスは、C:\Program Files (x86)\IntelSWTools\ です (システムによっては、フォルダー名が Program Files (x86) ではなく Program Files になります)。
はじめに
インテル® Advisor のスレッド化アドバイザーを使用するには、以下の操作を行います (白のブロックはオプションです)。
インテル® Advisor の起動
スタンドアロン GUI インターフェイスの場合は、次のいずれかの操作を行います。
- advixe-gui コマンドを実行します。
- Microsoft® Windows® 7 の [スタート] メニューから、[Intel Parallel Studio XE 201n (インテル(R) Parallel Studio XE 201n)] > [Analyzers (アナライザー)] > [Advisor (アドバイザー)] を選択します。
- Microsoft® Windows® 8/8.1/10 の [すべてのアプリ] 画面から、[Intel Parallel Studio XE 201n (インテル(R) Parallel Studio XE 201n)] > [Intel Advisor 201n (インテル(R) Advisor 201n)] を選択します。
インテル® Advisor が Visual Studio® IDE に統合されている場合: Visual Studio® IDE でソリューションを開きます。
インテル® Advisor の起動とプロジェクトの管理
スタンドアロン GUI の場合:
- [File (ファイル)] > [New (新規作成)] > [Project… (プロジェクト…)] を選択して (または [Welcome (ようこそ)] ページで [New Project… (新規プロジェクト…)] をクリックして)、[Create a Project (プロジェクトの作成)] ダイアログボックスを開きます。
- プロジェクトの名前と場所を指定したら、[Create Project (プロジェクトの作成)] ボタンをクリックして [Project Properties (プロジェクト・プロパティー)] ダイアログボックスを開きます。
- [Analysis Target (解析ターゲット)] タブの左側で、[Survey Hotspots Analysis (調査 hotspot 解析)] タイプが選択されていることを確認します。
- 適切なパラメーター、バイナリー/シンボル検索およびソース検索ディレクトリーを設定します。
- [OK] をクリックして、[Project Properties (プロジェクト・プロパティー)] ダイアログボックスを閉じます。
Visual Studio® IDE の場合:
- [プロジェクト] > [Intel Advisor version Project Properties… (インテル(R) Advisor version プロジェクトのプロパティー…)] を選択して、[Project Properties (プロジェクト・プロパティー)] ダイアログボックスを開きます。
- [Analysis Target (解析ターゲット)] タブの左側で、[Survey Hotspots Analysis (調査 hotspot 解析)] タイプが選択されていることを確認します。
- 適切なパラメーター、バイナリー/シンボル検索およびソース検索ディレクトリーを設定します。
- [OK] をクリックして、[Project Properties (プロジェクト・プロパティー)] ダイアログボックスを閉じます。
ヒント:
- ほかのスレッド化解析タイプを実行する予定がある場合は、それらのパラメーターも設定します (可能な場合)。
- 可能な場合は、ほかの解析タイプで [Inherit settings from Survey Hotspots Analysis Type (調査 hotspot 解析タイプから設定を継承する)] チェックボックスをオンにします。
- [Survey Trip Counts Analysis (調査トリップカウント解析)] タイプには、[Survey Hotspots Analysis (調査 hotspot 解析)] タイプと同様のパラメーターがあります。
- [Dependencies Analysis (依存性解析)] タイプは、[Survey Hotspots Analysis (調査 hotspot 解析)] タイプよりも多くのリソースを消費します。依存性解析に時間がかかる場合は、ワークロードを減らすことを検討してください。
- 必要な場合は、[Workflow (ワークフロー)] ペインの上部のタブをクリックして、[Vectorization Workflow (ベクトル化ワークフロー)] と [Threading Workflow (スレッド化ワークフロー)] を切り替えます。
調査解析の実行
[Threading Workflow (スレッド化ワークフロー)] の [Survey Target (調査ターゲット)] で、 コントロールをクリックして、アプリケーションの実行中に調査データを収集します。収集した情報を使用して、スレッドによる並列化の候補を判断します。
注意:
[Threading Workflow (スレッド化ワークフロー)] が表示されていない場合は、次の操作を行います。
- [ソリューション エクスプローラー] で、プロジェクトを右クリックします。
- [Intel Advisor 201n (インテル(R) Advisor 201n)] > [Start Survey Analysis (調査解析の開始)] を選択します。
トリップカウント解析の実行
このステップはオプションです。
トリップカウント解析を実行する前に、[Survey Trip Counts Analysis (調査トリップカウント解析)] タイプで適切な [Project Properties (プロジェクト・プロパティー)] を設定していることを確認します。
[Threading Workflow (スレッド化ワークフロー)] の [Find Trip Counts (トリップカウントの検索)] で、 コントロールをクリックして、アプリケーションの実行中にトリップカウントを収集します。収集した情報を使用して、特定のループのスレッド化方法に関する決定をより適切に行います。
ループの調査
[Self Time (セルフ時間)] と [Total Time (合計時間)] の観点から最もホットなループに特に注目してください。これらのループを最適化すると最も効果があります。[Total Time (合計時間)] の長い最外ループは、多くの場合、スレッドによる並列化に適した候補です。最内ループおよび最内ループに近いループは、多くの場合、ベクトル化に適した候補です。
アノテーションの挿入
後で並列実行が可能な並列フレームワーク・コードに置換できるように、最適な候補であるアプリケーションの場所をマークするため、アノテーションを挿入します。アノテーションを挿入した後、リリースモードでアプリケーションをリビルドします。
インテル® Advisor のアノテーションは、次の場所をマークします。
- 並列サイト。並列サイトは、1 つ以上の並列スレッドでワークを分散して実行できる 1 つ以上のタスクを含むコード領域です。効率的な並列サイトには、通常、アプリケーション実行時間の多くを費やす hotspot が含まれます。頻繁に実行される命令を同時に実行できる異なるタスクに分散する場合、最適な並列サイトは、通常、hotspotではなく、コールツリーのより高い場所に位置します。
- 並列サイト内の 1 つ以上の並列タスク。タスクは、1 つ以上の並列スレッドでワークを分散して実行できるデータを含む、多くの時間を費やすコード領域です。
- ロック同期。並列アプリケーションでデータアクセスの排他制御が必要な場所です。
エディターにコピーできるアノテーション付きソースコードのサンプルが用意されています。
タスクコードがループ本体全体を含む、単純なループ構造を作成します。この一般的なタスク構造は、並列サイト内に 1 つのタスクのみ必要な場合に便利です。
タスクコードがループ本体全体を含まないループ、または複数のタスク終了アノテーションを含む、特定のタスクの開始-終了境界を必要とする複雑なループやコードを作成します。この構造は、並列サイト内に複数のタスクが必要な場合にも便利です。
並列サイト内の複数のタスクを呼び出すコードを作成します。
データ収集を一時的に停止して後から再開します。アプリケーション実行の収集が不要な部分をスキップして、収集されるデータを最小限に抑え、大きなアプリケーションの解析を高速化できます。並列サイトの外部に、これらのアノテーションを追加します。
使用中の言語に固有のビルド (コンパイラーおよびリンカー) 設定を指定します。
ヒント:
タスク・アノテーションを追加する場所の選択には、試行が必要です。並列サイトが入れ子のループで、最内ループにより使用される計算時間が小さい場合、次の最外ループの前後にタスク・アノテーションを追加することを検討してください。
適合性解析の実行
適合性解析を実行する前に、[Suitability Analysis (適合性解析)] タイプで適切な [Project Properties (プロジェクト・プロパティー)] を設定していることを確認します。
[Threading Workflow (スレッド化ワークフロー)] の [Check Suitability (適合性のチェック)] で、 コントロールをクリックして、アプリケーションの実行中に適合性データを収集します。
適合性レポートは、挿入されたアノテーションおよび次のような what-if モデル化パラメーターに基づいて、データの最大スピードアップを予測します。
- 異なるハードウェア構成および並列フレームワーク
- 異なるトリップカウントおよびインスタンス期間
- 並列フレームワーク・コード実装時の並列オーバーヘッド、ロック競合、タスクチャンクに対応するプラン
収集した情報を使用して、スレッドによる並列化の最適な候補を選択します。
依存性解析の実行
依存性解析を実行する前に、[Dependencies Analysis (依存性解析)] タイプで適切な [Project Properties (プロジェクト・プロパティー)] を設定していることを確認します。(同じアプリケーションを使用しますが、可能な場合は入力データセットをより小さくします。)
[Threading Workflow (スレッド化ワークフロー)] の [Check Dependences (依存性のチェック)] で、 コントロールをクリックして、アプリケーションの実行中に依存性データを収集します。予測されたスピードアップが労力に見合う場合は、収集した情報を使用して、データ共有問題を修正します。
アプリケーション・パフォーマンスの向上
このステップはオプションです。
予測されたスピードアップがスレッド並列処理をアプリケーションに追加する労力に見合うと判断した場合、次の操作を行います。
- 提案された並列処理の変更に関する開発者/アーキテクトによる設計およびコードレビューを完了します。
- インテル® スレッディング・ビルディング・ブロック (インテル® TBB)、OpenMP*、インテル® Cilk™ Plus、Microsoft® タスク並列ライブラリー (TPL)、その他の並列フレームワークのような、アプリケーションの並列プログラミング・フレームワーク (スレッド化モデル) を選択します。
- ビルド環境に並列フレームワークを追加します。
- インテル® TBB/OpenMP* のロックやインテル® Cilk™ Plus のレデューサーのような、共有データリソースへのアクセスを同期する並列フレームワーク・コードを追加します。
- 並列タスクを作成する並列フレームワーク・コードを追加します。
ステップ 4 および 5 で選択した並列フレームワークから適切な並列コードを追加するとともに、インテル® Advisor のアノテーションを維持、コメントアウト、または置換することができます。