दिलचस्प पोस्ट
जावास्क्रिप्ट में ऑब्जेक्ट्स को सीरियललाइज़ / अनसियलाइज़ करने का सबसे अच्छा तरीका? एक कॉलम (लम्बी प्रारूप) में माप स्तंभ (चौड़े प्रारूप) के एकाधिक सेटों को फिर से करना एंड्रॉइड: गतिविधि / क्लासनोटफ़ाउंड अपवाद को इन्स्तांत करने में असमर्थ JQuery के साथ AJAX अनुरोध में हैडर जोड़ें फ़ाइल या विधानसभा को लोड नहीं किया जा सका … पैरामीटर गलत है jQuery 1.8 ईवेंट हैंडलर्स ढूंढें क्यों JVM अभी भी पूंछ कॉल अनुकूलन का समर्थन नहीं करता है? एक गैर अच्छी तरह से बनाई संख्यात्मक मूल्य का सामना करना पड़ा मेटप्ललिब स्कैटर प्लॉट में एक लॉगरिदमिक कलरबार सभी शाखाओं को खींचने और पुश करने के लिए git सेट करें तैयार PDO वक्तव्य का उपयोग करके मैं पैरामीटर से कैसे तय कर सकता / सकती हूं? पोस्टग्रेएसक्यूएल: टेक्स्ट और वर्कर के बीच का अंतर (चरित्र बदलता है) कार्य का उपयोग करता है (टीपीएल) पुस्तकालय एक आवेदन multithreaded बनाते हैं? मैं कॉलिंग विधि का नाम कैसे प्राप्त करूं और प्रतिबिंब का उपयोग करूँ? कैसे jquery कुकी में एक सरणी को स्टोर करने के लिए?

शाखा की भविष्यवाणी विफलता के लिए एक सशर्त कदम कमजोर क्यों नहीं है?

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

धन्यवाद।

वेब के समाधान से एकत्रित समाधान "शाखा की भविष्यवाणी विफलता के लिए एक सशर्त कदम कमजोर क्यों नहीं है?"

गलत पूर्वानुमानित शाखाएं महंगे हैं

एक आधुनिक प्रोसेसर आम तौर पर प्रत्येक चक्र के बीच प्रत्येक चक्र के एक या तीन निर्देशों के बीच निष्पादित करता है (अगर यह पिछले निर्देशों से आने या इन्हें स्मृति से इन निर्देशों के लिए डेटा निर्भरता की प्रतीक्षा नहीं करता है)।

उपरोक्त कथन तंग छोरों के लिए अच्छी तरह से आश्चर्यजनक रूप से अच्छी तरह से रखता है, लेकिन इससे आपको एक अतिरिक्त निर्भरता को अंधा नहीं करना चाहिए जो उसके चक्र के समय निष्पादित होने वाले निर्देश को रोक सकें: एक निर्देश जो निष्पादित हो, प्रोसेसर को लाने और व्याख्या करना यह 15-20 चक्र पहले

जब एक शाखा का सामना हो जाता है तो प्रोसेसर को क्या करना चाहिए? दोनों लक्ष्यों को प्राप्त करना और डीकोड करना पैमाने पर नहीं है (अगर अधिक शाखाएं हैं, तो समानांतर में पथों की एक घातीय संख्या को प्राप्त करना होगा) इसलिए प्रोसेसर केवल दो शाखाओं में से किसी एक को प्राप्त करता है और decodes करता है, अनुमान लगाता है।

यही कारण है कि गलत अनुमान वाली शाखाएं महंगे हैं: इन्हें 15-20 चक्रों की लागत होती है जो आमतौर पर एक कुशल निर्देश पाइपलाइन के कारण अदृश्य हो जाती हैं।

सशर्त कदम कभी भी बहुत महंगा नहीं है

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

ध्यान दें कि मेमोरी से रजिस्टर करने के लिए एक सशर्त कदम कभी-कभी एक खतरनाक शर्त हो सकता है: यदि स्थिति ऐसी होती है कि मेमोरी से पढ़ा जाने वाला मान रजिस्टर को नहीं सौंपा जाता है, तो आप कुछ भी नहीं के लिए स्मृति पर इंतजार कर रहे हैं। लेकिन अनुदेश सेट में दी गई सशर्त चाल निर्देश आमतौर पर रजिस्टर करने के लिए पंजीकृत होते हैं, इस गलती को प्रोग्रामर के हिस्से से रोकते हैं।

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

cmov

  add eax, ebx cmp eax, 0x10 cmovne ebx, ecx add eax, ecx 

फिलहाल कि एएसएम-निर्देश का मूल्यांकन किया जाता है, पूर्ववर्ती सीएमपी निर्देश का नतीजा अभी तक नहीं पता है।

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

अगला अनुदेश cmov से पहले भी निष्पादित हो सकता है (मेरे उदाहरण में यह सुरक्षित होगा)

डाली

  add eax, ebx cmp eax, 0x10 je .skip mov ebx, ecx .skip: add eax, ecx 

इस मामले में, जब सीपीयू के डिकोडर को देखता है। je .skip यह चुनना होगा कि क्या अगले je .skip से प्रीफ़ेचिंग / डिकोडिंग निर्देश जारी रखना है या 1), या 2) जंप लक्ष्य से। सीपीयू अनुमान लगाएगा कि यह अग्रेषित सशर्त शाखा नहीं होगी, इसलिए अगली अनुदेश mov ebx, ecx पाइप लाइन में जाएंगे।

बाद में कुछ चक्र, je .skip निष्पादित होता है और शाखा ली जाती है। ओह बकवास! हमारी पाइपलाइन अब कुछ यादृच्छिक कबाड़ रखती है जिसे कभी भी निष्पादित नहीं किया जाना चाहिए। CPU को उसके सभी कैश किए गए निर्देशों को फ्लश करना होगा और .skip: से .skip: :।

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

वास्तव में परिणाम अभी तक ज्ञात नहीं हो सकता है, लेकिन यदि अन्य परिस्थितियों (विशेष रूप से निर्भरता श्रृंखला) की अनुमति दी जाती है तो सीपीयू cmov निर्देशों को पुन: क्रमबद्ध और निष्पादित कर सकता है। चूंकि इसमें कोई शाखा नहीं है, इसलिए उन निर्देशों का मूल्यांकन किसी भी मामले में किया जाना चाहिए।

इस उदाहरण पर विचार करें:

 cmoveq edx, eax add ecx, ebx mov eax, [ecx] 

cmov बाद दिए गए दो निर्देश cmov के परिणाम पर निर्भर नहीं होते हैं, इसलिए उन्हें cmov ही लंबित होने पर भी निष्पादित किया जा सकता है (इसे ऑर्डर निष्पादन से बाहर कहा जाता है )। यहां तक ​​कि अगर उन्हें निष्पादित नहीं किया जा सकता है, तो भी उन्हें प्राप्त किया जा सकता है और डीकोड किया जा सकता है।

एक शाखा का संस्करण हो सकता है:

  jne skip mov edx, eax skip: add ecx, ebx mov eax, [ecx] 

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

आपको ये पढ़ना चाहिए। कोहरा + इंटेल के साथ, बस सीएमओवी की खोज करें

सीएनओवी सीरसा 2007 की लिनस टॉर्वाल्ड की आलोचना
एग्नेर कोहरे की तुलना माइक्रोएरिकटक्चर्स
इंटेल 64 और आईए -32 आर्किटेक्चर अनुकूलन संदर्भ मैनुअल

संक्षिप्त उत्तर, सही भविष्यवाणियां 'मुफ़्त' हैं जबकि सशर्त शाखा गलत तरीके से होसवेल पर 14-20 चक्र खर्च कर सकते हैं। हालांकि, सीएमओवी कभी मुफ्त नहीं है फिर भी मुझे लगता है कि सीएमओवी एक बहुत बेहतर समय है जब उस समय टोवरल्ड्स का कब्जा था। सभी प्रोसेसर पर सभी समय के लिए कोई एक भी सही नहीं है।