インテル® Advisor 2017 for Linux* スレッド化アドバイザー 入門ガイド

インテル® Advisor には、Fortran、C および C++ (ネイティブ/マネージド) アプリケーションでインテル® Xeon® プロセッサーのような最新のプロセッサーのパフォーマンスを最大限に引き出すことができるように支援する 2 つのツール (ベクトル化最適化ツールとスレッド化設計/プロトタイプ生成ツール) が含まれています。このトピックでは、Linux* プラットフォームでのスレッド化アドバイザー GUI の使用方法を説明します。

主な機能

スレッド化アドバイザーには次のような機能があります。

  • 調査レポート (Survey Report) - アプリケーションで最も時間を費やしているループおよび関数を示します。この情報を使用して、スレッドによる並列化の候補を判断します。

  • トリップカウント (Trip Counts) 解析 - ループ本体を実行する最小、最大、中間の回数と、ループが呼び出される回数を示します。この情報を使用して、特定のループのスレッド化方法に関する決定をより適切に行います。

  • アノテーション (Annotations) - 後でスレッド化並列実行が可能な並列フレームワーク・コードに置換できるように、最適な候補であるアプリケーションの場所をマークします。アノテーションは、現在のコンパイラーで処理可能なアプリケーションの計算を変更しないサブルーチン呼び出しまたはマクロです (プログラミング言語に依存します)。

  • 適合性レポート (Suitability Report) - 挿入されたアノテーションおよびさまざまな what-if モデル化パラメーターに基づいて、アプリケーションの最大スピードアップを予測します。この情報を使用して、スレッドによる並列化の最適な候補を選択します。

  • 依存性レポート (Dependencies Report) - 挿入されたアノテーションに基づいて並列データ共有問題を予測します。予測された最大のスピードアップが労力に見合う場合は、この情報を使用して、データ共有問題を修正します。



必要条件

正確で完全なスレッド化アドバイザーの解析結果が得られるアプリケーションを作成するには、以下の設定を使用してリリースモードでアプリケーションの最適化されたバイナリーをビルドします。

操作

最適な C/C++ および Fortran 設定

インテル® Advisor のアノテーションの定義に関連する追加ディレクトリーを検索します。

C++ 向け:
-I${ADVISOR_XE_[product_year]_DIR}/include

Fortran 向け:

  • -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

完全なデバッグ情報を要求します (コンパイラーおよびリンカー)。

-g

中程度の最適化を要求します。

-O2 またはそれ以上

マルチスレッドのダイナミック・リンク・ライブラリーにある未解決の参照を検索します。

C++ 向け:
-Bdynamic

Fortran 向け:
-shared-intel

ダイナミック・ロードを有効にします。

-ldl

追加の操作:

  • インテル® Advisor でアプリケーションを解析する前に、アプリケーションが正しく動作することを確認します。
  • インテル® Advisor をアプリケーションと同じ環境で実行します。

 

環境の設定

環境を設定するには、次のいずれかの操作を行います。

  • 次の source コマンドを実行します。
    • csh/tcsh ユーザーの場合: source <advisor-install-dir>/advixe-vars.csh
    • bash ユーザーの場合: source <advisor-install-dir>/advixe-vars.sh

デフォルトのインストール・パス <advisor-install-dir> は次のとおりです。

    • /opt/intel/ (root ユーザーの場合)
    • $HOME/intel/ (root 以外のユーザーの場合)

  • <advisor-install-dir>/bin32 または <advisor-install-dir>/bin64 をパスに追加します。

  • <parallel-studio-install-dir>/psxevars.csh または <parallel-studio-install-dir>/psxevars.sh スクリプトを実行します。デフォルトのインストール・パス <parallel-studio-install-dir> は次のとおりです。
    • /opt/intel/ (root ユーザーの場合)
    • $HOME/intel/ (root 以外のユーザーの場合)

はじめに

インテル® Advisor のスレッド化アドバイザーを使用するには、以下の操作を行います (白のブロックはオプションです)。

インテル Advisor スレッド化アドバイザー

 

インテル® Advisor の起動とプロジェクトの管理

advixe-gui コマンドを実行します。

  1. [File (ファイル)] > [New (新規作成)] > [Project… (プロジェクト…)] を選択して (または [Welcome (ようこそ)] ページで [New Project… (新規プロジェクト…)] をクリックして)、[Create a Project (プロジェクトの作成)] ダイアログボックスを開きます。
  2. プロジェクトの名前と場所を指定したら、[Create Project (プロジェクトの作成)] ボタンをクリックして [Project Properties (プロジェクト・プロパティー)] ダイアログボックスを開きます。
  3. [Analysis Target (解析ターゲット)] タブの左側で、[Survey Hotspots Analysis (調査 hotspot 解析)] タイプが選択されていることを確認します。
  4. 適切なパラメーター、バイナリー/シンボル検索およびソース検索ディレクトリーを設定します。
  5. [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 (調査ターゲット)] で、Intel Advisor control: Run analysis コントロールをクリックして、アプリケーションの実行中に調査データを収集します。収集した情報を使用して、スレッドによる並列化の候補を判断します。

トリップカウント解析の実行

このステップはオプションです。
トリップカウント解析を実行する前に、[Survey Trip Counts Analysis (調査トリップカウント解析)] タイプで適切な [Project Properties (プロジェクト・プロパティー)] を設定していることを確認します。
[Threading Workflow (スレッド化ワークフロー)][Find Trip Counts (トリップカウントの検索)] で、Intel Advisor control: Run analysis コントロールをクリックして、アプリケーションの実行中にトリップカウントを収集します。収集した情報を使用して、特定のループのスレッド化方法に関する決定をより適切に行います。

ループの調査

[Self Time (セルフ時間)][Total Time (合計時間)] の観点から最もホットなループに特に注目してください。これらのループを最適化すると最も効果があります。[Total Time (合計時間)] の長い最外ループは、多くの場合、スレッドによる並列化に適した候補です。最内ループおよび最内ループに近いループは、多くの場合、ベクトル化に適した候補です。

アノテーションの挿入

後で並列実行が可能な並列フレームワーク・コードに置換できるように、最適な候補であるアプリケーションの場所をマークするため、アノテーションを挿入します。アノテーションを挿入した後、リリースモードでアプリケーションをリビルドします。

インテル® Advisor のアノテーションは、次の場所をマークします。

  • 並列サイト。並列サイトは、1 つ以上の並列スレッドでワークを分散して実行できる 1 つ以上のタスクを含むコード領域です。効率的な並列サイトには、通常、アプリケーション実行時間の多くを費やす hotspot が含まれます。頻繁に実行される命令を同時に実行できる異なるタスクに分散する場合、最適な並列サイトは、通常、hotspotではなく、コールツリーのより高い場所に位置します。
  • 並列サイト内の 1 つ以上の並列タスク。タスクは、1 つ以上の並列スレッドでワークを分散して実行できるデータを含む、多くの時間を費やすコード領域です。
  • ロック同期。並列アプリケーションでデータアクセスの排他制御が必要な場所です。

エディターにコピーできるアノテーション付きソースコードのサンプルが用意されています。

アノテーション付きコード

目的

反復ループ、単一タスク

タスクコードがループ本体全体を含む、単純なループ構造を作成します。この一般的なタスク構造は、並列サイト内に 1 つのタスクのみ必要な場合に便利です。

ループ、1 つ以上のタスク

タスクコードがループ本体全体を含まないループ、または複数のタスク終了アノテーションを含む、特定のタスクの開始-終了境界を必要とする複雑なループやコードを作成します。この構造は、並列サイト内に複数のタスクが必要な場合にも便利です。

関数、1 つ以上のタスク

並列サイト内の複数のタスクを呼び出すコードを作成します。

収集の一時停止/再開

データ収集を一時的に停止して後から再開します。アプリケーション実行の収集が不要な部分をスキップして、収集されるデータを最小限に抑え、大きなアプリケーションの解析を高速化できます。並列サイトの外部に、これらのアノテーションを追加します。

ビルド設定

使用中の言語に固有のビルド (コンパイラーおよびリンカー) 設定を指定します。



ヒント:
タスク・アノテーションを追加する場所の選択には、試行が必要です。並列サイトが入れ子のループで、最内ループにより使用される計算時間が小さい場合、次の最外ループの前後にタスク・アノテーションを追加することを検討してください。

適合性解析の実行

適合性解析を実行する前に、[Suitability Analysis (適合性解析)] タイプで適切な [Project Properties (プロジェクト・プロパティー)] を設定していることを確認します。
[Threading Workflow (スレッド化ワークフロー)][Check Suitability (適合性のチェック)] で、Intel Advisor control: Run analysis コントロールをクリックして、アプリケーションの実行中に適合性データを収集します。
適合性レポートは、挿入されたアノテーションおよび次のような what-if モデル化パラメーターに基づいて、データの最大スピードアップを予測します。

収集した情報を使用して、スレッドによる並列化の最適な候補を選択します。

 

依存性解析の実行

依存性解析を実行する前に、[Dependencies Analysis (依存性解析)] タイプで適切な [Project Properties (プロジェクト・プロパティー)] を設定していることを確認します。(同じアプリケーションを使用しますが、可能な場合は入力データセットをより小さくします。)
[Threading Workflow (スレッド化ワークフロー)][Check Dependences (依存性のチェック)] で、Intel Advisor control: Run analysis コントロールをクリックして、アプリケーションの実行中に依存性データを収集します。予測されたスピードアップが労力に見合う場合は、収集した情報を使用して、データ共有問題を修正します。
アプリケーション・パフォーマンスの向上
このステップはオプションです。
予測されたスピードアップがスレッド並列処理をアプリケーションに追加する労力に見合うと判断した場合、次の操作を行います。

  1. 提案された並列処理の変更に関する開発者/アーキテクトによる設計およびコードレビューを完了します。
  2. インテル® スレッディング・ビルディング・ブロック (インテル® TBB)、OpenMP*、インテル® Cilk™ Plus、その他の並列フレームワークのような、アプリケーションの並列プログラミング・フレームワーク (スレッド化モデル) を選択します。
  3. ビルド環境に並列フレームワークを追加します。
  4. インテル® TBB/OpenMP* のロックやインテル® Cilk™ Plus のレデューサーのような、共有データリソースへのアクセスを同期する並列フレームワーク・コードを追加します。
  5. 並列タスクを作成する並列フレームワーク・コードを追加します。

ステップ 4 および 5 で選択した並列フレームワークから適切な並列コードを追加するとともに、インテル® Advisor のアノテーションを維持、コメントアウト、または置換することができます。