कैश पॉल्यूशन

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

उदाहरण
निम्नलिखित दृष्टांत पर विचार करें: T[0] = T[0] + 1; for i in 0..sizeof(CACHE) C[i] = C[i] + 1; T[0] = T[0] + C[sizeof(CACHE)-1];

(यहां अवधारणाएं यह हैं कि कैश केवल एक स्तर से बना है, इसे अनलॉक किया गया है, रिप्लेसमेंट पॉलिसी कूट-एलआरयू है, सभी डेटा कैश करने योग्य है, कैश की सेट एसोसिएटिविटी N है (जहां N > 1) और प्रोग्राम वैल्यू सम्मिलित करने के लिए अधिकतम एक प्रोसेसर रजिस्टर उपलब्ध है)।

लूप प्रारंभ होने से पूर्व, T[0] को मेमोरी से कैश में आनयन किया जाएगा और इसका मान अपडेट किया जाएगा। यद्यपि, लूप निष्पादित होते ही, चूंकि लूप रिफरेन्स में डेटा एलिमेंट्स की संख्या के लिए संपूर्ण कैश को उसकी क्षमता तक पूरित करने की आवश्यकता होती है, T[0] वाले कैश ब्लॉक को निष्कासित करना पड़ता है। इस प्रकार, तत्पश्चात जब प्रोग्राम T[0] को अपडेट करने का अनुरोध करता है, तो कैश लुप्त हो जाता है और कैश कंट्रोलर को मुख्य मेमोरी से संबंधित कैश ब्लॉक को पुनः प्रस्तुत करने के लिए डेटा बस को अनुरोध करना पड़ता है।

इस स्थिति में कैश को "पॉल्यूटेड" कहा जाता है। T[0] के प्रथम अपडेट को लूप और द्वितीय अपडेट के मध्य स्थापन कर डेटा एक्सेस के पैटर्न को परिवर्तन करने से अक्षमता समाप्त हो सकती है:

for i in 0..sizeof(CACHE) C[i] = C[i] + 1; T[0] = T[0] + 1; T[0] = T[0] + C[sizeof(CACHE)-1];

हल
उपरोक्त उल्लिखित कोड-रिस्ट्रक्टरिंग के अतिरिक्त कैश पॉल्यूशन का हल यह सुनिश्चित करना है कि कैश में केवल उच्च-पुन: उपयोग वाला डेटा संग्रहीत किया जाए। इसे विशेष कैश कंट्रोल इंस्ट्रक्शंस, ऑपरेटिंग सिस्टम सपोर्ट या हार्डवेयर सपोर्ट का उपयोग करके प्राप्त किया जा सकता है।

विशेष हार्डवेयर इंस्ट्रक्शंस के उदाहरणों में पावरपीसी अल्टिवेक द्वारा प्रदान किया गया आईवीएक्सएल सम्मिलित है। यह निर्देश 128 बिट विस्तृत मान को एक रजिस्टर में लोड करता है और संबंधित कैश ब्लॉक को प्रायः वर्तमान में प्रयुक्त के रूप में, या फिर किसी ब्लॉक को उसके कैश सेट से निष्कासित की आवश्यकता पर निष्कासन के लिए प्रमुख पदान्वेषी के रूप में चिह्नित करता है। उपरोक्त उदाहरण के कॉन्टेक्ट में उस इंस्ट्रक्शन का उचित उपयोग करने के लिए लूप द्वारा रिफ्रेंस्ड डेटा एलिमेंट्स को इस इंस्ट्रक्शन का उपयोग करके लोड करना होगा। जब इस प्रकार से प्रयुक्त किया जाता है तो कैश पॉल्यूशन नहीं होगा क्योंकि ऐसे लूप के एक्जिक्यूशन से कैश से T [0] का समय से पूर्व इविक्शन नहीं होगा। इससे बचा जाएगा क्योंकि जैसे-जैसे लूप आगे बढ़ेगा, C में एलिमेंट्स के एड्रेसेस उसी कैश वेज़ पर मैप हो जाएंगे, जिससे वस्तुतः पुराना (किन्तु "कम से कम हाल ही में उपयोग किया गया" के रूप में चिह्नित नहीं किया गया) डेटा अन्य तरीके पर इंटेक्ट रहेगा। केवल अत्यधिक पुराना डेटा (दिए गए उदाहरण के लिए प्रासंगिक नहीं) को कैश से निकाला जाएगा, जिसका T[0] सदस्य नहीं है क्योंकि इसका अपडेट लूप के आरम्भ होने से ठीक पूर्व होता है।

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

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