自動ベクトル化を制限または抑制する要因

Table 7 に、ループの自動ベクトル化を制限または抑制する要因を示します。

Table 7. 自動ベクトル化を制限または抑制する要因

抑制要因影響が及ぶ範囲
有効な NEON コンパイラライセンスがないNEON 命令を生成するには、有効な NEON コンパイラライセンスが必要です。
ソースコードにループがない自動ベクトル化には、ループの分析が含まれます。ループがない場合、自動ベクトル化を適用することはできません。
ターゲットプロセッサNEON 命令を生成するには、ターゲットプロセッサ(--cpu)が NEON の機能を備えている必要があります。このようなプロセッサには、Cortex-A8 や Cortex-A9 があります。
浮動小数点コード浮動小数点コードは常に自動的にベクトル化されるとは限りません。例えば、再関連付けが必要なループは、--fpmode fast を使用したコンパイル時にのみベクトル化されます。
デフォルトの --no_vectorizeデフォルトでは、C または C++ コードからの NEON ベクタ命令の直接的な生成は無効になっているため、--vectorize を使用してこれを有効にする必要があります。
-Otime が指定されない実行時間を短縮し、ループを有効にしてベクトル化を行うためには、-Otime を指定する必要があります。
-Onum の設定レベルが低い設定する最適化レベルは、-O2 または -O3 である必要があります。-O0 または -O1 のレベルでは、ループはベクトル化されません。
不正な結果の可能性不正な結果の可能性がある場合、その可能性がある箇所にはベクトル化は適用されません。自動ベクトル化に適するように、手作業でコードを調整する必要があります。
手作業による事前のコードの最適化の試み手作業による事前のコードの最適化の試みは、自動ベクトル化を妨げる要因になります。例えば、ソースコードの手作業によるループ展開や複雑な配列アクセスが該当します。
ベクタアクセスパターンがないループの変数がベクタアクセスパターンを持たない場合、コンパイラは自動的にループをベクトル化できません。
ループの異なる繰り返しの間でのデータの依存関係配列の使用や格納がループの異なる繰り返しのときにオーバーラップしている可能性がある場合は、データの依存関係の問題が存在します。オペレーションのベクタ順序によって結果が変化する可能性がある場合は、ループを安全にベクトル化することはできないため、コンパイラはループを元の形式のまま残すか、またはループの一部のみをベクトル化します。
メモリ階層メインメモリから取得した大規模なデータセット上で比較的少ない算術演算を実行することは、システムのメモリ帯域幅によって制限されます。ほとんどのプロセッサでは、メモリの帯域幅とプロセッサの容量とのバランスが相対的に取れていません。これにより、自動ベクトル化処理に悪影響を及ぶことがあります。
ループの開始時点で繰り返し回数が固定されていない自動ベクトル化のためには、一般的に、ループの開始時に繰り返し回数が固定される単純なループを記述することが最善です。ループの繰り返し回数が固定されていない場合は、アドレス指定は不可能です。
ループからの条件付き終了ループからの条件付き終了を含まないループを記述することが最善です。
キャリーアラウンドスカラ変数キャリーアラウンドスカラ変数は、ループの 1 つのパスで計算された値が次のパスに繰り越されるので自動ベクトル化にとって問題になります。
__promise(expr) が使用されていない自動ベクトル化に違いをもたらすことができる場合に __promise(expr) を使用しないと、自動ベクトル化が制限されることがあります。
ポインタのエイリアス生成ポインタのエイリアス生成は、自動的にベクトル化されたコードの使用を抑制します。
間接アドレス指定NEON ユニットで処理できるのはメモリ内に連続して格納されるベクタだけなので、間接アドレス指定はベクトル化できません。
構造体の異なる部分へのアクセスが別個のループに分かれている自動ベクトル化を行うには、構造体の各部分に対して同じループ内でアクセスする必要があります。
構造体の各メンバの長さが一貫していない構造体の各メンバの長さがすべて同じでない場合、コンパイラはベクタロードを使用しません。
非インライン関数の呼び出しループ内から非インライン関数を呼び出すと、ベクトル化できません。このような関数をベクトル化の対象にするには、__inline キーワードか __forceinline キーワードでマークを付ける必要があります。
if ステートメントと switch ステートメントif ステートメントと switch ステートメントが大規模に使用されている場合、自動ベクトル化の効率に影響が及ぶ可能性があります。

--diag_warning=optimizations を使用すると、ベクトル化できた(またはできなかった)部分に関するコンパイラ診断を取得できます。

Show/hide関連項目

概念
参照
Copyright © 2010 ARM. All rights reserved.ARM DUI 0472BJ
Non-ConfidentialID011811