从 Intel 的Compiler Autovectorization Guide中有一个我不理解的与对齐相关的示例。代码是
double a[N], b[N];
...
for(i = 0; i < N; i++)
a[i+1] = b[i] * 3;
它说
如果两个数组的第一个元素在 16 字节边界对齐,则必须在矢量化之后使用来自b的未对齐元素加载或将元素未对齐存储到a中。但是,程序员可以强制执行如下所示的对齐方式,这将在向量化之后产生两个对齐的访问模式(假设双精度数为 8 字节)
_declspec(align(16, 8)) double a[N];
_declspec(align(16, 0)) double b[N];
如何查看矢量化后的错位在哪里?对齐方式不取决于数组的大小吗?