यदि आप अभी भी शर्तों के लिए जाँच करना चाहते हैं, तो शाखा भविष्यवाणी कैसे काम करती है?


30

मैं https://stackoverflow.com/q/11227809/555690 से शाखा भविष्यवाणी के बारे में लोकप्रिय जवाब पढ़ रहा था , और मुझे भ्रमित करने वाला कुछ है:

  • यदि आपने सही अनुमान लगाया है, तो यह जारी है।
  • यदि आपने गलत अनुमान लगाया है, तो स्विच को फ्लिप करने के लिए कप्तान आपको रोक देगा, बैक अप और येल करेगा। फिर यह दूसरे पथ को पुनरारंभ कर सकता है।

अगर आप हर बार सही अनुमान लगाते हैं, तो ट्रेन को कभी भी रोकना नहीं पड़ेगा।

यदि आप अक्सर गलत अनुमान लगाते हैं, तो ट्रेन रुकने, बैकअप लेने और पुनः आरंभ करने में बहुत समय व्यतीत करेगी।

लेकिन यह वही है जो मुझे नहीं मिलता है: यह जानने के लिए कि क्या आपका अनुमान सही था या गलत, आपको किसी भी तरह से स्थिति की जांच करनी होगी । तो कैसे शाखा भविष्यवाणी भी काम करता है, अगर किसी भी तरह से आप अभी भी एक ही सशर्त जाँच कर रहे हैं?

मैं जो कहने की कोशिश कर रहा हूं, क्या वह शाखा भविष्यवाणी बिल्कुल वैसी ही नहीं है, क्योंकि आप वैसे भी बिना किसी शर्त के चेक कर रहे हैं? (स्पष्ट रूप से मैं गलत हूँ, लेकिन मुझे यह नहीं मिला)


1
यह विकी लेख एक बहुत अच्छा काम करता है जो इसे समझाता है।
एंडरलैंड

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

2
संबंधित पढ़ना: पाइपलाइन । मैं उस एसओ प्रश्न पर स्वीकृत उत्तर को पुन: प्रस्तुत करने की भी सिफारिश करूंगा, क्योंकि यह आपके प्रश्न का उत्तर यहां देता है।

जवाबों:


19

बेशक हालत हर बार जाँच की जाती है। लेकिन जब तक यह जाँच की जाती है, तब तक यह सीपीयू पाइपलाइन में आता है। इस बीच, अन्य निर्देशों ने भी पाइपलाइन में प्रवेश किया है, और निष्पादन के विभिन्न चरणों में हैं।

आमतौर पर, एक शर्त के तुरंत बाद एक सशर्त शाखा निर्देश होता है, जो या तो शाखाएं करता है यदि स्थिति TRUE का मूल्यांकन करती है, या यदि स्थिति FALSE का मूल्यांकन करती है, तो इसके माध्यम से गिरती है। इसका मतलब यह है कि निर्देशों की दो अलग-अलग धाराएँ हैं जिन्हें शर्त निर्देश और शाखा निर्देश के बाद पाइपलाइन में लोड किया जा सकता है, यह इस बात पर निर्भर करता है कि क्या स्थिति TRUE या FALSE का मूल्यांकन करती है। दुर्भाग्य से, स्थिति निर्देश और शाखा निर्देश को लोड करने के तुरंत बाद, सीपीयू को अभी तक यह पता नहीं है कि स्थिति क्या मूल्यांकन करेगी, लेकिन इसे अभी भी लोडिंग सामान को पाइपलाइन में रखना है। तो यह एक अनुमान के आधार पर निर्देशों के दो सेटों में से एक को चुनता है कि स्थिति क्या मूल्यांकन करेगी।

बाद में, जैसा कि निर्देश अनुदेश पाइप लाइन की यात्रा करता है, इसका मूल्यांकन किया जाना समय है। उस समय, CPU यह पता लगाता है कि उसका अनुमान सही था या गलत।

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

संशोधन

StarWeaver की टिप्पणी के जवाब में, एक निर्देश को निष्पादित करने के लिए सीपीयू को क्या करना है, इसका एक विचार देना:

कुछ के रूप में सरल के रूप में विचार करें MOV AX,[SI+10]जो हम इंसान भोलेपन से "एसआई प्लस 10 में शब्द के साथ एक्सएक्स लोड" के रूप में सोचते हैं। मोटे तौर पर, CPU के लिए है:

  1. पता बस में पीसी ("प्रोग्राम काउंटर रजिस्टर") की सामग्री का उत्सर्जन करें;
  2. डेटा बस से निर्देश ओपकोड पढ़ें;
  3. वेतन वृद्धि पीसी;
  4. यह क्या करना है यह पता लगाने के लिए ओपकोड को डीकोड करें;
  5. पता बस में पीसी की सामग्री का उत्सर्जन करें;
  6. डेटा बस से निर्देश ऑपरेंड (इस मामले में 10) पढ़ें;
  7. वेतन वृद्धि पीसी;
  8. योजक को एसआईएंड और एसआई फ़ीड;
  9. पता बस में योजक के परिणाम का उत्सर्जन करें;
  10. डेटा बस से AX पढ़ें।

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

अब, विचार करें कि अधिक जटिल पते वाले मोड मौजूद हैं, जैसे MOV AX, [DX+SI*4+10], और यहां तक ​​कि अधिक जटिल निर्देश, जैसे MUL AX, operandकि वास्तव में सीपीयू के अंदर लूप का प्रदर्शन करते हैं ताकि उनके परिणाम की गणना की जा सके।

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


2
हुह, मुझे आश्चर्य है कि अगर समस्या का हिस्सा लोग (मेरे सहित) यह समझने के बारे में है कि यह बहुत कठिन है (वैसे भी मेरे लिए) एक सीपीयू की कल्पना करने के लिए केवल एक निर्देश का आंशिक ज्ञान है; या आधे समाप्त निर्देशों का एक गुच्छा "पिज्जा बेल्ट ओवन के माध्यम से जा रहा है" ... मेरे लिए कम से कम, यह परमाणु के पैमाने पर बदलाव की तरह महसूस करता है जब मैं इरेक्टर सेट और धातु खराद स्तर के बीच चीजों के साथ काम करता था।
StarWeaver

1
@StarWeaver मुझे आपकी टिप्पणी पसंद आई, इसलिए मैंने इसे संबोधित करने के लिए अपने उत्तर में संशोधन किया।
माइक नाकिस

1
वाह, अच्छा अन्वेषण। मैं भूल जाता हूं कि शब्दों को अधिक उपयोगी स्थानों में स्थानांतरित करने में कितना जाता है। मैं अभी भी बेल्ट-संचालित पिज्जा ओवन के एक सेट के रूप में एक सीपीयू की कल्पना कर रहा हूं: 3।
StarWeaver

यह ध्यान में रखने योग्य है कि स्टैक ओवरफ्लो प्रश्न ओपी द्वारा जुड़ा हुआ है - 1.3 मिलियन विचारों के साथ जो संभवत: 1 मिलियन प्रोग्रामर को पहले अपरिचित तथ्य से परिचित कराता है कि "शाखा भविष्यवाणी" भी मौजूद है - जावा में एक उदाहरण प्रदर्शित करता है । मेरे जैसे लोगों के लिए, जिन्हें एब्सट्रैक्शन के स्तर पर काम करने की आदत है, जो जावा जैसी भाषाएं हमें प्रदान करती हैं, यहां तक MOV AX,[SI+10]कि विदेशी भी हैं , "सरल" नहीं; अधिकांश प्रोग्रामर ने आज असेंबली नहीं लिखी है। हम "भोलेपन से" ऐसा कुछ भी नहीं समझते हैं।
मार्क अमेरी

@MarkAmery अच्छी तरह से, ठीक है, मुझे लगा कि यह स्पष्ट है कि "हम इंसानों" से मेरा मतलब है "हम इंसान जो असेंबली की हिम्मत करते हैं"। मुद्दा यह है कि असेंबली भाषा के प्रोग्रामर हर समय पाइप लाइन के बारे में नहीं सोच रहे हैं या बिल्कुल भी नहीं।
माइक नाकिस

28

बिना जीपीएस के रोड ट्रिप की तरह सोचें। आप एक चौराहे पर आते हैं, और सोचते हैं कि आपको मुड़ने की ज़रूरत है, लेकिन पूरी तरह से निश्चित नहीं हैं। इसलिए आप टर्न लेते हैं, लेकिन अपने यात्री से नक्शे की जांच करने के लिए कहें। हो सकता है कि जब आप जहां हों, उसके बारे में बहस करते हुए आप सड़क से तीन मील नीचे हों। यदि आप सही थे, तो आप तीन मील दूर हैं, अगर आप रुकने से पहले और रुकने के बाद तर्क देते। यदि आप गलत थे, तो आपको मुड़ना होगा।

सीपीयू पाइपलाइन उसी तरह काम करती है। जब तक वे स्थिति की जांच कर सकते हैं, तब तक वे पहले से ही सड़क के नीचे एक रास्ता हैं। अंतर यह है कि, उन्हें तीन मील पीछे नहीं जाना है, वे बस सिर शुरू करते हैं। इसका मतलब है कि कोशिश करने में कोई बुराई नहीं है।


2
यह स्पष्टीकरण साफ-सुथरा है।
शार्प्यूट

2

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

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

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


1

संक्षिप्त रूप:

कुछ CPU पुराने को खत्म करने से पहले एक नए निर्देश पर काम करना शुरू कर सकते हैं। ये सीपीयू हैं जो शाखा भविष्यवाणी का उपयोग करते हैं।

एक छद्मकोड उदाहरण:

int globalVariable;
int Read(int* readThis, int* readThat)
{
    if ((globalVariable*globalVariable % 17) < 5)
       return *readThis;
    else
       return *readThat;
}

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


1

हां, शर्त की जाँच की जाती है। लेकिन शाखा की भविष्यवाणी का लाभ यह है कि आप स्थिति की जांच के परिणाम की प्रतीक्षा करने के बजाय काम कर सकते हैं।

कहते हैं कि आपको एक निबंध लिखना है और यह विषय A या विषय B के बारे में हो सकता है। आप पिछले निबंधों से जानते हैं कि आपका शिक्षक B से बेहतर विषय A पसंद करता है और इसे अधिक बार चुनता है। उसके निर्णय की प्रतीक्षा करने के बजाय आप पहले विषय के बारे में निबंध लिखना शुरू कर सकते हैं। अब दो संभावित परिणाम हैं:

  1. आपने गलत विषय पर अपना निबंध शुरू किया और जो आपने अभी तक लिखा है उसे छोड़ना होगा। आपको दूसरे विषय के बारे में लिखना शुरू करना होगा और यह उसी समय का प्रयास होगा जैसे आपने प्रतीक्षा की थी।
  2. आपने सही अनुमान लगाया और आप पहले से ही काम कर चुके हैं।

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

यहां तक ​​कि अगर आपको इस निष्क्रिय समय में आप जो कर रहे हैं उसे खारिज करना होगा - यह सबसे अधिक प्रभावी होने की संभावना है यदि आपके पास यह अनुमान लगाने की क्षमता है कि कार्यक्रम किस मार्ग को चुनेगा। और आधुनिक सीपीयू में यह क्षमता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.