在x86中,与16字节边界的对齐意味着什么

时间:2012-04-19 08:44:00

标签: optimization x86

Intel's official optimization guide有一章关于从MMX命令转换到SSE,在那里他们陈述了以下的陈述:

  

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

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

我无法理解他们的意思是“可能没有与16字节边界对齐”,你能澄清一下并举一些例子吗?

3 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我在这里猜测,但可能是“可能没有与16字节边界对齐”意味着此内存位置已经对齐到较小的值(4或8字节)之前用于其他目的和现在要在这个内存上执行SSE指令,你需要明确地将它加载到寄存器中吗?