2010-07-14 19 views
9

सीपीयू जैसे x86 पर, जो कैश कोहिर प्रदान करता है, यह व्यावहारिक परिप्रेक्ष्य से कैसे उपयोगी है? मैं समझता हूं कि विचार सभी कोरों पर तुरंत दिखाई देने वाले कोर पर मेमोरी अपडेट करना है। यह एक उपयोगी संपत्ति है। हालांकि, असेंबली भाषा में लिखने पर कोई भी इस पर भरोसा नहीं कर सकता है, क्योंकि संकलक रजिस्टरों में परिवर्तनीय असाइनमेंट स्टोर कर सकता है और उन्हें स्मृति में कभी नहीं लिख सकता है। इसका मतलब है कि किसी को भी यह सुनिश्चित करने के लिए स्पष्ट कदम उठाने चाहिए कि वर्तमान धागे में अन्य धागे में किए गए सामान दिखाई दे रहे हैं। इसलिए, व्यावहारिक परिप्रेक्ष्य से, कैश कोहिरेंसी क्या हासिल हुई है?कैश कोहेरेंसी का क्या मतलब है?

उत्तर

6

कल्पना कीजिए कि आप ऐसा करते हैं:

lock(); //some synchronization primitive e.g. a semaphore/mutex 
globalint = somevalue; 
unlock(); 

अगर कोई कैश जुटना थे, कि पिछले unlock() आश्वस्त करने के लिए कि globalint अब हर जगह दिखाई दे रहे हैं, कैश coherance तुम सब करने की जरूरत है इसे करने के लिए लिखने के लिए है के साथ होता है स्मृति और हार्डवेयर को जादू करने दें। एक सॉफ्टवेयर समाधान इस बात का सामना करेगा कि कौन सी मेमोरी मौजूद है जिसमें कैश, जिस पर कोर, और किसी भी तरह से यह सुनिश्चित करते हैं कि वे परमाणु रूप से सिंक हो रहे हैं।

यदि आप सॉफ़्टवेयर समाधान ढूंढ सकते हैं तो आप एक पुरस्कार जीतेंगे जो कि कैश में मौजूद स्मृति के सभी टुकड़ों का ट्रैक रखता है, जो कि मौजूदा हार्डवेयर समाधान से अधिक कुशल है।

1

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

9

छोटी सी कहानी यह है कि गैर-कैश सुसंगत प्रणाली प्रोग्राम के लिए असाधारण रूप से कठिन होती है, खासकर यदि आप दक्षता बनाए रखना चाहते हैं - जो मुख्य कारण भी है कि आज भी अधिकांश NUMA सिस्टम कैश-सुसंगत हैं।

यदि कैश सुसंगत नहीं हैं, तो "स्पष्ट कदम" को समेकन को लागू करना होगा - स्पष्ट कदम आमतौर पर महत्वपूर्ण वर्ग/म्यूटेक्स जैसी चीजें हैं (उदाहरण के लिए सी/सी ++ में अस्थिर पर्याप्त है)। यह बहुत मुश्किल है, अगर म्यूटेक्स जैसी सेवाओं के लिए असंभव नहीं है, तो केवल उन स्मृतियों का ट्रैक रखने के लिए जो सभी बदलावों में परिवर्तन और अद्यतन होने की आवश्यकता है- शायद उन्हें सभी स्मृति को अपडेट करना होगा, और यह है कि यह ट्रैक भी कर सकता है किस कोर में उनके कैश में उस स्मृति के टुकड़े होते हैं।

अनुमानित हार्डवेयर मेमोरी पतों/श्रेणियों को बदलने के लिए एक बेहतर और कुशल नौकरी कर सकता है जो उन्हें बदला गया है, और उन्हें सिंक में रखें।

और, कोर 1 पर चलने वाली प्रक्रिया की कल्पना करें और उसे छूट दी जाए। जब इसे फिर से निर्धारित किया जाता है, तो इसे कोर 2 पर निर्धारित किया जाता है।

यह कैश नहीं थे क्योंकि यह कैश नहीं थे क्योंकि अन्यथा कोर 1 के कैश में प्रक्रिया डेटा के अवशेष हो सकते हैं, जो कि नहीं है कोर 2 के कैश में मौजूद है। हालांकि, इस तरह से काम करने वाली प्रणालियों के लिए, ओएस को कैश कोहेरेंसी को लागू करना होगा क्योंकि थ्रेड निर्धारित हैं - जो शायद "सभी कोरों के बीच कैश में सभी मेमोरी अपडेट करें" ऑपरेशन होगा, या शायद यह गंदे पृष्ठों को ट्रैक कर सकता है एमएमयू की मदद और केवल उन मेमोरी पेजों को सिंक करें जो बदले गए हैं - फिर से, हार्डवेयर संभावित रूप से कैश को अधिक सुसंगत और प्रभावशाली तरीके से सुसंगत रखता है।

+0

कोर के बीच प्रक्रिया माइग्रेशन बहुत बार नहीं होता है, इसलिए किसी भी कोर के लिए लिखने वाले कैश को फ्लश करने की लागत जो किसी प्रक्रिया को खो देती है, या किसी भी कोर के लिए पढ़ने वाले कैश को फ्लश करने की लागत, वास्तव में बहुत अधिक नहीं होनी चाहिए मुसीबत। एक बड़ा मुद्दा यह है कि अगर प्रक्रिया # 1 कोर ए और बी पर चल रही है, जबकि प्रक्रिया # 2 सी और डी पर चल रही है, तो कोर सी और डी को प्रक्रिया # 1 की तरफ से मेमोरी एक्सेस देखने वाले किसी भी संसाधन को निवेश करने की आवश्यकता नहीं है कोर ए और बी द्वारा, क्योंकि उन स्मृति क्षेत्रों में वास्तव में ब्याज नहीं होना चाहिए। – supercat

0

लॉकिंग के लिए इसकी आवश्यकता नहीं है। यदि आवश्यक हो तो लॉकिंग कोड में कैश फ्लशिंग शामिल होगी। यह मुख्य रूप से यह सुनिश्चित करने के लिए आवश्यक है कि एक ही कैश लाइन में विभिन्न चरों के लिए विभिन्न प्रोसेसर द्वारा समवर्ती अपडेट खो जाए।

6

कुछ लेखकों को अन्य लेखकों के महान प्रतिक्रियाओं से ढंकना नहीं है।

सबसे पहले, मान लें कि एक सीपीयू स्मृति बाइट-बाय-बाइट से निपटता नहीं है, लेकिन कैश लाइनों के साथ। एक पंक्ति में 64 बाइट हो सकते हैं। अब, यदि मैं स्थान पी पर स्मृति के 2 बाइट टुकड़े आवंटित करता हूं, और दूसरा सीपीयू पी + 8 स्थान पर स्मृति के 8 बाइट टुकड़े आवंटित करता है, और पी और पी + 8 दोनों एक ही कैश लाइन पर रहते हैं, तो देखें कि कैश समेकन के बिना दो सीपीयू एक दूसरे के परिवर्तनों को छेड़छाड़ किए बिना पी और पी +8 को समवर्ती रूप से अपडेट नहीं कर सकते हैं! चूंकि प्रत्येक सीपीयू कैश लाइन पर रीड-संशोधित-लिखता है, इसलिए वे दोनों लाइन की प्रतिलिपि लिख सकते हैं जिसमें अन्य CPU के परिवर्तन शामिल नहीं हैं! आखिरी लेखक जीतेंगे, और स्मृति में आपके संशोधनों में से एक "गायब" होगा!

दूसरी बात ध्यान में रखना सहारे और स्थिरता के बीच अंतर है। चूंकि x86 व्युत्पन्न सीपीयू स्टोर बफर का उपयोग करते हैं, इसलिए गारंटी नहीं है कि आप उम्मीद कर सकते हैं कि पहले से ही समाप्त होने वाले निर्देशों ने स्मृति को संशोधित किया है ताकि अन्य CPUs उन संशोधनों को देख सकें, भले ही संकलक ने मूल्य वापस लिखने का निर्णय लिया हो स्मृति के लिए (शायद volatile के कारण?)। इसके बजाय मोड स्टोर बफर में बैठे हो सकते हैं। सामान्य उपयोग में बहुत सारे सीपीयू कैश सुसंगत होते हैं, लेकिन बहुत कम CPUs में एक स्थिरता मॉडल होता है जो x86 के रूप में क्षमा होता है। इस विषय पर अधिक जानकारी के लिए, उदाहरण के लिए, http://www.cs.nmsu.edu/~pfeiffer/classes/573/notes/consistency.html देखें।

उम्मीद है कि यह मदद करता है, और बीटीडब्लू, मैं कोरेंसिक में काम करता हूं, एक ऐसी कंपनी जो एक कॉन्सुरेंसी डीबगर का निर्माण कर रही है जिसे आप देखना चाहते हैं। यह टुकड़ों को लेने में मदद करता है जब समरूपता, सुसंगतता और स्थिरता के बारे में धारणाएं निष्पक्ष साबित होती हैं :)

+1

लिंक पर प्रतिबंध प्रतिबंधित है। त्रुटि 403. ( – Ayrat

0

कैश कोहेरेंसी हार्डवेयर में लागू किया गया है क्योंकि प्रोग्रामर को यह सुनिश्चित करने की चिंता नहीं है कि सभी थ्रेड एक स्मृति का नवीनतम मूल्य देखें मल्टीकोर/मल्टीप्रोसेसर पर्यावरण में परिचालन करते समय स्थान। कैश समेकन एक अमूर्तता देता है कि सभी कोर/प्रोसेसर एक एकीकृत एकीकृत कैश पर काम कर रहे हैं, हालांकि प्रत्येक कोर/प्रोसेसर में इसका व्यक्तिगत कैश होता है।

यह भी सुनिश्चित करता है कि विरासत बहु-थ्रेडेड कोड नए प्रोसेसर मॉडल/बहु प्रोसेसर सिस्टम पर काम करता है, बिना डेटा स्थिरता सुनिश्चित करने के लिए कोई कोड परिवर्तन किए बिना।

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