| |||
Home > NEON ベクトル化コンパイラの使用 > キャリーアラウンドスカラ変数とベクトル化 |
ループ内で使用されるが設定されないスカラ変数は、ベクタレジスタの各位置で複製され、その複製がベクタ計算で使用されます。
設定され、ループ内で使用されるスカラは、ベクタに昇格されます。一般的に、これらの変数はループ内で一時的なスカラ値を保持し、一時的なベクタ値を保持する必要があります。Example 5 内で、x
は使用されたスカラであり、y
は昇格されたスカラです。
Example 5. ベクトル化可能なループ
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 つのパスで計算された値が次のパスに繰り越されるのでベクトル化にとって問題になります。Example 6 の x
は、キャリーアラウンドスカラです。
Example 6. ベクトル化不可能なループ
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; };
『コンパイラリファレンス』: