2011-04-04 11 views
5

नीचे वर्णित आदेश के संबंध में मेरे कुछ संबंधित प्रश्न हैं।मेमोरी ऑर्डरिंग और उचित प्रोग्रामिंग अभ्यास पर गारंटी

  1. इन आदेश गारंटीओं को देखते हुए मुझे कई स्थानों पर स्पष्ट बाड़ की आवश्यकता नहीं है। हालांकि, मैं विशेष रूप से जीसीसी में कंपाइलर को "बाड़" कैसे व्यक्त कर सकता हूं? यही है, प्रोग्राम ऑर्डर की गारंटी केवल तब तक लागू होती है जब ऑप्टिमाइज़र मेरे प्रोग्राम को पुन: व्यवस्थित नहीं करता है।

  2. क्या उपयोग में सामान्य/लोकप्रिय नए चिप्स हैं जिनके पास सामान्य उद्देश्य कोर हैं जो ऐसी गारंटी प्रदान नहीं करते हैं?

  3. मैं इंटरलिविंग के अपने विचार के साथ सी ++ 0x में थोड़ा उलझन में हूं। क्या मुझे इन गारंटीओं का उपयोग करने के लिए "परमाणु" वर्ग का उपयोग करना चाहिए, या क्या मसौदे में कोई अन्य पहलू है जो इन गारंटीओं का उपयोग करने का एक तरीका भी प्रदान करता है?


मेमोरी आदेश

दोनों इंटेल और एएमडी, कम से कम x86_64 के साथ, गारंटी देते हैं कि स्मृति भार दुकान एक एकल प्रोसेसर पर किया संचालन के संबंध में अनुक्रमिक हैं। यही कारण है, अगर कुछ प्रोसेसर इन दुकानों को निष्पादित करता है:

  1. स्टोर एक < - 1
  2. स्टोर बी < - 2
  3. स्टोर सी < - 3

पल कुछ अन्य प्रोसेसर देखता सी (3) यह पिछले स्टोर ए (1) और बी (2) को भी देखने की गारंटी है। अब, प्रोसेसर के बीच दृश्यता को अंतःस्थापित किया जा सकता है, लेकिन किसी दिए गए प्रोसेसर से स्टोर ऑर्डर अनुक्रमिक भी होगा।

जब प्रोसेसर 0 प्रोसेसर 1 द्वारा संग्रहीत एक मूल्य पढ़ता उन्होंने यह भी सकर्मक गारंटी देता है, तो एक मूल्य लिखते हैं, कि प्रोसेसर 2 नए मूल्य पढ़ने भी प्रोसेसर 1.

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

उत्तर

2

एसएमपी ऑपरेटिंग सिस्टम बनाने और कुछ प्रकार के हार्डवेयर के साथ संवाद करने के लिए इन प्रकार के संचालन की निपुणता आवश्यक है। लिनक्स कर्नेल दस्तावेज कर्नेल द्वारा उपयोग किए जाने वाले विशिष्ट समाधानों के साथ विषय का उत्कृष्ट अवलोकन प्रदान करता है। मैं अत्यधिक उनकी memory-barriers.txt फ़ाइल को देखने की सलाह देता हूं।

+0

यह स्थिति का एक उत्कृष्ट अवलोकन है। –

0

सबसे मजबूत गारंटी देता है कि अपने स्टोर और भार ठीक आवश्यक क्रम में निष्पादित किया जाएगा के लिए, आप अपने कोड में asm ब्लॉकों का सहारा और स्पष्ट रूप से अपने mov निर्देश को लिखने के लिए आवश्यकता हो सकती है।

+0

दुर्भाग्यवश, यह न तो आवश्यक है और न ही पर्याप्त है। जब तक उचित अवरोध निर्देशों का उपयोग नहीं किया जाता है, तब भी एक सीपीयू कोर रनटाइम पर निर्देशों को पुन: व्यवस्थित करने के लिए स्वतंत्र होगा यदि ऐसा लगता है कि यह इससे दूर हो सकता है। ये बाधाएं उच्च स्तरीय प्राइमेटिव के रूप में भी उपलब्ध हैं, जो असेंबली का सहारा लेने की आवश्यकता को अस्वीकार करती हैं। – JohannesD

+0

@ जोहान्स: उनके सवाल में उनका दावा यह है कि इंटेल लोड/स्टोर ऑर्डरिंग निर्दिष्ट करता है। अब, मैंने इसे स्वयं नहीं देखा है, लेकिन यदि वह सही है तो उसके द्वारा किए जाने वाले प्रभावों को x86 पर स्पष्ट CPU बाधाओं के बिना गारंटी दी जा सकती है। –

+0

@Zan लिंक्स: नहीं, जोहान्स डाह्लस्ट्रॉम सही है। तथ्य यह है कि _you_ किसी विशेष क्रम में चाल डालता है इसका मतलब यह नहीं है कि वे आपके बाइनरी में उस क्रम में समाप्त हो जाएंगे। ऑप्टिमाइज़र निर्देशों को स्वैप करने के लिए स्वतंत्र है, जो (x86 पर) भी वास्तविक स्टोर को स्वैप करता है। – MSalters

0

मंच अनुक्रमिक स्थिरता की गारंटी देता है, तो आप हमेशा तुल्यकालन के कुछ प्रकार दौड़ की स्थिति को रोकने के लिए की आवश्यकता होगी जब एक से अधिक थ्रेड एक ही स्मृति स्थान तक पहुंचता है और उनमें से कम से कम एक में लिखता है।- std::mutex और संबंधित वर्गों

  • परमाणु चर - std::atomic<T>
  • स्पष्ट स्मृति बाधाओं - std::atomic_thread_fence

    1. म्युचुअल बहिष्कार: C++ 0x इस तरह के तुल्यकालन को लागू करने के तीन तरीके प्रदान करता है।

    बाद के दो प्लेटफार्मों कि अनुक्रमिक स्थिरता की गारंटी नहीं देते पर एक स्मृति आदेश पैरामीटर अतिरिक्त लचीलापन की अनुमति (विशेषज्ञों के लिए केवल!) स्वीकार करते हैं, लेकिन यह 86 पर प्रासंगिक नहीं है।

  • +0

    अनुक्रमिक गारंटी * डेटा दौड़ से बचने का एक तरीका है। कम स्तर पर हम * mutex * का उपयोग नहीं कर रहे हैं क्योंकि यह बहुत महंगा है। प्रश्न एक मंच स्वतंत्र फैशन में अन्य स्मृति आदेश गारंटी की उपयोग करने के तरीके के बारे में और अधिक है। –

    +0

    'atomic_thread_fence' वह हिस्सा है जो मैं मानक में बहुत अस्पष्ट हूं। शब्द का अर्थ यह है कि आदेश केवल 'परमाणु' प्रकारों के लिए गारंटीकृत है, जो लगभग बेकार होगा। मैं इसके बारे में एक और अधिक लक्षित सवाल पूछने जा रहा हूं। –

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