自動並行化と自動ベクター化
自動 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
参照
関連項目
/Qpar-report (Auto-Parallelizer Reporting Level)
/Qvec-report (Auto-Vectorizer Reporting Level)