5

यह प्रश्न सी ++ के लिए विशिष्ट नहीं है, AFAIK जावा आरई जैसे कुछ रनटाइम फ्लाई पर प्रोफाइल-निर्देशित अनुकूलन कर सकते हैं, मुझे इसमें भी रूचि है।क्या कंपाइलर द्वारा किए गए प्रोफाइल-निर्देशित अनुकूलन को प्रोफाइलिंग डेटासेट से कवर न किए गए मामलों को विशेष रूप से चोट पहुंचाती है?

MSDN describes PGO इस तरह:

  1. मैं साधन मेरा कार्यक्रम और प्रोफाइलर के तहत इसे चलाने के लिए, तो
  2. संकलक प्रोफाइलर द्वारा इकट्ठा स्वचालित रूप से शाखाओं में पुनर्निर्माण करने के लिए डेटा का उपयोग करता है और इस तरह तरीका है कि शाखा misprediction कम हो जाता है में लूप और अक्सर चलाने वाले कोड को इसकी स्थानीयता

अब स्पष्ट रूप से प्रोफाइलिंग परिणाम डेटासेट पर निर्भर करेगा।

सामान्य मैनुअल प्रोफाइलिंग और ऑप्टिमाइज़ेशन के साथ मुझे कुछ बाधाएं मिलती हैं और उन बाधाओं में सुधार होता है और संभवतः अन्य सभी कोड छूटे रहते हैं। पीजीओ शायद ही कभी रन कोड धीमा बनाने की कीमत पर रन कोड में सुधार करता है।

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

+0

मुझे पता है कि यह स्पष्ट लगता है, लेकिन अंगूठे के नियम के रूप में, आपको वास्तविक दुनिया डेटा पर संचालन करते समय प्रोफाइलिंग करने की कोशिश करनी चाहिए, कम से कम कोशिश करना (कम से कम कोशिश करना) सभी संभावित डेटा-पथ को कवर करना। – CAFxX

उत्तर

0

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

मैंने जो देखा है वह यह है कि टीम अपने उच्च प्राथमिकता परिदृश्यों की पहचान करती है। फिर वे ऑप्टिमाइज़ेशन प्रोफाइलर को प्रशिक्षित करने और सुधार को मापने के लिए चलाते हैं। आप पीजीओ के तहत सभी परिदृश्यों को चलाने के लिए नहीं चाहते हैं क्योंकि यदि आप ऐसा करते हैं तो आप किसी भी तरह से नहीं चल सकते हैं।

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

9

अस्वीकरण: मैंने पीजीओ के साथ इसे पढ़ने के बजाय और अधिक नहीं किया है और इसे मज़े के लिए नमूना प्रोजेक्ट के साथ एक बार करने की कोशिश की है। निम्नलिखित में से कई मेरे अनुभव पर आधारित हैं "गैर-पीजीओ" अनुकूलन और शिक्षित अनुमान। टीएल; नीचे डीआर।

This page पीजीओ द्वारा किए गए अनुकूलन सूचीबद्ध करता है। चलो उन्हें एक-एक करके देखो (प्रभाव के आधार पर वर्गीकृत):

इनलाइन - उदाहरण के लिए, यदि वहां मौजूद एक समारोह एक कि अक्सर समारोह बी कहता है, और समारोह बी अपेक्षाकृत छोटे प्रोफ़ाइल है, तो -guided अनुकूलन समारोह ए में समारोह बी इनलाइन जाएगा

रजिस्टर आवंटन - बेहतर आवंटन रजिस्टर में प्रोफ़ाइल डेटा परिणामों के साथ अनुकूलन।

आभासी कॉल अटकलें - एक समारोह सूचक माध्यम से एक आभासी कॉल, या अन्य कॉल, अक्सर एक निश्चित समारोह लक्षित करता है, एक प्रोफ़ाइल निर्देशित अनुकूलन अक्सर-लक्षित कार्य करने के लिए एक सशर्त-निष्पादित प्रत्यक्ष कॉल सम्मिलित कर सकते हैं , और प्रत्यक्ष कॉल रेखांकित किया जा सकता है।

ये स्पष्ट रूप से पूर्वानुमान को बेहतर बनाता है कि कुछ ऑप्टिमाइज़ेशन का भुगतान किया गया है या नहीं। गैर-प्रोफाइल कोड पथों के लिए कोई प्रत्यक्ष व्यापार नहीं।


बेसिक ब्लॉक अनुकूलन - बेसिक ब्लॉक अनुकूलन आमतौर पर निष्पादित करने की अनुमति देता बुनियादी ब्लॉक कि अस्थायी एक दिया सीमा के भीतर निष्पादित पृष्ठों (इलाके) के एक ही सेट में रखा जा रहा। यह उपयोग किए गए पृष्ठों की संख्या को कम करता है, इस प्रकार स्मृति ओवरहेड को कम करता है।

समारोह लेआउट - कॉल ग्राफ और प्रोफाइल कॉलर/कॉल प्राप्त करने वाला व्यवहार के आधार पर, कार्यों है कि एक ही निष्पादन मार्ग के किनारे हो जाते हैं एक ही अनुभाग में रखा जाता है।

मृत कोड पृथक्करण - कोड है कि रूपरेखा के दौरान नहीं बुलाया जाता है एक विशेष खंड है कि वर्गों के सेट के अंत में जोड़ा जाता है के लिए ले जाया जाता है। यह प्रभावी रूप से अक्सर उपयोग किए जाने वाले पृष्ठों से इस अनुभाग को रोकता है।

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

यह सब गैर-प्रोफाइल कोड पथों के इलाके को कम कर सकता है। मेरे अनुभव में, प्रभाव इस बात के बारे में उल्लेखनीय या गंभीर होगा यदि इस कोड पथ में एक तंग लूप है जो L1 कोड कैश से अधिक हो जाता है (और शायद L2 भी थ्रैश हो)। यह वास्तव में एक पथ की तरह लगता है जिसे एक पीजीओ प्रोफ़ाइल में शामिल किया जाना चाहिए :)

मृत कोड अलगाव का एक बड़ा प्रभाव हो सकता है - दोनों तरीकों से - क्योंकि यह डिस्क पहुंच को कम कर सकता है।

यदि आप तेजी से अपवादों पर भरोसा पर भरोसा करते हैं, तो आप इसे गलत कर रहे हैं।


आकार/स्पीड अनुकूलन - कार्य जहां कार्यक्रम खर्च करता है बहुत समय की गति के लिए अनुकूलित किया जा सकता है। ।

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


सशर्त शाखा अनुकूलन - मूल्य जांच के साथ, प्रोफ़ाइल निर्देशित अनुकूलन अगर एक स्विच बयान में दिए गए मूल्य अन्य मूल्यों की तुलना में अक्सर प्रयोग किया जाता है पा सकते हैं। फिर यह मूल्य स्विच स्टेटमेंट से बाहर खींच लिया जा सकता है। अगर/अन्य निर्देशों के साथ वही विकल्प किया जा सकता है जहां ऑप्टिमाइज़र if/else को ऑर्डर कर सकता है ताकि या तो अगर ब्लॉक या अन्य ब्लॉक पहले रखा गया हो, तो कौन सा ब्लॉक अधिक बार सत्य होता है।

मैं इसे "बेहतर भविष्यवाणी" के तहत भी फाइल करूंगा, जब तक कि आप गलत पीजीओ जानकारी नहीं खिलाते।

विशिष्ट मामले में, जहां इस एक बहुत भुगतान कर सकते हैं समय पैरामीटर/रेंज मान्यता और समान पथ है कि एक सामान्य निष्पादन में कभी नहीं लिया जाना चाहिए चलाए जा रहे हैं।

तोड़ने मामला होगा:

if (x > 0) DoThis() else DoThat(); 
एक प्रासंगिक तंग पाश में

और रूपरेखा केवल x> 0 मामला।


मेमोरी intrinsics - intrinsics के विस्तार बेहतर फैसला किया जा सकता है अगर यह निर्धारित किया जा सकता है एक आंतरिक अक्सर कहा जाता है यदि। चाल या प्रतियों के ब्लॉक आकार के आधार पर एक आंतरिक भी अनुकूलित किया जा सकता है।

फिर से, अधिकतर अनचाहे डेटा को दंडित करने की एक छोटी संभावना के साथ बेहतर जानकारी प्रदान करता है।

उदाहरण: - यह सब एक "शिक्षित अनुमान" है, लेकिन मुझे लगता है कि यह पूरे विषय के लिए काफी चित्रकारी है।

मान लें कि आपके पास memmove है जिसे हमेशा 16 बाइट्स की लंबाई के साथ अच्छी तरह से गठबंधन गैर-ओवरलैपिंग बफर पर बुलाया जाता है।

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

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

दंड comparedly छोटे, हालांकि है: PGO बिना सामान्य मामले में, आप या तो हमेशा पूर्ण memmove कॉल करें, या पूर्ण memmove कार्यान्वयन Nline होगा। ऑप्टिमाइज़ेशन कुछ जटिल (कुछ सशर्त कूद सहित) को कुछ जटिल में जोड़ता है, मैं सबसे ज्यादा 10% ओवरहेड मानता हूं। ज्यादातर मामलों में, कैश पहुंच के कारण ये 10% शोर से नीचे होंगे।

हालांकि, वहाँ महत्वपूर्ण प्रभाव के लिए एक बहुत मामूली मामूली मौका अगर अप्रत्याशित शाखा अक्सर एक साथ लिया जाता है और अतिरिक्त निर्देशों की उम्मीद मामले के लिए डिफ़ॉल्ट मामले के लिए निर्देश के साथ एल 1 कोड के बाहर एक तंग पाश धक्का है कैश

ध्यान दें कि आप पहले से ही संकलक के लिए क्या कर सकते हैं इसकी सीमाओं पर हैं। कोड के कैश में कुछ के मुकाबले अतिरिक्त निर्देशों को कुछ बाइट्स होने की उम्मीद की जा सकती है। एक स्थिर ऑप्टिमाइज़र उसी भाग्य को हिट कर सकता है इस पर निर्भर करता है कि यह कितनी अच्छी तरह से invariants उछाल सकता है - और आप इसे कितना देते हैं।


निष्कर्ष:

  • अनुकूलन के कई तटस्थ हैं।
  • कुछ अनुकूलन गैर प्रोफाइल कोड रास्तों
  • प्रभाव आम तौर पर बहुत संभव लाभ
  • , शायद ही कभी एक छोटा सा प्रभाव अन्य योगदान रोग कारकों
  • कुछ पर बल दिया जा सकता है की तुलना में छोटा होता है पर थोड़ा नकारात्मक प्रभाव पड़ सकता अनुकूलन (यानी, कोड वर्गों के लेआउट) बड़ा प्रभाव डाल सकता है, लेकिन फिर संभव लाभ signidicantly outweight कि

मेरे पेट लग रहा है आगे का दावा है कि

  • एक स्थिर अनुकूलक, एक पूरे पर, कम से कम समान रूप से एक रोग मामले
  • यह बहुत वास्तव में करना कठिन होगा भी बुरा PGO इनपुट के साथ प्रदर्शन को नष्ट बनाने की संभावना होगी।

कि स्तर पर, मैं PGO कार्यान्वयन की भी बहुत कुछ डर होगा कीड़े/विफल PGO अनुकूलन के तुलना में कमियों।

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