2012-07-12 12 views
10

मैंने लिखा है कि एक सी ++ प्रोग्राम प्रोफाइल करने के लिए gprof का उपयोग करने की प्रक्रिया में, मैंने देखा है कि निष्पादन समय का विशाल बहुमत फ़ंक्शन "frame_dummy" में बिताया जाता है। अधिक सटीक रूप से, जीप्रोफ के आउटपुट से फ्लैट प्रोफाइल में पहली प्रविष्टि में दिखाए गए नमूना समय का 76.38% और 24611191 नाम फ्रेम_डमी नाम के साथ एक समारोह में कॉल करता है।प्रोफाइलिंग के संदर्भ में frame_dummy का क्या अर्थ है?

संक्षेप में, मैं समझने की कोशिश कर रहा हूं कि फ्रेम_डमी किस संदर्भ में है - क्योंकि मेरे पास इस तरह का कोई फ़ंक्शन नहीं है - साथ ही मेरे अनुकूलन प्रयासों के लिए इसका क्या अर्थ है।

हालांकि यह प्रासंगिक होने की संभावना नहीं है, मुझे यह जोड़ना चाहिए कि यह प्रोग्राम मल्टीग्रिड एल्गोरिदम का उपयोग करके पोइसन समीकरण को हल करने के लिए डिज़ाइन किया गया है, और कार्य को समानांतर करने के लिए एमपीआई को नियोजित करता है। हालांकि, हालांकि एमपीआई फ़ंक्शन कॉल मौजूद हैं, ऊपर वर्णित gprof आउटपुट केवल एक ही प्रक्रिया को चलाने से लिया गया है। मुझे यह भी ध्यान रखना चाहिए कि मेरे प्रोग्राम में एमपीआई से अलग निर्भरता नहीं है और जी ++ 4.6.1 के साथ संकलित किया गया था।

+0

यह सी रनटाइम लाइब्रेरी का हिस्सा है। – Barmar

उत्तर

7

यहां एक बहुत अच्छी व्याख्या है: http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html। लेकिन मुझे यकीन नहीं है कि आपका प्रोग्राम फ्रेम_डमी में इतना समय क्यों व्यतीत करेगा, या इसे कई बार क्यों बुलाया जाएगा।

शायद आपकी बाइनरी में डीबग जानकारी किसी भी तरह से भ्रष्ट है, या gprof द्वारा गलत तरीके से हो रही है? या एमपीआईआई द्वारा जीप्रोफ को कबूल किया जा सकता है? कोशिश करने के लिए यहां कुछ है: अपना प्रोग्राम gdb में चलाएं, और frame_dummy फ़ंक्शन पर ब्रेकपॉइंट के साथ। देखें कि इसे वास्तव में 24 मिलियन बार कहा जाता है, और यदि ऐसा होता है, तो उसे क्या कहा जा रहा है।

इसके अलावा, क्या आप पुष्टि कर सकते हैं कि यह crtbegin.o में frame_dummy है, और कुछ अन्य frame_dummy नहीं है?

यहां the source for frame_dummy in crtbegin.c - कोड पढ़ने के द्वारा, इसे केवल एक बार बुलाया जाना चाहिए।

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

+0

लिंक के लिए धन्यवाद! –

+1

एडवर्ड, gprof को फ़ंक्शन नाम कैसे मिलता है? हो सकता है कि जॉन ने अपने स्वयं के प्रोग्राम संकलन में '-पीजी' विकल्प नहीं जोड़ा हो; लेकिन इसे जोड़ने के लिए जोड़ा गया। '-pg' के साथ' crtbegin' का उपयोग किया गया था; लेकिन उसके कोड में gprof instrumentation के लिए कोई कॉल नहीं है। – osgx

+0

महान प्रतिक्रिया के लिए धन्यवाद! आखिरकार मैंने उसी घटना की खोज की जो जोएल ने उल्लेख किया; -ओ 3 के साथ संकलन कुछ प्रकार के अनुकूलन करता है जो gprof को कई बार बुलाए जाने वाले कार्यों को फ्रेम_डमी के रूप में पढ़ने के कारण बनाता है। – Ben

4

मैं एक ही मुद्दे का सामना करना पड़ा, यहाँ gprof से मेरी उत्पादन होता है: मेरे मामले में

% cumulative self    self  total 
time seconds seconds calls ms/call ms/call name 
52.00  16.27 16.27 204000  0.08  0.08 frame_dummy 
47.46  31.12 14.85 418000  0.04  0.07 f2 
    0.51  31.28  0.16 21800  0.01  1.42 f1 
    0.03  31.29  0.01  1980  0.01 14.21 f5 

Each sample counts as 0.01 seconds. 
    % cumulative self    self  total 
time seconds seconds calls ms/call ms/call name 
53.12  22.24 22.24 200000  0.11  0.11 f4 
45.65  41.36 19.11 598000  0.03  0.03 f2 
    0.69  41.65  0.29 20000  0.01  1.45 f3 
    0.45  41.84  0.19 39800  0.00  0.32 f1 
    0.10  41.88  0.04        evaluate 

है, gprof frame_dummy के लिए समझ लिया f4: जब मैं gcc -Os बजाय gcc -O3 साथ संकलित, इसका समाधान नहीं किया गया।

+0

यह वही है जो समस्या थी, हालांकि वास्तव में ऐसा लगता था कि फ्रेम_डमी द्वारा कई अलग-अलग कार्यों को कम किया जा रहा था। हालांकि, यह थोड़ा निराशाजनक है, क्योंकि अनुकूलन बंद करना प्रोफ़ाइल संरचना को नाटकीय रूप से बदलता है क्योंकि संकलक अनुकूलन द्वारा भिन्न डिग्री से प्रभावित होते हैं। – Ben

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