【问题标题】:What does alignment to 16-byte boundary mean in x86在 x86 中对齐 16 字节边界是什么意思
【发布时间】:2012-04-30 18:14:44
【问题描述】:

Intel's official optimization guide 有一章是关于从 MMX 命令转换为 SSE 的,其中说明了闲置状态:

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

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

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

【问题讨论】:

  • 当他们说“可能未对齐”时,他们的意思是代码在与未对齐的指针一起使用时是否需要正常工作。即你不能假设输入总是对齐的。 (Jakob 的回答涵盖了对齐地址的含义)。

标签: optimization x86 memory-alignment


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-26
        • 1970-01-01
        • 2023-03-19
        • 2016-12-19
        • 2013-05-18
        • 2017-12-21
        • 2014-09-24
        • 1970-01-01
        相关资源
        最近更新 更多