क्योंकि सीपीयू निर्देशों को निष्पादित करने के लिए पाइपलाइन को गोद लेता है, जिसका अर्थ है कि जब किसी चरण में पिछले निर्देश को निष्पादित किया जा रहा है (उदाहरण के लिए, रजिस्टरों से मूल्य पढ़ना), तो अगला निर्देश एक ही समय में निष्पादित हो जाएगा, लेकिन एक और चरण में (उदाहरण के लिए, डीकोडिंग चरण)। यह गैर-नियंत्रण निर्देशों के लिए ठीक है, लेकिन यह चीज जटिल बनाता है जब नियंत्रण निर्देश jmp
या call
निष्पादित किए जाते हैं।
चूंकि सीपीयू क्या अगले निर्देश जब एक jmp
अनुदेश क्रियान्वित हो जाएगा पता नहीं है, यह branch prediction तकनीकों का उपयोग करता भविष्यवाणी करने के लिए कि क्या शाखा अनुदेश या नहीं लिया जाएगा (उदाहरण के लिए, एक पाश स्निपेट में एक शाखा अनुदेश शायद ले जाएगा लूप हेड पर निर्देश प्रवाह वापस)।
हालांकि, जब ऐसी भविष्यवाणी विफल हो जाती है, जिसे branch misprediction कहा जाता है, तो यह निष्पादन प्रदर्शन को प्रभावित करेगा। चूंकि शाखा के बाद पाइपलाइन को त्यागना पड़ता है, और सही निर्देश से शुरू होता है।
+1: इस मुद्दे के लिए भी महत्वपूर्ण: आधुनिक CPUs में आमतौर पर [बर्न भविष्यवाणियों] (http://en.wikipedia.org/wiki/Branch_predictor) को इस पे को कम करने के लिए महत्वपूर्ण है सुधार नुकसान। – amit
लेकिन ऐसी तकनीकें हैं जो "शाखा भविष्यवाणी" (http://en.wikipedia.org/wiki/Branch_prediction) नामक इस प्रक्रिया को तेज करती हैं। यह हमेशा काम नहीं करता है लेकिन सामान्य रूप से यह बेहतर काम करता है। संपादित करें: मैं बहुत धीमी हूँ। xD – alfa
बस इसे स्पष्ट करने के लिए: पाइपलाइन को रोकने का मतलब है कि प्रीलोड किए गए सभी निर्देशों को अनलोड किया जाना चाहिए। इसके अलावा, किसी भी संभावित दुष्प्रभाव को वापस लेना चाहिए (आमतौर पर डेटा जो गलत तरीके से शाखा के कारण बदल गया है)। इन सभी परिचालनों में समय और ऊर्जा खर्च होती है। – NeXuS