2015-04-28 7 views
5

इस https://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html के अनुसार, एक जारी की दुकान MOV (स्मृति में) के रूप में कार्यान्वित किया जाता है।क्या एमओवी x86 निर्देश एक सी ++ 11 memory_order_release परमाणु स्टोर लागू करता है?

उसकी http://en.cppreference.com/w/cpp/atomic/memory_order

memory_order_release के अनुसार:

इस स्मृति आदेश के साथ एक दुकान कार्रवाई निष्पादित रिहाई आपरेशन: कोई स्मृति वर्तमान सूत्र में पहुँचता इस स्टोर के बाद पुनर्क्रमित जा सकता है। इससे यह सुनिश्चित होता है कि मौजूदा धागा में सभी राईट अन्य सूत्र है कि एक ही परमाणु उपभोग में दिखाई देने लगते हैं अन्य धागे कि अधिग्रहण या एक ही परमाणु चर और लिखते हैं कि परमाणु चर में एक निर्भरता ले में दिखाई दे रहे हैं।

मैं समझता हूँ कि जब memory_order_release प्रयोग किया जाता है, सभी स्मृति पहले किया भंडार इस एक से पहले खत्म करना चाहिए।

int a; 
a = 10; 
std::atomic<int> b; 
b.store(50, std::memory_order_release); // i can be sure that 'a' is already 10, so processor can't reorder the stores to 'a' and 'b' 

प्रश्न: कैसे यह है कि केवल MOV अनुदेश इस व्यवहार के लिए पर्याप्त है संभव है? एमओवी प्रोसेसर को पिछले सभी स्टोरों को खत्म करने के लिए कैसे कहता है?

+1

आप "x86" – Cubbi

+0

@ कब्बी का उल्लेख करना भूल गए: दाएं, यह महत्वपूर्ण है, – Krab

+0

किया गया क्योंकि यह एक गतिशील अनुसूचित आईएसए है, चिप हमेशा सबसे खराब मामला मानता है। – user3528438

उत्तर

3

, मानचित्रण होने के लिए कम से कम इंटेल संकलक, मैं कहाँ देख के साथ संकलित कोड में प्रदर्शित करता है कि: कोड के लिए

0000000000401100 <_Z5storeRSt6atomicIiE>: 
    401100:  48 89 fa    mov %rdi,%rdx 
    401103:  b8 32 00 00 00   mov $0x32,%eax 
    401108:  89 02     mov %eax,(%rdx) 
    40110a:  c3      retq 
    40110b:  0f 1f 44 00 00   nopl 0x0(%rax,%rax,1) 

0000000000401110 <_Z4loadRSt6atomicIiE>: 
    401110:  48 89 f8    mov %rdi,%rax 
    401113:  8b 00     mov (%rax),%eax 
    401115:  c3      retq 
    401116:  0f 1f 00    nopl (%rax) 
    401119:  0f 1f 80 00 00 00 00 nopl 0x0(%rax) 

:

#include <atomic> 
#include <stdio.h> 

void store(std::atomic<int> & b) ; 

int load(std::atomic<int> & b) ; 

int main() 
{ 
    std::atomic<int> b ; 

    store(b) ; 

    printf("%d\n", load(b)) ; 

    return 0 ; 
} 

void store(std::atomic<int> & b) 
{ 
    b.store(50, std::memory_order_release) ; 
} 

int load(std::atomic<int> & b) 
{ 
    int v = b.load(std::memory_order_acquire) ; 

    return v ; 
} 

वर्तमान Intel architecture documents, खंड 3 (सिस्टम प्रोग्रामिंग गाइड), यह एक अच्छा काम है जो इसे समझाता है। देखें: पी 6 में

8.2.2 मेमोरी आदेश और अधिक हाल प्रोसेसर परिवार

  • पुस्तकें अन्य पढ़ता साथ पुनर्क्रमित नहीं कर रहे हैं।
  • लिखता बड़े पढ़ता साथ पुनर्क्रमित नहीं कर रहे हैं।
  • स्मृति को लिखता अन्य लेखन के साथ पुनर्क्रमित नहीं कर रहे हैं निम्नलिखित अपवादों के साथ: ...

पूर्ण स्मृति मॉडल वहाँ समझाया गया है। मुझे लगता है था कि इंटेल और सी ++ मानक लोगों विस्तार से मिलकर कार्य किया है स्मृति आदेश संभव संचालन से प्रत्येक के लिए सबसे अच्छा मानचित्रण जकड़ना करने के लिए उस के साथ स्मृति मॉडल माप 3 में वर्णित के अनुरूप है, और सादे दुकानों और भार निर्धारित किया गया उन मामलों में पर्याप्त होना।

ध्यान दें कि सिर्फ इसलिए कि कोई विशेष निर्देश इस के लिए आवश्यक हैं x86-64 पर दुकान का आदेश दिया, इसका मतलब यह नहीं है कि सार्वभौमिक सच हो जाएगा। Powerpc के लिए मैं स्टोर के साथ lwsync निर्देश की तरह कुछ देखने की उम्मीद करता हूं, और hpux (ia64) पर संकलक st4.rel निर्देश का उपयोग करना चाहिए।

4

एक स्मृति (सीपीयू द्वारा किया जाता) रन-टाइम में आदेश देने नहीं है और वहाँ संकलन समय पर एक स्मृति आदेश है। memory_order_release संकलक को डेटा तक पहुंचने से रोकने में मदद करता है।अधिक जानकारी के लिए कृपया this article (और उस ब्लॉग पर कई अन्य अच्छे लोगों को भी पढ़ें) पढ़ें।

संबंधित मुद्दे