自动矢量化对齐
Autovectorization alignment
在"英特尔编译器自动矢量化指南"中,有一个与对齐有关的示例我不理解。代码是
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,以保持我们的示例)不对齐。
让我们看看a
0(奇数)和i=6
(偶数)的代码是什么样子的。。。
a[i+1] = b[i] * 3;
将执行[0x128] = [0x318] * 3
(i=3,双精度为8)
或
a[i+1] = b[i] * 3;
将执行[0x140] = [0x330] * 3
两者同时保持实际访问对齐和未对齐。
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 普通环路未使用gcc 4.8.5自动矢量化
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 处理双数组中未对齐的部分,对其余部分进行矢量化
- 在 clon 中对函数进行矢量化
- 如何在C++中对循环进行矢量化
- VC++ 不再使用基于范围的语法对简单 FOR 循环进行矢量化
- 如何使用函子对循环进行矢量化
- 正在尝试对随机[1-100000]长度的矢量进行子矢量化
- C++对矢量中的一个矢量进行矢量化
- 我可以只对代码的一部分启用矢量化吗
- 如何使用矢量类对 C++ 代码进行矢量化