9

英特尔的官方优化指南有一章是关于从 MMX 命令转换为 SSE 的,其中说明了闲置声明:

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

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

我无法理解“可能未与 16 字节边界对齐”是什么意思,请您澄清一下并举一些例子吗?

4

3 回答 3

16

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

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

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

于 2012-04-19T09:29:40.850 回答
0

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

于 2012-04-19T12:40:26.093 回答
-3

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

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

于 2012-04-19T08:48:07.060 回答