組込み開発におけるガイド付き自動並列化の利用

同カテゴリーの次の記事

インテル® Xeon Phi™ コプロセッサー向けにインテル® MKL のワーク分割を制御する方法

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Using Guided Auto-Parallelization for Embedded Development」の日本語参考訳です。


GAP の概要

インテル® コンパイラーのガイド付き自動並列化 (GAP) 機能は、コードを自動的にベクトル化および並列化するコンパイラーの機能を利用して、シリアルコードのアプリケーション・パフォーマンスを向上させるアドバイスを提供します。機能の名前には「自動並列化」という言葉が含まれていますが、パフォーマンスを向上するためコードを明示的にスレッド化する必要はありません。また、コードがスレッド化または並列化されている必要もありません。

GAP 機能を有効にするには、-guide オプションを指定します。この機能により提供されるアドバイスは選択肢であり、取り入れても、取り入れなくてもかまいません。通常、アドバイスは次の 3 つのカテゴリーに分けられます。

  • ソース変更に関するアドバイス: ループの入れ子構造やルーチンのソース変更を行うようアドバイスします。
  • プラグマの適用に関するアドバイス: プラグマのセマンティクスが満たされる場合 (確認が必要)、特定のループレベルに新しいプラグマを適用するようアドバイスします。多くの場合、コンパイラーの利点を活用できるプラグマを適用し (つまり、暗黙に新しいプラグマ/ループ・プロパティーを有効にすることで)、最適化を向上することができます。
  • コンパイラー・オプションの追加に関するアドバイス: 新しいプロパティーを有効にするコマンドライン・オプションを追加するようアドバイスします。

この記事では、インテル® System Studio に含まれるインテル® コンパイラーの GAP 機能について、コマンドラインおよび Eclipse* 統合環境での使用方法を説明します。

コマンドで GAP を使用する

  1. -guide(=n)

    GAP 機能を有効にするには、コマンドラインに “-guide(=n)” オプションを追加します。コンパイラーは、コードをビルドした後、パフォーマンスを向上させる方法に関するアドバイスを提供します。-guide オプションが指定されると、オブジェクトは生成せず解析のみを行います。

    引数 “n” はアドバイスのレベルで、1 から 4 まで指定できます。

  2. GAP を実行して自動ベクトル化、自動並列化、データ変換に関するアドバイスを出力する

    GAP は、自動ベクトル化、自動並列化、データ変換の 3 つに関するアドバイスを提供します。次のように、個別に GAP を実行することもできます。

    • -guide-vec[=n]: 自動ベクトル化のアドバイス
    • -guide-par[=n]: 自動並列化のアドバイス
    • -guide-data-trans[=n]: データ変換のアドバイス

    “-guide” と同様に、引数 “n” はアドバイスのレベルです。これらの 3 つのオプションでは、1 および 2 を指定できます。

  3. GAP の結果/メッセージをファイルに保存する

    GAP を有効にすると、コンパイラーはデフォルトで GAP メッセージをコンソール (stderr) に出力します。解析のため、GAP メッセージをファイルに保存することもできます。GAP メッセージをファイルに保存するオプションを次に示します。

    -guide-file[=filename] (または -guide-file-append[=filename])

  4. 特定のコードに GAP を実行する

    GAP オプションを指定してソースファイルをコンパイルすると、そのファイルに関するアドバイスが提供されます。プロジェクト全体で GAP を実行するには、すべてのファイルで GAP オプションを指定してコンパイルするだけですが、特定のコードに GAP を実行することもできます。”-guide-opts=string” は、特定のコードを解析して最適化を向上させるアドバイスを生成するようにコンパイラーに指示します。引数 “string” は解析するコードを示すテキストで、括弧内に指定します。次の形式で指定できます。

    • filename 
    • filename, routine 
    • filename, range [, range]… 
    • filename, routine, range [, range]…

    上記の複数の形式を指定する場合は、各形式の間にセミコロンを付けます。”filename”、”routine”、”range” オプションの詳細は、コンパイラーの「ユーザー・リファレンス・ガイド」を参照してください。

  5. 次のサンプルは、GAP を有効にしてコンパイルする方法と生成される GAP メッセージを示しています。

    #cat gap.c
    #define N 10000000
    double A[N];
    void foo(int cond1, int cond2) {
        int i, t=7;
        for (i=0; i<N; i++) {
    #ifdef TEST_GPA
            t=0;
    #endif
            if (cond1) {
                t = i+1;
            }
            if (cond2) {
                t = i-1;
            }
            A[i] = t;
        }
    }
    
    #icc gap.c -c -guide
    GAP レポート記録開始 Sat Feb 16 17:34:51 2013
    リマーク #30761: 自動並列化に関するアドバイスを取得するには -parallel オプションを追加します。
    このコンパイルセッションで出力されたアドバイスメッセージの数: 0。
    GAP レポート記録終了
    
    #icc gap.c -c -guide -parallel
    GAP レポート記録開始 Sat Feb 16 17:34:58 2013
    gap.c(6): remark #30523: (PAR) 変数 "t" に、ループ本体の最初 (行 6) で値を代入します。 これにより、ループが並列化されます。 [確認] プログラムにおいてループの各反復で変数 "t" の読み込みを行う場合、変数はその反復以前に定義されていなければなりません。 [別の方法] "#pragma parallel private(t)" を使用してループを並列化します。 [確認] 前述の条件をすべて満たしていなければなりません。
    このコンパイルセッションで出力されたアドバイスメッセージの数: 1。
    GAP レポート記録終了
    
    #icc gap.c -c -guide -parallel -DTEST_GPA
    GAP レポート記録開始 Sat Feb 16 17:35:15 2013
    このコンパイルセッションで出力されたアドバイスメッセージの数: 0。
    GAP レポート記録終了
    
    #
    

    GAP メッセージの詳細は、コンパイラーの「ユーザー・リファレンス・ガイド」を参照 (「GAP メッセージ」で検索) してください。

Eclipse* で GAP を使用する

  1. インテル® コンパイラーを Eclipse* に統合する

    Eclipse* で GAP を使用するには、インテル® コンパイラーを Eclipse* に統合する必要があります。統合方法については、「組込み開発における Eclipse* でのインテル® C++ コンパイラーの利用」(英語) を参照してください。

  2. プロジェクトの GAP 解析を実行する

    プロジェクトの GAP 解析を実行するには、次の 2 つのオプションがあります。

    1. 通常のプロジェクト・ビルドの一部として解析を実行する
      [Project (プロジェクト)] > [Properties (プロパティー)] > [C/C++ Build (C/C++ ビルド)] > [Settings (設定)] > [Compilation Diagnostics (コンパイル診断)] を選択し、[Enable Guided Auto Parallelism Analysis (ガイド付き自動並列化解析を有効にする)] ドロップダウン・リストで値を選択して解析を有効にします。次の画面を参照してください。

      GAP メッセージをファイルに保存するオプションもここに表示されます。

    2. 現在のプロジェクトに一度だけ解析を実行する

      [Intel Tools (インテル )] > [Guided Auto Parallelism (ガイド付き自動並列化)] > [Analysis project

      (プロジェクト <プロジェクト名> の解析)] を選択します。

      GAP の設定ダイアログが表示されます。

      GAP オプション (アドバイスのレベル、GAP メッセージのファイル保存など) を設定できます。[OK] をクリックすると、プロジェクトの解析が実行され、結果が Console (コンソール) ウィンドウに表示されます。

      GAP メッセージ (上記の赤の部分) をダブルクリックすると、更新すべき行にジャンプします (アドバイスにソースファイルの更新が含まれる場合)。下記の例では、gpa.c の 6 行目にジャンプし、行の前に “i” が表示されています。

  3. ファイルまたはファイル内で GAP 解析を実行する

    Eclipse* のプロジェクト・エクスプローラーまたはソース・コード・エディターから [Intel Tools (インテル ツール)] > [Guided Auto Parallelism (ガイド付き自動並列化)] コンテキスト・メニュー項目を使用して解析を実行します。

    フォルダー: プロジェクト・エクスプローラーでフォルダーを選択して右クリック
    単一ファイル: プロジェクト・エクスプローラーでファイルを選択して右クリック、またはソース・コード・エディターで右クリック
    関数: 関数名を選択して右クリック
    範囲: ソース・コード・エディターで解析する行を選択して右クリック

    注: プロジェクト・エクスプローラーでフォルダーまたはファイルを選択して、[Intel Tools (インテル ツール)] > [Guided Auto Parallelism (ガイド付き自動並列化)] > [Analysis folder/file xxx (フォルダー/ファイル xxx の解析)] を選択することもできます。メニュー項目テキストは選択している内容 (プロジェクト、フォルダー、ファイル) に応じて変わります。

    ソース・コード・エディターで解析する行を選択して右クリックした場合の例を次に示します。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事

  • インテル® System Studio を使用する理由インテル® System Studio を使用する理由 この記事は、インテル® デベロッパー・ゾーンに掲載されている「Should I use Intel® System Studio?」の日本語参考訳です。 はじめに インテル® System Studio は、インテル® […]
  • インテル® Xeon Phi™ コプロセッサーでのデバッグ: 使用例インテル® Xeon Phi™ コプロセッサーでのデバッグ: 使用例 この記事は、インテル® デベロッパー・ゾーンに掲載されている「Debugging on Intel® Xeon Phi™ Coprocessor Use Case Overview」の日本語参考訳です。 はじめに インテル® Composer XE 2013 Linux* 版に含まれるインテル® […]
  • SVEN (System Visible Event Nexus) の概要SVEN (System Visible Event Nexus) の概要 この記事は、インテル® デベロッパー・ゾーンに掲載されている「SVEN Overview」の日本語参考訳です。 SVEN とは? SVEN は、カーネル、ユーザーそしてファームウェアで実行中のユニットからのイベントをトレースして記録するための基盤と API です。SVEN は航空機のフライトを記録する “ブラックボックス” […]
  • OpenCL* による FPGA プログラミングOpenCL* による FPGA プログラミング この記事は、インテルの The Parallel Universe Magazine 31 号に収録されている、OpenCL* を利用して FPGA プログラミングに取り組むための章を抜粋翻訳したものです。 FPGA が注目されている理由 フィールド・プログラマブル・ゲート・アレイ (FPGA) […]
  • インテル® INDE によって Android アプリケーションを作成する 6 つの方法インテル® INDE によって Android アプリケーションを作成する 6 つの方法 この記事は、インテル® デベロッパー・ゾーンに公開されている「6 Ways Intel® INDE Makes the Android App a Snap」の日本語参考訳です。 私たちは、Android* […]