2012-01-15 27 views
5

मान लें कि x86 CPU0 और CPU1 पर क्रमशः दो धागे चल रहे हैं। थ्रेड CPU0 पर चल कार्यान्वित निम्न कमांड:x86 पर दो परिणामी सीपीयू स्टोर ऑर्डर रखने वाले कैश में फंस गए हैं?

A=1 
B=1 

कैश लाइन युक्त शुरू में CPU1 द्वारा और युक्त बी CPU0 के स्वामित्व में है जिसका स्वामित्व।

  1. अगर मैं सही ढंग से समझ, दोनों दुकानों सीपीयू की दुकान बफर में रखा जाएगा:

    मैं दो प्रश्न हैं। हालांकि, पहली स्टोर A=1 सीपीयू 1 के कैश को अमान्य किया जाना चाहिए जबकि दूसरी दुकान B=1 तुरंत फ्लश किया जा सकता है क्योंकि CPU0 में कैश लाइन है। मुझे पता है कि x86 CPU स्टोर ऑर्डर का सम्मान करता है। क्या इसका मतलब है कि A=1 से पहले कैश में नहीं लिखा जाएगा?

  2. CPU1 में मान लें निम्न कमांड क्रियान्वित कर रहे हैं:

जबकि (बी = 0);
प्रिंट एक

यह काफी CPU0 में A=1 और B=1 जो sfence जोड़ने हो 1 हमेशा 86 पर बाहर मुद्रित करने के लिए बिना CPU1 में while और print आदेशों के बीच केवल lfence जोड़ने के लिए है?

while (B=0); 
lfence 
print A 
+0

भले ही x86 इसकी गारंटी देता है, जोखिम क्यों लें? क्यों न केवल सही बाधाओं का उपयोग करें? –

+1

ज़ैन, यदि सीपीयू इसकी गारंटी देता है तो यह कई स्थानों पर लाभ का हो सकता है। उदाहरण के लिए स्पिनलॉक्स को कर्नेल में किसी भी लॉक उपसर्ग का उपयोग किए बिना कार्यान्वित किया जाता है क्योंकि वे इसे बर्दाश्त कर सकते हैं। और बाड़ इस सवाल का हल नहीं है अन्यथा, किसी को उचित लॉक का उपयोग करने की आवश्यकता है। – Saurabh

+0

** 1-सेंट प्रश्न का उत्तर - हाँ **। ** 2-nd प्रश्न का उत्तर - हां, लेकिन केवल असेंबलर में (सी/सी ++ में नहीं) **। जैसा कि सही कहा गया है, x86 पर यहां 'LFENCE' की आवश्यकता नहीं है - यह स्वचालित रूप से स्थिरता प्रदान करता है। ध्यान दें कि x86 CPU 'लोड' और किसी भी अगले निर्देश को पुन: व्यवस्थित नहीं कर सकता है, लेकिन सी/सी ++ इसे पुन: व्यवस्थित कर सकता है। सी ++ पर आपने उपयोग को ढाल दिया ** स्थिरता प्राप्त करें **: 'बाहरी std :: परमाणु बी; '' जबकि (बीलोड (std :: memory_order_acquire) == 0); '' std :: cout << ए; ' http://en.cppreference.com/w/cpp/atomic/memory_order – Alex

उत्तर

8

x86 में, एक प्रोसेसर द्वारा लिखित सभी प्रोसेसर द्वारा उसी क्रम में लिखा जाता है। आपके उदाहरण में बाड़ लगाने की आवश्यकता नहीं है, न ही x86 पर किसी भी सामान्य कार्यक्रम में। आपका प्रोग्राम:

while(B==0); // wait for B == 1 to become globally observable 
print A;  // now, A will always be 1 here 

कैश में वास्तव में क्या होता है मॉडल विशिष्ट है। कैश में सभी प्रकार की चाल और सट्टा व्यवहार हो सकता है, लेकिन देखने योग्य व्यवहार हमेशा नियमों का पालन करता है।

इंटेल सिस्टम प्रोग्रामिंग गाइड वॉल्यूम 3 सेक्शन 8.2.2 देखें। मेमोरी ऑर्डरिंग के विवरण के लिए।