2010-12-06 20 views
55

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

+0

इस विषय पर एक अच्छा ट्यूटोरियल क्या है? एक जी ++ स्विच आपको नहीं पता कि किसके लिए उपयोग करना है? – jalf

+0

-1 के लिए धन्यवाद। मैंने कुछ समय पहले '-फ्रोफाइल-आर्क्स' के साथ खेलने का प्रयास किया है। और इसने कुछ फाइलें बनाईं जिन्हें मैं समझता था कि शाखाओं की प्रोफाइलें थीं और इसी तरह ... लेकिन, मैंने आज 'फ्रोफाइल-यूज' और '-फ्रोफाइल-जेनरेशन' पर ठोकर खाई, इसलिए मैंने इस सवाल को पूछने के बारे में सोचा। मैं अपना प्रश्न संपादित करूंगा। – nakiya

+6

यह क्यों कम हो रहा है और बंद करने के लिए वोट दिया गया है? यह एक बिल्कुल वैध सवाल है। – nico

उत्तर

44

-फ्रोफाइल-जेनरेशन प्रोफाइलिंग कोड के साथ आवेदन करेगा। एप्लिकेशन वास्तव में चल रहा है, कुछ निश्चित घटनाओं को लॉग इन करेगा जो प्रदर्शन में सुधार कर सकते हैं यदि यह उपयोग पैटर्न संकलन समय पर ज्ञात था। शाखाओं, इनलाइनिंग की संभावना इत्यादि, सभी को लॉग किया जा सकता है, लेकिन मुझे यह जानकारी नहीं है कि जीसीसी इस प्रकार कैसे लागू होता है।

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

+4

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

+0

मैं त्रुटि से छुटकारा नहीं पा सकता हूं। मैं जिस कमांड का उपयोग कर रहा हूं वह है 'gcc hello_world.c -o demo_fdo -fprofile- उपयोग -फ्रॉर्डर-ब्लॉक-एंड-विभाजन -ऑ 3 -फ्रोफाइल-सुधार -वॉक्वेज-मिस्चैच 'अभी भी कवरेज-मिस्चैच त्रुटि प्राप्त कर रहा है। मैं क्या गलत कर रहा हूं? –

1

मुश्किल बिट मेकफ़ाइल सेट कर रहा है।

आपको ऑब्जेक्ट फ़ाइलों के लिए निश्चित रूप से अलग आउटपुट निर्देशिका की आवश्यकता है। मैं उन्हें "प्रोफ़ाइल" और "रिलीज" नाम देने की अनुशंसा करता हूं। आपको * .gcda फ़ाइलों की प्रतिलिपि बनाना पड़ सकता है जो प्रोफाइल रन के परिणामस्वरूप होते हैं ताकि जीसीसी उन्हें रिलीज बिल्ड चरण में पा सके।

परिणाम लगभग निश्चित रूप से तेज़ होगा। यह शायद भी बड़ा होगा। -फ्रोफाइल-उपयोग विकल्प कई अन्य अनुकूलन चरणों को सक्षम बनाता है जो अन्यथा केवल -O3 द्वारा सक्षम होते हैं।

+0

क्या आप टिप्पणी कर सकते हैं कि कौन से अनुकूलन चरण हैं? या कुछ दस्तावेज़ उद्धृत करें? – JohnTortugo

+1

@JohnTortugo: 'info gcc' और प्रोफ़ाइल उपयोग के लिए खोजें। यह कहता है: "निम्नलिखित विकल्प सक्षम हैं: -फ्रैंच-संभावनाएं', '-fvpt', '-फनोल-लूप', '' -फेल-लूप ' , '-फ्रैसर' ' –

17

this example से:

g++ -O3 -fprofile-generate [more params here, like -march=native ...] -o executable_name 
// run my program's benchmarks, or something to stress its most common path 
g++ -O3 -fprofile-use [more params here, like -march=native...] -o executable_name 

मूल रूप से, आप शुरू में संकलन और दोनों के संकलन और जोड़ने के लिए इस अतिरिक्त ध्वज के साथ लिंक: -fprofile-generate (here से)।

फिर, जब आप इसे चलाते हैं, तो डिफ़ॉल्ट रूप से यह आपकी .o फ़ाइलों में .gcda फ़ाइलें "अगली" बना देगा, ऐसा लगता है (हार्ड पथ को जहां वे बनाया गया था, हार्ड कोड किया गया था)।

आप वैकल्पिक रूप से बदल सकते हैं जहां यह इन .gcda फ़ाइलों को -fprofile-dir = XXX setting के साथ बनाता है।

फिर आप -fprofile-use पैरामीटर का उपयोग करके संकलित और रिलिकिंक कर सकते हैं, और यह प्रोफ़ाइल निर्देशित भलाई का उपयोग करके इसे संकलित करता है।

+1

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

+0

मैं त्रुटि से छुटकारा नहीं पा सकता हूं। मैं जिस कमांड का उपयोग कर रहा हूं वह है 'gcc hello_world.c -o demo_fdo -fprofile-use -freorder-block-and-partition -O3 -fprofile-correction -Wcoverage-mismatch' अभी भी कवरेज-मिस्चैच त्रुटि प्राप्त कर रहा है। मैं क्या गलत कर रहा हूं? –

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