在 x86 中与 16 字节边界对齐是什么意思



英特尔的官方优化指南中有一章是关于从 MMX 命令转换为 SSE 的,其中陈述了休耕语句:

使用

可能未与 16 字节边界对齐的内存操作数的计算指令必须替换为未对齐的 128 位负载 (MOVDQU),然后是使用寄存器操作数的相同计算操作。

(第 5.8 章 从 64 位转换为 128 位 SIMD 整数,第 5-43 页)

我不明白他们所说的"可能不与 16 字节边界对齐"是什么意思,你能澄清一下并举一些例子吗?

某些 SIMD 指令对多个数据执行相同的指令,要求此数据的内存地址与特定字节边界对齐。这实际上意味着您的数据所在的内存地址需要被指令所需的字节数整除。

因此,在您的情况下,对齐方式是 16 字节(128 位),这意味着数据的内存地址需要是 16 的倍数。 例如,0x00010 将是 16 字节对齐,而0x00011不会。

如何对齐数据取决于您使用的编程语言(有时还有编译器)。大多数具有内存地址概念的语言也会为您提供指定对齐方式的方法。

我在这里猜测,但"可能未对齐到 16 字节边界"是否意味着此内存位置之前已对齐到较小的值(4 或 8 字节)用于其他目的,现在要在此内存上执行 SSE 指令,您需要将其显式加载到寄存器中?

在 16 字节边界上对齐的数据将具有偶数的内存地址 - 严格来说,是 2 的倍数。每个字节为 8 位,因此要在 16 字节边界上对齐,您需要对齐每组两个字节。

同样,在 32 位(4 字节

)边界上对齐的内存地址将具有 4 的倍数的内存地址,因为您将四个字节组合在一起以形成一个 32 位字。

最新更新