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

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

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


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

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


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

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

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

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

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

टेम्पोरल प्रीफेचिंग
प्रीफ़ेचर का यह वर्ग उन मेमोरी अभिगम स्ट्रीम की तलाश करता है जो समय के साथ दोहराई जाती हैं। उदा. स्मृति की इस धारा में: एन, ए, बी, सी, ई, जी, एच, ए, बी, सी, आई, जे, के, ए, बी, सी, एल, एम, एन, ओ, ए, बी, सी, ....; धारा A,B,C समय के साथ दोहरा रही है। अन्य डिज़ाइन भिन्नताओं ने अधिक कुशल, प्रदर्शनकारी कार्यान्वयन प्रदान करने का प्रयास किया है।

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

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

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

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

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

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

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

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

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

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

$$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$$ समयबद्धता बनाए रखने के लिए इसके उपयोग से पूर्व पुनरावृत्तियों।

यह भी देखें

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