शाखा भविष्यवाणी क्या है?

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

परिदृश्य

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

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

यह समस्या क्यों है?

इससे कोई फर्क नहीं पड़ता कि इस समस्या को पूरी तरह से अनुक्रमिक प्रोसेसर में कैसे रखा जाता है। यह बस कोई समस्या नहीं है। निम्नलिखित निर्देश के पहले भाग के संसाधित होने से पहले कौन सी शाखा ली जाएगी यह ज्ञात है।

एक पाइपलाइन प्रोसेसर में, हालांकि, निम्नलिखित निर्देश कतारबद्ध हैं। वे पहले से ही संसाधित हो रहे हैं जब प्रोसेसर जानता है कि कौन सी शाखा ली जा रही है। तो प्रोसेसर को इस परिदृश्य को कैसे संभालना चाहिए? कुछ विकल्प हैं। सबसे बुरी बात यह है कि पाइपलाइन को निष्क्रिय छोड़ दिया जाता है, जबकि यह जवाब की प्रतीक्षा करता है कि किस शाखा को लेना है। इसका मतलब यह होगा कि हर बार जब आपके पास ब्रांचिंग स्टेटमेंट होता है, तो आप हमेशा कम से कम प्रोसेसर समय के कई चक्र खो देंगे क्योंकि आपके पास पाइपलाइन में चरण हैं।

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

इस मुद्दे को वास्तव में कैसे संबोधित किया जाता है

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

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

मिलान कोड

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

एक अन्य विकल्प आँकड़ों से सीखना था कि लूप आमतौर पर लिए जाते हैं और हमेशा कूदते हैं यदि शाखा पीछे की ओर जाती है निर्देश स्ट्रीम और यदि कूद आगे है तो कभी भी कूदें नहीं क्योंकि यह सामान्य रूप से छोड़ने की सांख्यिकीय रूप से कम संभावना वाली स्थिति होगी फंदा। ये दोनों प्रकार की स्थिर शाखा भविष्यवाणी हैं, जहां संकलन समय पर एक शाखा के परिणाम की भविष्यवाणी की जाती है।

डायनेमिक ब्रांच प्रेडिक्टर्स

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

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

ट्रैकिंग पैटर्न

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

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

कुछ शाखा भविष्यवक्ता कई एल्गोरिदम का उपयोग करते हैं और फिर परिणामों की तुलना करके तय करते हैं कि किस भविष्यवाणी का उपयोग करना है। कुछ प्रणालियाँ प्रत्येक शाखा निर्देश का अलग से ट्रैक रखती हैं जिसे स्थानीय शाखा भविष्यवाणी कहा जाता है। अन्य सभी हालिया शाखाओं के निर्देशों को ट्रैक करने के लिए वैश्विक शाखा भविष्यवाणी प्रणाली का उपयोग करते हैं। दोनों के अपने उपयोग और कमियां हैं।

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

निष्कर्ष

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

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