3.6 自動ベクトル化

自動ベクトル化では、ユーザコードのループの高度な分析が行われます。これは、標準のコードの大部分を NEON ユニットの機能にマップする最も効果的な方法です。

多くのコードでは、アルゴリズムに依存する小規模の並列処理による利点は、そのような並列処理が可能な場合の自動分析のコストに比べて非常に小さなものです。このため、NEON ユニットは、ループベースの並列処理対象として設計されています。
ベクトル化は、最適化されたコードから得られる結果がベクトル化されないコードの結果と同じになるように実行されます。場合によっては、不正な結果が生じる可能性を排除するために、ループのベクトル化は実行されません。このような場合は準最適なコードになるため、自動ベクトル化に適するように手作業でコードを調整する必要があります。
多くの場合、ソースコードの手作業によるループ展開や複雑な配列アクセスなど、手作業による事前のコードの最適化の試みも、自動ベクトル化を妨げる要因になります。最適な結果を得るための最善の方法は、コンパイラが最適化を実行できるように、単純なループを使用してコードを記述することです。手作業による最適化が行われた従来のコードでは、元のアルゴリズムに基づいて、単純なループを使用してコードの問題部分を書き直すほうが容易であることがあります。
明示的な NEON 命令を記述する代わりに、NEON 拡張機能を使用してベクトル化可能なループをコーディングすると、プロセッサ間のコードの移植性が保たれます。手作業でコーディングしたベクトル化と同等のパフォーマンスレベルをより簡単に達成できます。
関連する概念
3.8 ストライドパターンとデータアクセス
3.9 NEON ベクトル化によるパフォーマンスに影響を与える要因
3.12 コードをベクトル化するときのデータの依存関係による競合
3.13 キャリーアラウンドスカラ変数とベクトル化
3.14 ベクタのスカラへの縮退
3.15 ポインタを含むループのベクトル化
3.16 ポインタおよび間接アドレス指定を含むループの非ベクトル化
3.17 条件付き終了の非ベクトル化
3.18 ベクトル化可能なループ繰り返し回数
3.19 __promise(expr) によるコンパイラへのループ繰り返し回数の指定
3.20 ベクトル化のための構造体アクセスのグループ化
3.21 ベクトル化と struct メンバの長さ
3.22 ループ内からの非インライン関数への関数呼び出しの非ベクトル化
3.23 条件付きステートメントと効率的なベクトル化
3.25 ベクトル化可能なコードの例
3.26 DSP のベクトル化可能なコードの例
関連する参考文書
8.192 --vectorize、--no_vectorize
3.7 ベクトル化可能なループ内のデータ参照
3.10 NEON ベクトル化によるパフォーマンスの目標
3.11 ベクトル化のために推奨されるループ構造
3.27 自動ベクトル化を制限または抑制する要因
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.