SSE向量化与内存对齐的关系

Posted

技术标签:

【中文标题】SSE向量化与内存对齐的关系【英文标题】:Relationship between SSE vectorization and Memory alignment 【发布时间】:2013-02-12 00:25:04 【问题描述】:

为什么我们需要为 SSE/AVX 对齐内存?

我经常得到的答案之一是对齐的内存加载比未对齐的内存加载快得多。那么,为什么这种对齐的内存加载比未对齐的内存加载要快得多?

【问题讨论】:

【参考方案1】:

这不仅仅特定于 SSE(甚至 x86)。在大多数架构上,加载和存储需要自然对齐,否则它们要么 (a) 生成异常,要么 (b) 需要两个或更多周期加上一些修复,以便透明地处理未对齐的加载/存储。在 x86 上,(b) 适用于

您可能想知道:为什么不使用这些 SSE 加载/存储指令的未对齐版本而不考虑对齐方式?答案是这些指令通常比对齐的指令慢得多,因为它们通常按照上述 (b) 的方式运行,这使得它们通常慢 2 倍或更多,除了最近的 Intel CPU,如 Core i7,其惩罚要小得多,但并非微不足道。

【讨论】:

请记住,即使在未对齐访问通常很快的现代内核上,跨页访问仍然很慢。如果您的缓冲区足够大且未对齐,它将包含页面交叉。 正确,并且由于未对齐的负载而跨越缓存行边界会导致更大的缓存占用空间,这也可能对性能产生负面影响。 好的,但是,为什么?我喜欢这个答案,但为什么会发生所有这些性能命中和缓存错误注册?换句话说,对齐解决了什么问题? @codekaizen:与所有事物一样,硬件设计涉及妥协——对于 CPU,这通常意味着在硅区域的有限资源与功能之间进行权衡。支持任意数据对齐需要大量的芯片来实现,并且可能不是一个特别有用的功能 - 芯片可以用于更有益的东西,比如另一个 ALU。

以上是关于SSE向量化与内存对齐的关系的主要内容,如果未能解决你的问题,请参考以下文章

初始化为“float[10][10]”的数组是不是已经为 SIMD/SSE 对齐内存?

SSE 向量重新对齐?

内存没有正确对齐?

C/C++获得对齐的内存的跨平台解决方案

C/C++获得对齐的内存的跨平台解决方案

C++ SSE:存储到数组后的未定义行为