簡體   English   中英

`std :: memory_order_acquire`的語義是否需要x86 / x86_64上的處理器指令?

[英]Does the semantics of `std::memory_order_acquire` requires processor instructions on x86/x86_64?

眾所周知,在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  

但是這段代碼並沒有使用lock cmpxchg來確認load()MSVS2012 x86_64 ):

    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";

安東尼威廉姆斯說

some_atomic.load(std :: memory_order_acquire)只是簡單地加載一個簡單的加載指令 ,some_atomic.store(std :: memory_order_release)直接轉到一個簡單的存儲指令。

我錯在哪里,並且std::memory_order_acquire的語義std::memory_order_acquire需要x86 / x86_64上的處理器指令lock cmpxchg或只需要一個簡單的加載指令mov作為安東尼威廉姆斯?

答案:它與此錯誤報告相同: http//connect.microsoft.com/VisualStudio/feedback/details/770885

std::memory_order_acquire的語義不需要x86 / x86_64上的處理器指令。

x86_64上的任何load()/ store()操作都不需要處理器指令(鎖定/柵欄)精確的atomic.store(val, std::memory_order_seq_cst); 需要(LOCK) XCHG或替代: MOV (into memory),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]  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM