3.13 キャリーアラウンドスカラ変数とベクトル化

使用され、ループ内で設定されるスカラ変数は、ベクトル化で問題を引き起こす可能性があります。

ループ内で使用されるが設定されないスカラ変数は、ベクタレジスタの各位置で複製され、その複製がベクタ計算で使用されます。
設定され、ループ内で使用されるスカラは、ベクタに昇格されます。一般的に、これらの変数はループ内で一時的なスカラ値を保持し、一時的なベクタ値を保持する必要があります。以下の例では、x使用されたスカラであり、y昇格されたスカラです。
ベクトル化可能なループ:
float a[99], b[99], x, y;
int i, n;
...
for (i = 0; i < n; i++)
{
    y = x + b[i];
    a[i] = y + 1/y;
};
使用され、ループ内で設定されるスカラは、キャリーアラウンドスカラと呼ばれます。これらの変数は、ループの 1 つのパスで計算された値が次のパスに繰り越されるのでベクトル化にとって問題になります。以下の例の x は、キャリーアラウンドスカラです。
ベクトル化不可能なループ
float a[99], b[99], x;
int i, n;
...
for (i = 0; i < n; i++)
{
    a[i] = x + b[i];
    x = a[i] + 1/x;
};
関連する概念
3.17 条件付き終了の非ベクトル化
3.16 ポインタおよび間接アドレス指定を含むループの非ベクトル化
3.15 ポインタを含むループのベクトル化
3.14 ベクタのスカラへの縮退
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.