3.16 ポインタおよび間接アドレス指定を含むループの非ベクトル化

間接アドレス指定は NEON ユニットではベクトル化できません。

間接アドレス指定は、配列が値のベクタによってアクセスされる場合に発生します。配列がメモリからフェッチされている場合、その操作は収集と呼ばれます。配列がメモリに格納される場合は、その操作は分散と呼ばれます。
以下の例では、a は分散され、b は収集されています。
float a[99], b[99];
int ia[99], ib[99], i, n, j;
...
for (i = 0; i < n; i++) a[ia[i]] = b[j + ib[i]];
NEON ユニットで処理できるのはメモリ内に連続して格納されるベクタだけなので、間接アドレス指定はベクトル化できません。ループ内に間接アドレス指定および重要な計算が存在する場合は、間接アドレス指定を別のベクタ以外のループに移動すると効率性が増します。これによって、計算を効率的にベクトル化できます。
関連する概念
3.17 条件付き終了の非ベクトル化
3.15 ポインタを含むループのベクトル化
3.14 ベクタのスカラへの縮退
3.13 キャリーアラウンドスカラ変数とベクトル化
3.12 コードをベクトル化するときのデータの依存関係による競合
3.9 NEON ベクトル化によるパフォーマンスに影響を与える要因
関連する参考文書
3.11 ベクトル化のために推奨されるループ構造
3.10 NEON ベクトル化によるパフォーマンスの目標
8.192 --vectorize、--no_vectorize
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.