Intel のCompiler Autovectorization Guideから、私が理解できないアライメントに関連する例があります。コードは
double a[N], b[N];
...
for(i = 0; i < N; i++)
a[i+1] = b[i] * 3;
そしてそれは言う
両方の配列の最初の要素が 16 バイト境界でアラインされている場合、ベクトル化の後に、bからのアラインされていない要素のロードまたはaへの要素のアラインされていないストアのいずれかを使用する必要があります。ただし、プログラマーは以下に示すアライメントを強制することができます。これにより、ベクトル化後に 2 つのアライメントされたアクセス パターンが生成されます (double のサイズが 8 バイトであると仮定)。
_declspec(align(16, 8)) double a[N];
_declspec(align(16, 0)) double b[N];
ベクトル化後にミスアライメントが発生する場所を確認する方法は? アラインメントは配列のサイズに依存しませんか?