gpt4 book ai didi

c++ - `std::memory_order_acquire` 的语义是否需要 x86/x86_64 上的处理器指令?

转载 作者:可可西里 更新时间:2023-11-01 18:35:57 26 4
gpt4 key购买 nike

众所周知,在 x86 上,操作 load()store() 内存屏障 memory_order_consume, memory_order_acquire, memory_order_release , memory_order_acq_rel 不需要缓存和流水线的处理器指令,汇编代码始终对应于 std::memory_order_relaxed,这些限制仅对编译器的优化是必要的:http://www.stdthread.co.uk/forum/index.php?topic=72.0

这段反汇编代码为 store() (MSVS2012 x86_64) 确认了这一点:

std::atomic<int> a;
a.store(0, std::memory_order_relaxed);
000000013F931A0D mov dword ptr [a],0
a.store(1, std::memory_order_release);
000000013F931A15 mov dword ptr [a],1

但是这段代码没有为 load() (MSVS2012 x86_64) 确认这一点,使用 lock cmpxchg:

    int val = a.load(std::memory_order_acquire);
000000013F931A1D prefetchw [a]
000000013F931A22 mov eax,dword ptr [a]
000000013F931A26 mov edx,eax
000000013F931A28 lock cmpxchg dword ptr [a],edx
000000013F931A2E jne main+36h (013F931A26h)

std::cout << val << "\n";

但是 Anthony Williams said :

some_atomic.load(std::memory_order_acquire) does just drop through to a simple load instruction, and some_atomic.store(std::memory_order_release) drops through to a simple store instruction.

我哪里错了,std::memory_order_acquire 的语义需要 x86/x86_64 上的处理器指令 lock cmpxchg 还是只需要一个简单的加载指令 mov 正如 Anthony Williams 所说?

答案:与此错误报告相同:http://connect.microsoft.com/VisualStudio/feedback/details/770885

最佳答案

没有。 std::memory_order_acquire 的语义不需要 x86/x86_64 上的处理器指令。

除了 atomic.store(val, std::memory_order_seq_cst); 需要 外,x86_64 上的任何 load()/store() 操作都不需要处理器指令(锁/栅栏) (LOCK) XCHG 或替代方法:MOV(进入内存),MFENCE

x86(CAS 除外)以及 ARM 和 PowerPC 的处理器内存屏障指令:http://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html

反汇编程序 GCC 4.8.1 x86_64 - GDB - load():

    20      temp = a.load(std::memory_order_relaxed);
21 temp = a.load(std::memory_order_acquire);
22 temp = a.load(std::memory_order_seq_cst);
0x46140b <+0x007b> mov 0x38(%rsp),%ebx
0x46140f <+0x007f> mov 0x34(%rsp),%esi
0x461413 <+0x0083> mov 0x30(%rsp),%edx

反汇编程序 GCC 4.8.1 x86_64 - GDB - store():

a.store(temp, std::memory_order_relaxed);
a.store(temp, std::memory_order_release);
a.store(temp, std::memory_order_seq_cst);
0x4613dc <+0x004c> mov %eax,0x20(%rsp)
0x4613e0 <+0x0050> mov 0x38(%rsp),%eax
0x4613e4 <+0x0054> mov %eax,0x20(%rsp)
0x4613e8 <+0x0058> mov 0x38(%rsp),%eax
0x4613ec <+0x005c> mov %eax,0x20(%rsp)
0x4613f0 <+0x0060> mfence
0x4613f3 <+0x0063> mov %ebx,0x20(%rsp)

反汇编程序 MSVS 2012 x86_64 - load() - 它与此错误报告相同:http://connect.microsoft.com/VisualStudio/feedback/details/770885 :

    temp = a.load(std::memory_order_relaxed);
000000013FE51A1F prefetchw [a]
000000013FE51A24 mov eax,dword ptr [a]
000000013FE51A28 nop dword ptr [rax+rax]
000000013FE51A30 mov ecx,eax
000000013FE51A32 lock cmpxchg dword ptr [a],ecx
000000013FE51A38 jne main+40h (013FE51A30h)
000000013FE51A3A mov dword ptr [temp],eax
temp = a.load(std::memory_order_acquire);
000000013FE51A3E prefetchw [a]
000000013FE51A43 mov eax,dword ptr [a]
000000013FE51A47 nop word ptr [rax+rax]
000000013FE51A50 mov ecx,eax
000000013FE51A52 lock cmpxchg dword ptr [a],ecx
000000013FE51A58 jne main+60h (013FE51A50h)
000000013FE51A5A mov dword ptr [temp],eax
temp = a.load(std::memory_order_seq_cst);
000000013FE51A5E prefetchw [a]
temp = a.load(std::memory_order_seq_cst);
000000013FE51A63 mov eax,dword ptr [a]
000000013FE51A67 nop word ptr [rax+rax]
000000013FE51A70 mov ecx,eax
000000013FE51A72 lock cmpxchg dword ptr [a],ecx
000000013FE51A78 jne main+80h (013FE51A70h)
000000013FE51A7A mov dword ptr [temp],eax

反汇编程序 MSVS 2012 x86_64 - store():

    a.store(temp, std::memory_order_relaxed);
000000013F8C1A58 mov eax,dword ptr [temp]
000000013F8C1A5C mov dword ptr [a],eax

a.store(temp, std::memory_order_release);
000000013F8C1A60 mov eax,dword ptr [temp]
000000013F8C1A64 mov dword ptr [a],eax

a.store(temp, std::memory_order_seq_cst);
000000013F8C1A68 mov eax,dword ptr [temp]
000000013F8C1A6C xchg eax,dword ptr [a]

关于c++ - `std::memory_order_acquire` 的语义是否需要 x86/x86_64 上的处理器指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18576986/

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