मेरे पास एक सी ++ प्रोजेक्ट है जो ईजिन मैट्रिक्स लाइब्रेरी का उपयोग करता है। प्रदर्शन में सुधार के लिए मुझे इसके लिए एक प्रोफ़ाइल प्राप्त करने की आवश्यकता है। मैंने gprof का उपयोग करने का प्रयास किया है, लेकिन प्रोफ़ाइल में इस तरह के परिणामों का एक समूह है, जहां इसे "सहज" के रूप में चिह्नित किया गया है:

                                                 <spontaneous>
[1]     48.8 2535.09 38010.25                 GaugeField::read_lime_gauge_field_doubleprec_timeslices(double*, char const*, long, long) [1]
             20857.12    0.00 3419496363/5297636514     Eigen::internal::gebp_kernel<std::complex<double>, std::complex<double>, long, Eigen::internal::blas_data_mapper<std::complex<double>, long, 0, 0>, 1, 4, false, false>::operator()(Eigen::internal::blas_data_mapper<std::complex<double>, long, 0, 0> const&, std::complex<double> const*, std::complex<double> const*, long, long, long, std::complex<double>, long, long, long, long) [2]
             5844.01 11309.11 3350517373/3366570904     Eigen::internal::gebp_kernel<std::complex<double>, std::complex<double>, long, Eigen::internal::blas_data_mapper<std::complex<double>, long, 0, 0>, 1, 4, true, false>::operator()(Eigen::internal::blas_data_mapper<std::complex<double>, long, 0, 0> const&, std::complex<double> const*, std::complex<double> const*, long, long, long, std::complex<double>, long, long, long, long) [4]

कभी-कभी Eigen पर सीधे कॉल को स्वतःस्फूर्त रूप से चिह्नित किया जाता है।

मैं ८५% समय ऐसे हिस्सों में बिताता हूँ जो स्वतःस्फूर्त के रूप में चिह्नित हैं। यह बहुत अधिक उपयोग नहीं है क्योंकि मुझे पहले से ही पता है कि मेरे टेंसर संकुचन कोड में Eigen को कॉल करना सबसे महंगा होगा। मुझे यह जानना होगा कि ये कॉल मेरे कोड के किस हिस्से से आती हैं।

क्या मेरे प्रोग्राम से gprof को अधिक उपयोगी जानकारी निकालने का कोई तरीका है?

1
Martin Ueding 13 मई 2019, 13:22

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा लगता है कि सभी अनुकूलन को हटाए बिना सादे gprof के साथ इसे प्राप्त करने का वास्तव में कोई तरीका नहीं है। यह निश्चित रूप से प्रदर्शन माप को कम करेगा और बेकार होगा।

मैंने बस थोड़ा सा कोड लिखना समाप्त कर दिया जो कॉल को पदानुक्रमित तरीके से ट्रैक करता है। कार्यक्रम में अब कार्यों के शीर्ष पर परिभाषित TimingScope<3>("Diagram::request"); वस्तुओं का एक समूह है। ये तब खुद को एक सिंगलटन के लिए चल रहे फ़ंक्शन कॉल के रूप में पंजीकृत करेंगे। उस वस्तु का विनाशक तब समय को रोक देगा और इसे दिए गए नोड और किनारे के समय में जोड़ देगा और इसे माता-पिता के स्वयं के समय से घटा देगा। मैं आउटपुट उत्पन्न करने के लिए एक पायथन स्क्रिप्ट का उपयोग करता हूं जैसे gprof2dot देता है:

इसने हमें प्रोग्राम को gprof की तुलना में और भी अधिक संदर्भ के साथ समझने की अनुमति दी, अगर यह हमारे लिए काम करता।

0
Martin Ueding 31 अक्टूबर 2019, 15:48