自动矢量化对齐

Autovectorization alignment

本文关键字:对齐 矢量化      更新时间:2023-10-16

在"英特尔编译器自动矢量化指南"中,有一个与对齐有关的示例我不理解。代码是

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];

如何查看矢量化后未对准的位置?排列方式不是取决于阵列的大小吗?

Hans Passant基本上涵盖了所有正确的想法,但让我再解释一下:

假设CCD_ 1和CCD_。例如,为了举例,它们具有地址0x100和0x200。

现在,让我们看看i=3(奇数)和i=6(偶数)的代码是什么样子的。。。

a[i+1] = b[i] * 3;将执行[0x120] = [0x318] * 3(i=3,双精度为8)

a[i+1] = b[i] * 3;将执行[0x138] = [0x330] * 3

在这两种情况下,左手边或右手边都是对齐的,而另一个是未对齐的(对齐的访问总是以十六进制的0结束,未对齐的是其他内容)。

现在。。。让我们有目的地将a与一个8模16地址(比如说0x108,以保持我们的示例)不对齐。

让我们看看a0(奇数)和i=6(偶数)的代码是什么样子的。。。

a[i+1] = b[i] * 3;将执行[0x128] = [0x318] * 3(i=3,双精度为8)

a[i+1] = b[i] * 3;将执行[0x140] = [0x330] * 3

两者同时保持实际访问对齐和未对齐。