शाखा भविष्यवाणी अनुकूलन के लिए कौन सा कोड बेहतर है?


10

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

ध्यान दें कि bRareExceptionPresent एक असामान्य स्थिति का प्रतिनिधित्व करता है। यह तर्क का सामान्य मार्ग नहीं है।

/* MOST COMMON path must branch around IF clause */

bool SomeFunction(bool bRareExceptionPresent)
{
  // abort before function
  if(bRareExceptionPresent)
  {
     return false;
  }    
  .. function primary body ..    
  return true;
}

/* MOST COMMON path does NOT branch */

bool SomeFunction(bool bRareExceptionPresent)
{
  if(!bRareExceptionPresent)
  {
    .. function primary body ..
  }
  else
  {
    return false;
  }
  return true;
}

9
मैं यहां एक अंग पर जा रहा हूं और कहता हूं कि कोई अंतर नहीं है।
रॉबर्ट हार्वे

7
यह संभवतः उस विशिष्ट सीपीयू पर निर्भर करता है जिसे आप के लिए संकलित कर रहे हैं, क्योंकि उनके पास अलग-अलग पाइपलाइनिंग आर्किटेक्चर हैं (देरी स्लॉट बनाम कोई देरी स्लॉट नहीं)। आपके द्वारा इस बारे में सोचने में बिताया गया समय चलने के समय - प्रोफ़ाइल पहले, फिर ऑप्टिमाइज़ किए जाने के समय की तुलना में बहुत अधिक है।

2
यह लगभग निश्चित रूप से समय से पहले सूक्ष्म अनुकूलन है।
रॉबर्ट हार्वे

2
@MichaelT हां, प्रोफाइलिंग वास्तव में एकमात्र विश्वसनीय तरीका है जो यह जानता है कि वास्तव में लक्ष्य के लिए कोड के लिए प्रदर्शन के साथ क्या हो रहा है, मंच, इसके संदर्भ में। हालांकि, मैं उत्सुक था कि क्या आम तौर पर पसंद किया जाता था।
dyasta

1
@ रोबर्टहाइव: यह समय से पहले सूक्ष्म अनुकूलन है, ऐसे मामलों को छोड़कर , जहां दोनों स्थितियां मिलती हैं: (1) लूप को अरबों (लाखों नहीं) कहा जाता है; और (2) विडंबना यह है कि जब लूप बॉडी मशीन कोड के संदर्भ में छोटी है। हालत # 2 का मतलब है कि उपयोगी कार्य पर खर्च किए गए समय की तुलना में ओवरहेड पर बिताए गए समय का अंश महत्वहीन नहीं है । अच्छी खबर यह है कि आमतौर पर, ऐसी स्थितियों में जहां दोनों स्थितियों को पूरा किया जाता है, SIMD (वैश्वीकरण), जो कि प्रकृति शाखाहीन है, सभी प्रदर्शन मुद्दों को हल करेगा।
रॉवॉन्ग

जवाबों:


10

आज की दुनिया में, यह बहुत मायने नहीं रखता, अगर यह बिल्कुल भी।

डायनामिक ब्रांच प्रेडिक्शन (दशकों के बारे में कुछ सोचा जाता है ( 1996 में प्रकाशित डायनामिक ब्रांच प्रेडिक्शन स्कीम्सन सिस्टम वर्कलोड का विश्लेषण देखें ) काफी सामान्य जगह हैं।

इसका एक उदाहरण एआरएम प्रोसेसर में पाया जा सकता है। शाखा की भविष्यवाणी पर शाखा जानकारी केंद्र से

शाखा भविष्यवाणी सटीकता में सुधार करने के लिए, स्थिर और गतिशील तकनीकों का एक संयोजन कार्यरत है।

प्रश्न तो यह है कि "आर्म प्रोसेसर में गतिशील शाखा की भविष्यवाणी क्या है?" डायनामिक ब्रांच की भविष्यवाणी के कंटिन्यूड रीडिंग से पता चलता है कि यह 2 बिट प्रेडिक्शन स्कीम (कागज में वर्णित) का उपयोग करता है, इस बारे में जानकारी बनाता है कि ब्रांच को जोरदार या कमजोर तरीके से लिया गया है या नहीं।

समय के साथ (और समय के साथ मेरा मतलब है कि उस ब्लॉक से कुछ गुजरता है) यह जानकारी बनाता है कि कोड किस रास्ते पर जाएगा।

के लिए स्थिर भविष्यवाणी , यह जिस तरह से कोड ही है और जो रास्ता दिखता शाखा परीक्षण पर किया जाता है पर लग रहा है - पिछले एक अनुदेश करने के लिए या एक कोड में आगे:

ARM1136JF-S प्रोसेसर में उपयोग की जाने वाली योजना की भविष्यवाणी है कि सभी अग्रेषित सशर्त शाखाएं नहीं ली गई हैं और सभी पिछड़ी शाखाओं को लिया गया है। सभी शाखाओं में से लगभग 65% पूरी तरह से भविष्यवाणी किए जाने के लिए पर्याप्त गैर-शाखा चक्रों से पहले हैं।

जैसा कि स्पार्की ने उल्लेख किया है, यह उस समझ पर आधारित है जो लूप से अधिक बार लूप होती है। लूप शाखाएं पीछे की ओर होती हैं (लूप के अंत में इसकी एक शाखा होती है जो इसे शीर्ष पर पुनः आरंभ करने के लिए होती है) - यह सामान्य रूप से होती है।

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

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


7
एक प्रसिद्ध स्टैकओवरफ़्लो प्रश्न से पता चला कि शाखा भविष्यवाणी आज भी मायने रखती है।
फ्लोरियन मार्गाइन

3
@FlorianMargaine जब यह मायने रखता है, तो यह एक ऐसी स्थिति में हो रहा है जहां यह वास्तव में मायने रखता है कि आप क्या समझ रहे हैं और यह कैसे काम करता है (हाथ बनाम x86 बनाम mips ...) की समझ की आवश्यकता होती है। लेखन कोड शुरू में इस माइक्रो-ऑप्टिमाइज़ेशन को करने की कोशिश कर रहा है, संभवतः गलत परिसर से काम कर रहा है और वांछित प्रभाव प्राप्त नहीं कर रहा है।

खैर, चलो डीके बोली नहीं। लेकिन मुझे लगता है कि यह सवाल स्पष्ट रूप से अनुकूलन के अर्थ में था, जब आप पहले से ही प्रोफाइलिंग स्टेज से गुजर चुके हैं। :-)
फ्लोरियन मार्गाइन

2
@MichaelT अच्छा जवाब, और मैं आपके निष्कर्ष से बहुत सहमत हूं। इस तरह के पूर्व-प्रोफाइलिंग / अमूर्त अनुकूलन निश्चित रूप से प्रति-उत्पादक हो सकते हैं। यह एक अनुमान लगाने का खेल है, जिससे कोई तर्कहीन कारणों से डिजाइन निर्णय ले सकता है। फिर भी, मैंने खुद को जिज्ञासु पाया; ओ
रंगस्ता


9

मेरी समझ यह है कि पहली बार सीपीयू एक शाखा का सामना करता है, यह भविष्यवाणी करेगा (यदि समर्थित है) कि आगे शाखाएं नहीं ली गई हैं और पीछे की शाखाएं हैं। इसके लिए तर्क यह है कि लूप्स (जो आमतौर पर शाखा की ओर पीछे होते हैं) ग्रहण किए जाते हैं।

कुछ प्रोसेसरों पर, आप असेंबली इंस्ट्रक्शन में संकेत दे सकते हैं कि किस रास्ते पर अधिक संभावना है। इस समय का विवरण मुझे बच जाता है।

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

__builtin_expect((long)!!(x), 1L)  /* GNU C to indicate that <x> will likely be TRUE */
__builtin_expect((long)!!(x), 0L)  /* GNU C to indicate that <x> will likely be FALSE */

उम्मीद है की यह मदद करेगा।


3
"मेरी समझ यह है कि पहली बार सीपीयू एक शाखा का सामना करता है, यह भविष्यवाणी करेगा (यदि समर्थित है) कि आगे शाखाएं नहीं ली गई हैं और पीछे की शाखाएं हैं।" यह एक बहुत ही दिलचस्प विचार है। क्या आपके पास कोई सबूत है कि यह वास्तव में आम आर्किटेक्चर में लागू किया गया है?
ब्लूब

5
सीधे घोड़े के मुंह से: आगे की शाखा में चूक नहीं की जाएगी। एक पिछड़ी शाखा को लिया गया चूक । और उसी पृष्ठ से: "उपसर्ग 0x3E - सांख्यिकीय रूप से एक शाखा की भविष्यवाणी करें"।
मसलक

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