gpt4 book ai didi

assembly - RMW 指令对现代 x86 是否有害?

转载 作者:行者123 更新时间:2023-12-03 15:52:27 25 4
gpt4 key购买 nike

我记得在优化 x86 的速度时,通常要避免读-修改-写指令。也就是说,你应该避免像 add [rsi], 10 这样的东西。 ,这增加了存储在 rsi 中的内存位置.建议通常是将其拆分为读取-修改指令,然后是存储,例如:

mov rax, 10
add rax, [rsp]
mov [rsp], rax

或者,您可以使用显式加载和存储以及 reg-reg 添加操作:
mov rax, [esp]
add rax, 10
mov [rsp], rax

对于现代 x86,这仍然是合理的建议吗(曾经是吗?)?1

当然,在多次使用内存中的值的情况下,RMW 是不合适的,因为您将导致冗余加载和存储。我对一个值只使用一次的情况感兴趣。

基于Godbolt的探索,所有icc、clang和gcc prefer使用单个 RMW 指令来编译如下内容:
void Foo::f() {
x += 10;
}

进入:
Foo::f():
add QWORD PTR [rdi], 10
ret

所以至少大多数编译器似乎认为 RMW 很好,当该值只使用一次时。

有趣的是,当递增的值是全局值而不是成员值时,各种编译器并不一致,例如:
int global;

void g() {
global += 10;
}

在这种情况下, gccclang仍然是单个 RMW 指令,而 icc prefers带有显式加载和存储的 reg-reg 添加:
g():
mov eax, DWORD PTR global[rip] #5.3
add eax, 10 #5.3
mov DWORD PTR global[rip], eax #5.3
ret

可能跟 RIP有关相对寻址和微融合限制?但是,icc13 仍然对 -m32 做同样的事情。所以也许这更多地与需要 32 位位移的寻址模式有关。

1我故意使用模糊的术语现代 x86 基本上是指最后几代 Intel 和 AMD 笔记本电脑/台式机/服务器芯片。

最佳答案

Are RMW instructions considered harmful on modern x86?



不。

在现代 x86/x64 上,输入指令被翻译成 uops。
任何 RMW 指令都将分解为多个 uop;实际上,将单独的指令分解为相同的 uops。

通过使用“复杂”RMW 指令而不是单独的“简单”读取、修改和写入指令,您可以获得以下内容。
  • 更少的解码指令。
  • 更好地利用指令缓存
  • 更好地利用可寻址寄存器

  • 您可以在 Agner Fog's instruction tables 中清楚地看到这一点。 .
    ADD [mem],const有 5 个周期的延迟。
    MOV [mem],reg反之亦然,每个周期有 2 个周期的延迟和一个 ADD reg,const延迟为 1,总共为 5。

    我检查了 Intel Skylake 的时间,但 AMD K10 是一样的。

    您需要考虑到编译器必须迎合许多不同的处理器,有些编译器甚至对不同的处理器系列使用相同的核心逻辑。这可能会导致非常次优的策略。

    RIP 相对寻址
    在 X64 上,RIP 相对寻址需要一个额外的周期来解析旧处理器上的 RIP。
    Skylake 没有这种延迟,我相信其他人也会消除这种延迟。
    我相信你知道 x86 不支持 EIP 相对寻址;在 X86 上,您必须以迂回的方式执行此操作。

    关于assembly - RMW 指令对现代 x86 是否有害?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38034498/

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