次の方法で共有


自動並行化と自動ベクター化

自動 Parallelizer と自動 Vectorizer コードのループに自動パフォーマンスが向上するようにデザインされています。

自動Parallelizer

/Qpar のコンパイラ スイッチは、コードのループで 自動並列化を 有効にします。既存のコードを変更せずにこのフラグを指定すると、並列化の余地があるループを検索するコードを評価します。つまり、多くの処理を行わずし、並列化を利用せず、不要な並列化を処理するアップグレードする代わりに、パフォーマンスを遅らせが多くなるスレッド プール、追加の同期、またはそのほかの作成方法を生成できるため、ループを見つける可能性があるため、コンパイラは並列化するループのオプションで保守的です。たとえば、ループの上限の境界がコンパイル時に不明次の例を使用して:

void loop_test(int u) {
   for (int i=0; i<u; ++i)
      A[i] = B[i] * C[i];
}

u が小さい値である場合があるため、コンパイラは自動的にこのループを並列化されません。ただし、u は常に大きいことがわかっているため、並列アウトが必要な場合もあります。自動並列化を有効にするには、n が並列化されるスレッドの数である #pragma のループ (hint_parallel (n))を指定します。次の例では、コンパイラは 8 種類のスレッド間でループを並列化を試みます。

void loop_test(int u) {
#pragma loop(hint_parallel(8))
   for (int i=0; i<u; ++i)
      A[i] = B[i] * C[i];
}

すべての プラグマ ディレクティブと同様に、代替のプラグマの構文 __pragma(loop(hint_parallel(n))) もできます。

は、にする場合は、コンパイラが並列化することのできないループがあります。:例を次に示します。

#pragma loop(hint_parallel(8))
for (int i=0; i<upper_bound(); ++i)
    A[i] = B[i] * C[i];

呼び出すたびに関数 upper_bound() が変更されることがあります。上の境界を特定することができないため、コンパイラはこのループを並列化する理由できない理由を説明する診断メッセージを生成できます。次の例は、コマンド プロンプトで、各コマンド ライン オプションの出力をコンパイラを使用するように並列化できるループを並列化できないループ コンパイラの構文です:示します。

int A[1000];
void test() {
#pragma loop(hint_parallel(0))
    for (int i=0; i<1000; ++i) {
        A[i] = A[i] + 1;
    }

    for (int i=1000; i<2000; ++i) {
        A[i] = A[i] + 1;
    }
}

このコマンドを使用してコンパイル:

cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:1

この出力を生成します:

--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized

このコマンドを使用してコンパイル:

cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:2

この出力を生成します:

--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized
d:\myproject\mytest.cpp(4) : loop not parallelized due to reason '1008'

/Qpar-report (Auto-Parallelizer Reporting Level) の 2 個の各オプションの間の出力の違いに注意してください。/Qpar-report:1 が正常に並列化してループにのみ parallelizer のメッセージを出力します。/Qpar-report:2 は成功例と失敗なループの parallelizations の parallelizer のメッセージを出力します。

理由コードとメッセージの詳細については、Vectorizer and Parallelizer Messagesを参照してください。

自動Vectorizer

自動 Vectorizer 可能であれば、コードのループを分析し、コンピューター上でベクター レジスタおよび命令を実行します。これは、コードのパフォーマンスが向上します。コンパイラは、AMD プロセッサまたは SSE2 命令、ARM プロセッサ ネオン命令を対象とします。自動 Vectorizer は、新しい関数を使用します SSE4.2 命令セットのコンピューター サポートします。

既定では、自動 Vectorizer が有効になります。ベクター化の対象のコードのパフォーマンスを比較する場合は、特定のループのベクター化を無効にするには #pragma のループ (no_vector) を使用できます。

#pragma loop(no_vector)
for (int i = 0; i < 1000; ++i)
   A[i] = B[i] + C[i];

すべての プラグマ ディレクティブと同様に、代替のプラグマの構文 __pragma(loop(no_vector)) もできます。

自動 Parallelizer と同様に、または、正常に関係 vectorized ループ**/Qvec-report:2いずれかに vectorized ループ/Qvec-report:1**だけ正常に報告する /Qvec-report (Auto-Vectorizer Reporting Level) のコマンド ライン オプションを指定できます。

理由コードとメッセージの詳細については、Vectorizer and Parallelizer Messagesを参照してください。

実際 vectorizer がどのように動作するかを示す例については、" "を参照してください 6 プロジェクトのオースティンのパート2: ページの Karl

参照

関連項目

loop

/Qpar (自動並行化)

/Qpar-report (Auto-Parallelizer Reporting Level)

/Qvec-report (Auto-Vectorizer Reporting Level)

その他の技術情報

ネイティブ コードでの並列プログラミング

Vectorizer and Parallelizer Messages