2017-02-10 10 views
5

this पढ़ने से मैं अगले दो उद्धरण में आए:शाखा भविष्यवाणी को कैसे रद्द करें?

सबसे पहले बोली: जब तुलना परिणाम डेटा पर निर्भर है

अप्रत्याशित शाखा व्यवहार का एक विशिष्ट उदाहरण है।

दूसरा बोली:

कोई शाखाओं मतलब नहीं Mispredicts

अपने प्रोजेक्ट के लिए, मैं एक निर्भर डेटा पर काम करते हैं और मैं कई if और switch बयान करते हैं। मेरी परियोजना Big Data से संबंधित है, इसलिए इसे यथासंभव कुशल होना चाहिए। इसलिए मैं इसे उपयोगकर्ता द्वारा प्रदान किए गए आंकड़ों पर परीक्षण करना चाहता था, यह देखने के लिए कि शाखा भविष्यवाणी वास्तव में मेरे कार्यक्रम को धीमा करती है या मदद करता है। here पढ़ने से:

गलत भविष्यवाणी देरी 10 से 20 घड़ी चक्रों के बीच है।

क्या मुझे सबसे ज्यादा हैरान था:

शाखाओं निकाला जा रहा है न केवल कोड के क्रम प्रदर्शन, यह भी कोड का अनुकूलन करने में मदद करता है संकलक में सुधार।

तब शाखा पूर्वानुमान का उपयोग क्यों करें?

क्या कंपाइलर को शाखाओं के बिना असेंबली कोड उत्पन्न करने के लिए मजबूर करने का कोई तरीका है? या शाखा पूर्वानुमान को अक्षम करने के लिए ताकि सीपीयू? तो मैं दोनों परिणामों की तुलना कर सकते हैं?

+2

आपके प्रश्न का उत्तर दिए गए प्रश्न के उत्तर के साथ उत्तर दिया गया है। –

+5

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

+0

@ जॉर्जस्टॉकर धन्यवाद! इसका उपयोग यह समझने के लिए किया जाता है कि 'शाखा भविष्यवाणी' क्या है लेकिन नीचे ध्यान नहीं दिया गया है, उसने कुछ उपयोगी जानकारी प्रदान की है।अतिरिक्त जानकारी के लिए –

उत्तर

8

यदि शाखा भविष्यवाणी वास्तव में मेरे कार्यक्रम धीमा या

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

यदि शाखा पूर्वानुमान मौजूद नहीं था, तो सभी शाखाएं गलत तरीके से महंगी होती हैं।

तो क्या "गलत भविष्यवाणी 10 से 20 घड़ी चक्रों के बीच है" वास्तव में इसका मतलब है कि सफल शाखा भविष्यवाणी आपको 10 से 20 चक्र बचाती है।

शाखाओं न केवल कोड के क्रम प्रदर्शन को बेहतर बनाता निकाला जा रहा है, यह भी कोड का अनुकूलन करने के संकलक मदद करता है।

तब शाखा पूर्वानुमान का उपयोग क्यों करें?

शाखाओं को हटाने पर शाखा पूर्वानुमान का उपयोग क्यों करें? आपको नहीं करना चाहिए यदि एक कंपाइलर शाखाओं को हटा सकता है, तो यह होगा (मानकीकरण सक्षम हैं), और यदि प्रोग्रामर शाखाएं हटा सकते हैं (मानते हैं कि यह पठनीयता को नुकसान नहीं पहुंचाता है या यह कोड का प्रदर्शन-महत्वपूर्ण टुकड़ा है), तो उन्हें चाहिए।

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

क्या कंपाइलर को शाखाओं के बिना असेंबली कोड उत्पन्न करने के लिए मजबूर करने का कोई तरीका है?

एक के अनुकूलन संकलक पहले से ही एक कार्यक्रम से शाखाओं को हटा देगा जब यह कर सकते हैं, लेकिन, जब तक कि हम एक बहुत ही सरल int main() {return 0;} प्रकार कार्यक्रम के बारे में बात कर रहे हैं (कार्यक्रम के शब्दों को बदले बिना), यह सब दूर करने के लिए असंभव है शाखाओं। लूप्स को शाखाओं की आवश्यकता होती है (जब तक वे अनियंत्रित नहीं होते हैं, लेकिन यह केवल तभी काम करता है जब आप समय से पहले पुनरावृत्तियों की संख्या जानते हों) और इसलिए यदि अधिकांश- और स्विच-कथन। यदि आप if एस, switch es और अपने प्रोग्राम में लूप की संख्या को कम कर सकते हैं, तो आप सभी को हटा नहीं पाएंगे।

या शाखा पूर्वानुमान को अक्षम करने के लिए ताकि सीपीयू? तो मैं दोनों परिणामों की तुलना कर सकते हैं?

मेरे सर्वोत्तम ज्ञान के लिए x86 या x86-64 CPUs पर शाखा पूर्वानुमान को अक्षम करना असंभव है। और जैसा कि मैंने कहा, यह प्रदर्शन में कभी भी सुधार नहीं करेगा (हालांकि यह अनुमान लगा सकता है, लेकिन आमतौर पर उन संदर्भों में आवश्यकता नहीं होती है जहां इन CPUs का उपयोग किया जाता है)।

+0

कुछ मामलों में एक छोटे-छोटे, कम लेकिन परिवर्तनीय गिनती लूप लाभहीन/सशर्त चाल के साथ अनियंत्रित रूप से पूर्ण (अधिकतम गणना) अनियंत्रित गणना के प्रभावों को "मास्किंग" कर सकते हैं। –

+0

उत्तर के लिए धन्यवाद। पाइपलाइन मुक्त flushing है? यदि एक गलतफहमी तो इसे बाहर निकाला जा सकता है। मैं हिट के लाभ को समझता हूं। लेकिन अगर सीपीयू याद आती है तो इसका मतलब यह नहीं होगा कि हम अभी भी पाइपलाइन को फ्लश करने के लिए कुछ चक्र का भुगतान करते हैं? –

+1

@ टोनीटैनस यह सटीक सीपीयू आर्किटेक्चर पर निर्भर करता है (जैसा कि ज्यादातर चीजें हम वास्तव में यहां बात कर रहे हैं), लेकिन मेरी समझ यह है कि आधुनिक सीपीयू पर पाइपलाइन को फ्लश करने में कोई प्रतीक्षा समय नहीं है। एक त्वरित Google खोज [इस आलेख] को लाती है (http://www.realworldtech.com/sandy-bridge/3/), जो इसकी पुष्टि करने के लिए प्रतीत होती है ("एक बार शाखा गलत भविष्यवाणी की जाने के बाद, कोर डिकोडिंग को पुन: प्रारंभ करने में सक्षम होता है जैसे ही सही पथ ज्ञात होता है, उसी समय जब आउट ऑफ़ ऑर्डर मशीन गलत तरीके से अनुमानित पथ से यूओएस को साफ़ कर रही है ... – sepp2k

5

आधुनिक प्रोसेसर में पाइपलाइन हैं जो सीपीयू को अन्यथा सक्षम करने की तुलना में बहुत तेज काम करने की अनुमति देती है। यह समांतरता का एक रूप है जहां निर्देश वास्तव में आवश्यक होने से पहले कुछ घड़ी चक्रों को निर्देश संसाधित करना शुरू कर देता है। अधिक जानकारी के लिए यहां here देखें।

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

आधुनिक CPUs चालाक को रोकने के दौरान पाइपलाइन भरते समय बिना शर्त कूदने के लिए बिना शर्त कूदने की बात आती है। ब्रांचिंग की बात आती है जब यह काम नहीं करता है क्योंकि सीपीयू को पता नहीं है कि कूद कहाँ जा रही है।

शाखा भविष्यवाणी अनुमान लगाकर इस समस्या को हल करने का प्रयास करती है कि सीपीयू किस शाखा को पूरी तरह से कूदने का मूल्यांकन करने से पहले पालन करेगी। यह (जब यह काम करता है) स्टाल को रोकता है।

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

+2

एक मामूली नाइटपिक: यहां तक ​​कि बिना शर्त कूद भी समस्याग्रस्त हो सकते हैं क्योंकि वे परिवर्तनीय हो सकते हैं (एमआईपीएस 'जार' के बारे में सोचें) या अप्रत्यक्ष (उदा। X86 'jmp [rbx]')। –

संबंधित मुद्दे