कैश प्रीफेचिंग

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

डेटा बनाम निर्देश कैश प्रीफ़ेचिंग
कैश प्रीफ़ेचिंग या तो कैश में डेटा या निर्देश प्राप्त कर सकता है।


 * डेटा प्रीफ़ेचिंग डेटा को आवश्यक होने से पूर्व ही प्राप्त कर लेता है। क्योंकि डेटा अभिगम पैटर्न निर्देश पैटर्न की तुलना में कम नियमितता दिखाते हैं, यथार्थ डेटा प्रीफ़ेचिंग सामान्यतः निर्देश प्रीफ़ेचिंग की तुलना में अधिक चुनौतीपूर्ण होता है।
 * निर्देश प्रीफ़ेचिंग निर्देशों को निष्पादित करने से पूर्व उन्हें प्राप्त करता है। इंस्ट्रक्शन प्रीफ़ेच के किसी रूप का उपयोग करने वाले पूर्व मेनस्ट्रीम माइक्रोप्रोसेसर इंटेल 8086(छह बाइट्स) और मोटोरोला 68000(चार बाइट्स) थे। वर्तमान वर्षों में, सभी उच्च-निष्पादन वाले प्रोसेसर प्रीफ़ेचिंग तकनीकों का उपयोग करते हैं।

हार्डवेयर बनाम सॉफ्टवेयर कैश प्रीफेचिंग
कैश प्रीफेचिंग या तो हार्डवेयर या सॉफ्टवेयर द्वारा पूरा किया जा सकता है।


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

स्ट्रीम बफ़र्स
* जब भी प्रीफैच मैकेनिज्म किसी मेमोरी ब्लॉक पर एक मिस का पता लगाता है, A कहते हैं, यह मिस्ड ब्लॉक से आगे के ब्लॉक को प्रीफेच करना प्रारम्भ करने के लिए एक स्ट्रीम आवंटित करता है। यदि स्ट्रीम बफ़र में 4 ब्लॉक हो सकते हैं, तो हम A+1, A+2, A+3, A+4 को प्रीफ़ेच करेंगे और आवंटित स्ट्रीम बफ़र में उन्हें धारण करेंगे। यदि प्रोसेसर A+1 का उपभोग करता है, तो इसे स्ट्रीम बफर से प्रोसेसर के कैश में ले जाया जाएगा। स्ट्रीम बफ़र की प्रथम प्रविष्टि अब A+2 होगी और इसी प्रकार आगे भी। क्रमिक ब्लॉकों को प्रीफ़ेच करने के इस पैटर्न को अनुक्रमिक प्रीफ़ेचिंग कहा जाता है। इसका मुख्य रूप से उपयोग तब किया जाता है जब सन्निहित स्थानों को प्रीफ़ेच किया जाना हो। उदाहरण के लिए, निर्देशों को प्रीफ़ेच करते समय इसका उपयोग किया जाता है।
 * एलन जे स्मिथ द्वारा प्रस्तावित वन ब्लॉक लुकहेड(ओबीएल) योजना की अवधारणा के आधार पर स्ट्रीम बफ़र्स विकसित किए गए थे।
 * स्ट्रीम डेटा बफ़र उपयोग में आने वाली सबसे सामान्य हार्डवेयर आधारित प्रीफ़ेचिंग तकनीकों में से एक है। यह तकनीक मूल रूप से 1990 में नॉर्मन जोप्पी द्वारा प्रस्तावित की गई थी और तब से इस पद्धति के कई रूप विकसित किए गए हैं। मूल विचार यह है कि कैश मिस एड्रेस(और $$k$$ बाद के एड्रेसेस) को गहराई $$k$$. इस बफ़र को स्ट्रीम बफ़र कहा जाता है और कैश से अलग होता है। प्रोसेसर तब स्ट्रीम बफर से डेटा/निर्देशों का उपभोग करता है यदि प्रीफ़ेच किए गए ब्लॉक से जुड़े एड्रेस प्रोसेसर पर निष्पादित प्रोग्राम द्वारा उत्पन्न अनुरोधित एड्रेस से मेल खाते हैं। नीचे दिया गया चित्र इस व्यवस्था को दिखाता है:
 * इस तंत्र को कई ऐसे 'स्ट्रीम बफ़र्स' जोड़कर बढ़ाया जा सकता है - जिनमें से प्रत्येक एक अलग प्रीफ़ेच स्ट्रीम बनाए रखेगा। प्रत्येक नई चूक के लिए, एक नया स्ट्रीम बफ़र आबंटित किया जाएगा और यह उसी प्रकार से संचालित होगा जैसा कि ऊपर वर्णित है।
 * स्ट्रीम बफर की आदर्श गहराई कुछ ऐसी है जो विभिन्न बेंचमार्क के विरुद्ध प्रयोग के अधीन है और सम्मिलित शेष सूक्ष्म वास्तुकला पर निर्भर करता है।

स्ट्राइड प्रीफेचिंग
इस प्रकार का प्रीफेचिंग मेमोरी अभिगम के एड्रेसेस के बीच डेल्टा की निरीक्षण करता है और इसके भीतर पैटर्न की अन्वेषण करता है।

नियमित प्रगति
इस पैटर्न में, $$s$$ एड्रेस को अलग-अलग ब्लॉक करने के लिए निरंतर मेमोरी अभिगम किए जाते हैं। इस विषय में, प्रीफ़ेचर $$s$$ की गणना करता है और प्रीफ़ेचिंग के लिए मेमोरी एड्रेस की गणना करने के लिए इसका उपयोग करता है। जैसे: यदि $$s$$ 4 है, प्रीफ़ेच किया जाने वाला पता A+4 होगा।

अनियमित प्रगति
इस विषय में, निरंतर मेमोरी अभिगम के एड्रेसेस के बीच का डेल्टा परिवर्तनशील है परन्तु फिर भी एक पैटर्न का अनुसरण करता है। कुछ प्रीफेचर डिजाइन भविष्य की पहुंच के लिए भविष्यवाणी करने और प्रीफेच करने के लिए इस गुण का लाभ उठाएं।

अस्थायी प्रीफेचिंग
प्रीफ़ेचर का यह वर्ग उन मेमोरी अभिगम स्ट्रीम की अन्वेषण करता है जो समय के साथ दोहराई जाती हैं। उदा. मेमोरी की इस स्ट्रीम में: N, A, B, C, E, G, H, A, B, C, I, J, K, A, B, C, L, M, N, O, A, B, C, ....; स्ट्रीम A,B,C समय के साथ दोहरा रही है। अन्य डिज़ाइन भिन्नताओं ने अधिक कुशल, निष्पादनकारी कार्यान्वयन प्रदान करने का प्रयास किया है।

सहयोगात्मक प्रीफेचिंग
कंप्यूटर एप्लिकेशन विभिन्न प्रकार के अभिगम पैटर्न उत्पन्न करते हैं। इन अनुप्रयोगों को निष्पादित करने के लिए उपयोग किए जाने वाले प्रोसेसर और मेमोरी उप प्रणाली वास्तु-कला उनके द्वारा उत्पन्न मेमोरी अभिगम पैटर्न को और स्पष्ट करते हैं। इसलिए, प्रीफ़ेचिंग योजनाओं की प्रभावशीलता और दक्षता प्रायः एप्लिकेशन और उन्हें निष्पादित करने के लिए उपयोग किए जाने वाले वास्तु-कला पर निर्भर करती है। वर्तमान में किए गए अनुसंधान उत्तम प्रीफ़ेचिंग व्याप्ति और सटीकता के लिए कई प्रीफ़ेचिंग योजनाओं का सहक्रियात्मक रूप से उपयोग करने के लिए सहयोगी तंत्र के निर्माण पर ध्यान केंद्रित किया है।

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

ये प्रीफ़ेच नॉन-ब्लॉकिंग मेमोरी संचालन हैं, अर्थात ये मेमोरी अभिगम वास्तविक मेमोरी अभिगम में अंतःक्षेप नहीं करते हैं। वे प्रोसेसर की स्थिति को नहीं बदलते हैं या पृष्ठ दोष का कारण नहीं बनते हैं।

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

निम्न उदाहरण दिखाता है कि कैश निष्पादन को उत्तम बनाने के लिए प्रीफ़ेच निर्देश को कोड में कैसे जोड़ा जाएगा।

जैसा कि नीचे दिखाया गया है लूप के लिए विचार करें: प्रत्येक पुनरावृत्ति पर, iवें सरणी का अवयव ऐरे 1 अभिगम किया गया है। इसलिए, हम उन अवयवों को प्रीफ़ेच कर सकते हैं जिन्हें भविष्य के पुनरावृत्तियों में अभिगम किया जा रहा है, जैसा कि नीचे दिखाया गया है:  यहाँ, प्रीफ़ेच स्ट्राइड, $$k$$ दो कारकों पर निर्भर करता है, कैश मिस दंड और 'for' लूप के एकल पुनरावृत्ति को निष्पादित करने में लगने वाला समय। उदाहरण के लिए, यदि लूप के एक पुनरावृत्ति को निष्पादित करने में 7 चक्र लगते हैं, और कैश मिस दंड 49 चक्र है, तो हमारे समीप $$k = 49/7 = 7$$ होना चाहिए - जिसका अर्थ है कि हम 7 अवयवों को आगे बढ़ाते हैं। पूर्व पुनरावृत्ति के साथ, i 0 होगा, इसलिए हम 7वें अवयव को प्रीफ़ेच करते हैं। अब, इस व्यवस्था के साथ, पूर्व 7 अभिगम(i=0->6) अभी भी मिस होंगे(सरलीकृत धारणा के अंतर्गत कि ऐरे1 का प्रत्येक अवयव स्वयं की एक अलग कैश क्रम में है)।

हार्डवेयर और सॉफ्टवेयर प्रीफेचिंग की तुलना

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

कैश प्रीफ़ेचिंग के मापन
कैश प्रीफ़ेचिंग को आंकने के लिए तीन मुख्य मापन हैं

व्याप्ति
व्याप्ति कुल मिसेस का वह अंश है जो प्रीफ़ेचिंग के कारण समाप्त हो जाते हैं, अर्थात

$$Coverage = \frac{\text{Cache Misses eliminated by Prefetching}}{\text{Total Cache Misses}}$$,

जहां, $$\text{Total Cache Misses} = (\text{Cache misses eliminated by prefetching}) + (\text{Cache misses not eliminated by prefetching})$$

सटीकता
सटीकता कुल प्रीफ़ेच का अंश है जो उपयोगी थे - अर्थात प्रीफ़ेच किए गए मेमोरी एड्रेसेस की संख्या का अनुपात वस्तुत: किए गए कुल प्रीफ़ेच के लिए प्रोग्राम द्वारा संदर्भित किया गया था।

$$\text{Prefetch Accuracy} = \frac{\text{Cache Misses eliminated by prefetching}}{(\text{Useless Cache Prefetches}) + (\text{Cache Misses eliminated by prefetching})}$$

यद्यपि ऐसा प्रतीत होता है कि पूर्ण सटीकता होने का अर्थ यह हो सकता है कि कोई चूक नहीं हुई है, ऐसा नहीं है। यदि प्रीफ़ेच किए गए ब्लॉक को सीधे कैश में रखा जाता है, तो प्रीफ़ेच का परिणाम नई चूक हो सकता है। यद्यपि ये बिना किसी प्रीफेचिंग के हमें दिखाई देने वाली मिसेस की कुल संख्या का एक छोटा सा अंश हो सकता है, यह मिसेस की गैर-शून्य संख्या है।

समयबद्धता
समयबद्धता की गुणात्मक परिभाषा यह है कि किसी ब्लॉक को वस्तुत: संदर्भित किए जाने की तुलना में कितनी जल्दी प्रीफ़ेच किया जाता है। समयबद्धता को और समझाने के लिए एक उदाहरण इस प्रकार है:

एक फॉर लूप पर विचार करें जहां प्रत्येक पुनरावृत्ति को निष्पादित करने के लिए 3 चक्र लगते हैं और 'प्रीफेच' संचालन में 12 चक्र लगते हैं। इसका तात्पर्य है कि प्रीफ़ेच किए गए डेटा के उपयोगी होने के लिए, हमें प्रीफ़ेच प्रारम्भ करना होगा $$12/3 = 4$$ समयबद्धता बनाए रखने के लिए इसके उपयोग से पूर्व पुनरावृत्तियों।

यह भी देखें

 * प्रीफ़ेच निविष्ट पंक्ति
 * लिंक प्रीफेचिंग
 * प्रीफेचर
 * कैश नियंत्रण निर्देश