सीपीयू (इसका मेमोरी कंट्रोलर विशेष रूप से) इस तथ्य का लाभ उठा सकता है कि मेमोरी उत्परिवर्तित नहीं है
फायदा यह है कि यह तथ्य संकलक को डेटा के एक्सेस होने पर मेम्बर निर्देशों का उपयोग करने से बचाता है।
एक मेमोरी बैरियर, जिसे मेम्बर, मेमोरी फेंस या बाड़ इंस्ट्रक्शन के रूप में भी जाना जाता है, एक प्रकार का बैरियर इंस्ट्रक्शन है, जो एक सेंट्रल प्रोसेसिंग यूनिट (सीपीयू) या कंपाइलर का कारण बनता है, जो बैरियर इंस्ट्रक्शन से पहले और बाद में जारी किए गए मेमोरी ऑपरेशंस पर एक ऑर्डर की कमी को लागू करता है। इसका आम तौर पर मतलब है कि कुछ ऑपरेशनों को बैरियर से पहले प्रदर्शन करने की गारंटी दी जाती है, और अन्य के बाद।
मेमोरी बाधाएं आवश्यक हैं क्योंकि अधिकांश आधुनिक सीपीयू प्रदर्शन अनुकूलन का उपयोग करते हैं जिसके परिणामस्वरूप आउट-ऑफ-ऑर्डर निष्पादन हो सकता है। मेमोरी ऑपरेशंस (लोड और स्टोर) की यह रीऑर्डरिंग आम तौर पर निष्पादन के एक थ्रेड के भीतर किसी का ध्यान नहीं जाता है, लेकिन समवर्ती कार्यक्रमों और डिवाइस ड्राइवरों में अप्रत्याशित व्यवहार का कारण बन सकता है जब तक कि सावधानी से नियंत्रित नहीं किया जाता है ...
आप देखते हैं, जब डेटा को विभिन्न थ्रेड्स से एक्सेस किया जाता है, तो मल्टी-कोर सीपीयू में यह निम्नानुसार होता है: विभिन्न धागे अलग-अलग कोर पर चलते हैं, प्रत्येक अपने स्वयं के (स्थानीय से अपने) कैश का उपयोग करते हैं - कुछ वैश्विक कैश की एक प्रति।
यदि डेटा उत्परिवर्तनीय है और प्रोग्रामर को विभिन्न थ्रेड्स के बीच सुसंगत होने की आवश्यकता है, तो स्थिरता की गारंटी के लिए उपाय किए जाने की आवश्यकता है। प्रोग्रामर के लिए, इसका मतलब है कि जब वे विशेष थ्रेड में डेटा एक्सेस करते हैं (जैसे पढ़ते हैं) तो सिंक्रोनाइज़ेशन कंस्ट्रक्शन का उपयोग करते हैं।
संकलक के लिए, कोड में सिंक्रोनाइज़ेशन निर्माण का मतलब यह है कि यह सुनिश्चित करने के लिए कि एक कोर पर डेटा की प्रतिलिपि में किए गए परिवर्तनों को ठीक से प्रचारित ("प्रकाशित") किया गया है, अन्य कैश पर गारंटी देने के लिए एक मेमोरेबल इंस्ट्रक्शन डालना होगा। एक ही (अप-टू-डेट) कॉपी है।
नीचे दिए गए नोट को थोड़ा सा सरल करते हुए , यहां मेमबर के लिए मल्टी-कोर प्रोसेसर पर क्या होता है:
- सभी कोर प्रसंस्करण बंद कर देते हैं - गलती से कैश करने के लिए लिखने से बचने के लिए।
- स्थानीय कैश के लिए किए गए सभी अपडेट वैश्विक एक पर वापस लिखे गए हैं - यह सुनिश्चित करने के लिए कि वैश्विक कैश में सबसे हाल का डेटा है। इसमें कुछ समय लगता है।
- अपडेट किए गए डेटा को वैश्विक कैश से स्थानीय लोगों को वापस लिखा जाता है - यह सुनिश्चित करने के लिए कि स्थानीय कैश में सबसे हाल का डेटा है। इसमें कुछ समय लगता है।
- सभी कोर के निष्पादन को फिर से शुरू करते हैं।
आप देखिए, वैश्विक और स्थानीय कैश के बीच डेटा को कॉपी किए जाने के दौरान सभी कोर कुछ नहीं कर रहे हैं । यह सुनिश्चित करने के लिए आवश्यक है कि उत्परिवर्तनीय डेटा ठीक से सिंक्रनाइज़ किया गया है (थ्रेड सुरक्षित)। यदि 4 कोर हैं, तो सभी 4 बंद हो जाते हैं और इंतजार करते हैं जबकि कैश सिंक किए जा रहे हैं। यदि 8 हैं, तो सभी 8 बंद हो जाते हैं। अगर वहाँ 16 हैं ... अच्छी तरह से आप 15 कोर मिल गया है, जबकि इनमें से किसी एक पर करने के लिए आवश्यक सामान की प्रतीक्षा कर रहे हैं।
अब, देखते हैं कि डेटा अपरिवर्तनीय होने पर क्या होता है? कोई फर्क नहीं पड़ता कि कौन सा धागा इसे एक्सेस करता है, यह समान होने की गारंटी है। प्रोग्रामर के लिए, इसका मतलब है कि जब वे विशेष थ्रेड में डेटा (एक्सेस) एक्सेस करते हैं तो सिंक्रोनाइज़ेशन कंस्ट्रक्शन सम्मिलित करने की आवश्यकता नहीं होती है ।
संकलक के लिए, बदले में इसका मतलब एक ज्ञापन निर्देश सम्मिलित करने की आवश्यकता नहीं है ।
नतीजतन, डेटा तक पहुंच को रोकने और प्रतीक्षा करने की आवश्यकता नहीं है, जबकि डेटा वैश्विक और स्थानीय कैश के बीच आगे और पीछे लिखा जा रहा है। यह इस तथ्य का एक फायदा है कि स्मृति उत्परिवर्तित नहीं है ।
ऊपर दिए गए कुछ सरल विवरणों पर ध्यान दें , डेटा के कुछ और अधिक जटिल नकारात्मक प्रभावों को कम करता है, उदाहरण के लिए, पाइपलाइनिंग पर । आवश्यक आदेश की गारंटी देने के लिए, CPU को डेटा परिवर्तनों से प्रभावित पायलटों को अमान्य करना होगा - यह अभी तक एक और प्रदर्शन जुर्माना है। यदि यह सीधा (और इस प्रकार विश्वसनीय :) सभी पाइपलाइनों के अमान्य होने से लागू होता है, तो नकारात्मक प्रभाव को और अधिक बढ़ाया जाता है।