2016-04-06 13 views
5

मैं अपने प्रश्न के साथ जितना स्पष्ट हो सकता हूं उतना स्पष्ट होने की कोशिश करूंगा (आसान नहीं ... यह मेरे लिए भी स्पष्ट नहीं है)। मान लीजिए आप यदि का एक सेट ... और फिर अनेक ऑपरेंड के साथ निर्देश है, उदाहरण के लिएगणितीय कार्यों की तुलना में सशर्त निर्देशों की निष्पादन गति

IF ((a==0) && (b==1) && (c==1)) THEN x=1 
ELSE IF ((a==0) && (b==0) && (c==1)) THEN x=2- 

और इतने पर

मान लीजिए मैं एक ही गणितीय समारोह x = a * n1 + b * n2 + c * n3 तरह से उन सभी आईएफएस की जगह सकता है (इस सिर्फ आपको एक विचार देने के लिए है, वास्तव में यह अधिक जटिल है, लेकिन आईएफ और ऑपरेंड भी बहुत अधिक हैं)

फ़ंक्शन पहले प्रशिक्षित कृत्रिम तंत्रिका नेटवर्क से आता है।

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

क्या आप इसकी पुष्टि कर सकते हैं? शायद मुझे कुछ लिंक भी प्रदान करें जहां मुझे स्पष्टीकरण मिल सके?

अग्रिम लोगों में आपका धन्यवाद!

+0

मुझे लगता है कि अपने आंत महसूस सही है:

यह कुछ अच्छी व्याख्या है लगता है। मैंने शाखाओं को खत्म करने से आश्चर्यजनक परिणामों के बारे में SO पर कुछ अनुकूलन प्रश्नों का पालन किया है। –

+0

https://en.wikipedia.org/wiki/Branch_predictor और जिन लेखों से यह लिंक है, वे एक शुरुआत प्रदान करेंगे। रिश्तेदार लाभ कार्य की जटिलता और बनाम संभावित शाखाओं पर निर्भर करते हैं, लेकिन आधुनिक प्रोसेसर, पाइपलाइनिंग और शाखा भविष्यवाणियों के साथ अक्सर प्रासंगिक होते हैं। – Peter

+2

शायद आपको पहले यह जांचना चाहिए कि आपका कंपाइलर [पहले से ही ऐसा नहीं कर सकता] (http://stackoverflow.com/questions/26124620/why-does-msvc-emit-a-useless-movsx-before-performing- यह-bit -टेस्ट) इससे पहले कि आप अपने कार्यक्रम को फेंक दें। और निश्चित रूप से * हमेशा * पहले सत्यापित करें कि यह वास्तव में * कर सकता है * एक अंतर बना सकता है, एक प्रोफाइलर का उपयोग करें। प्रोग्रामर का तानाशाह एक बार कटौती करने के लिए तीन बार मापना है। –

उत्तर

4

आपकी आंत महसूस सही है।

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

आधुनिक प्रोसेसर में शाखा पूर्वानुमानकर्ता काफी अच्छे हैं, लेकिन यदि आपके पास ऐसा कुछ है जो 50/50 संभावनाओं को एक तरफ जाने का मौका देता है, तो आपके पास बहुत सारे पाइपलाइन स्टॉल होंगे।

यही कारण है कि बयान अच्छे हैं, खासकर तंग लूप में। http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/

+0

आपको अपने उत्तर के लिए सोचो मैं इसे देख लूंगा! – Maxyone

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