gpt4 book ai didi

assembly - 为什么以及在哪里使用align 16来进行指令的SSE对齐?

转载 作者:行者123 更新时间:2023-12-02 20:16:57 34 4
gpt4 key购买 nike

我正在阅读 Apress 的现代 x86 汇编语言书籍。对于 64 位 SSE 示例的编程,作者将 align 16 放置到代码中的特定点。例如

    .code
ImageUint8ToFloat_ proc frame
_CreateFrame U2F_,0,64 ; helper macros to create prolog
_SaveXmmRegs xmm10,xmm11,xmm12,xmm13 ; helper macros to create prolog

_EndProlog ; helper macros to create prolog

...

shrd r8d,
pxor xmm5,xmm5

align 16 ; Why this is here ?
@@:
movdqa xmm0,xmmword ptr [rdx]
movdqa xmm10,xmmword ptr [rdx+16]

movdqa xmm2,xmm0
punpcklbw xmm0,xmm5
punpckhbw xmm2,xmm5
movdqa xmm1,xmm0
movdqa xmm3,xmm2

...

作者解释说,由于我们使用 SSE,因此有必要放置 align 16,以便指令本身对齐。没关系。我的问题是为什么作者选择将 align 16 放置到该特定位置。作为一名程序员,我应该如何决定 align 16 的正确位置?为什么不早一点或者晚一点呢?

最佳答案

没有必要。偶尔还是有好处的。

现代处理器以 16 个字节(或者可能是 32 个字节,AMD 做了奇怪的事情)为单位获取代码。当然,对齐。如果你跳转到这样一个 block 的末尾附近,你就会浪费大部分的取指,并且在那个周期中你只解码 1 个或许多 0 指令。这是一个巨大的浪费,所以最好跳到一个 block 的开头。

这并不总是重要的,例如代码是否位于循环缓冲区或 µop 缓存(如果存在)中。通常,几乎所有循环都适合 µops 缓存,在早于 SandyBridge 的处理器上,很容易创建不适合循环缓冲区的循环,这使得获取吞吐量变得很重要。即使循环可以放入循环缓冲区,对齐仍然对 Core2 有帮助,因为未对齐实际上使循环缓冲区变小(它基于 16 字节代码块,在预解码后缓存)。还有一些更奇怪的细节,但都是关于古代微拱的,所以我会跳过它。关键是,在像 Nehalem 或更早的 µarch 上,您应该经常对齐循环。

虽然从片段来看不是很清楚,但看起来他们已经对齐了一个它将循环回的标签。所以它正在对齐循环。这对于现代 µarch 来说并不重要。

关于assembly - 为什么以及在哪里使用align 16来进行指令的SSE对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39614017/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com