कॉलग्रिंड के साथ प्रोफाइलिंग सीएफडी कोड


16

मैं अपने द्वारा लिखे गए एक सॉल्वर को प्रोफ़ाइल करने के लिए Valgrind + Callgrind का उपयोग कर रहा हूँ। जैसा कि Valgrind उपयोगकर्ता मैनुअल बताता है, मैंने अपना कोड कंपाइलर के डिबगिंग विकल्पों के साथ संकलित किया है:

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

वालग्रिंड मैनुअल

जब डिबगिंग विकल्प के साथ संकलित किया जाता है, तो कोड बहुत धीमी गति से चलते हैं। CFD कोड, छोटे-छोटे मामलों के लिए भी बहुत धीमा हो जाता है, जब डिबगिंग झंडे के साथ संकलित किया जाता है। Valgrind इसे 40x धीमा बनाता है (मैनुअल 1 देखें )।

  1. कोड प्रोफाइलिंग (प्रोफाइलिंग, बेंचमार्किंग नहीं) के लिए आप कौन से टूल का उपयोग कर रहे हैं?

  2. आप कोड को कितने समय तक चलने देते हैं (आंकड़े: कितने समय के कदम)?

  3. कितने बड़े मामले हैं (यदि मामला कैश में फिट बैठता है, तो सॉल्वर परिमाण के आदेशों को तेजी से बढ़ाता है, लेकिन फिर मैं स्मृति प्रक्रियाओं को याद करूंगा)?


3
आप कोड को डिबगिंग प्रतीकों और सक्षम ऑप्टिमाइज़ेशन के साथ संकलित कर सकते हैं। अभी भी, 40x वैलग्राइंड (जो सभी मेमोरी एक्सेस को अनुकरण करता है) के माध्यम से अनुचित नहीं है।
एरन अहमदिया

धन्यवाद, यह वही है जो मैंने पढ़ा है ... जो मैं जानना चाहता हूं वह प्रोफाइलिंग में हर दिन के अनुभवों के बारे में जानकारी देता है (अधिमानतः) के साथ रिपोर्ट के लिए इंतजार करने के लिए कितना समय सामान्य है, कितने पुनरावृत्ति मायने रखता है कि मुझे क्या चाहिए, मैं बाहर क्या कर सकता हूं ... आदि ...
11

आपका प्रश्न भी थोड़ा व्यापक है। मैं आपके प्रश्न को संपादित करने की सलाह देता हूं कि आप Q2.1 और Q2.2 पर ध्यान केंद्रित करें, क्योंकि Q1 एक पूरी तरह से अलग प्रश्न है (मैं आपको इसे अलग से पूछने के लिए खुश हूं, यह एक अच्छा है, लेकिन इसे वाक्यांश के रूप में "आपको कौन से उपकरण चाहिए" समस्या को हल करने के लिए उपयोग करें X ", जहां X को अच्छी तरह से वर्णित किया गया है!), जबकि स्वयं पर Q2 बहुत सामान्य है।
एरन अहमदिया

तुम भी नाम को संपादित कर सकते हैं callgrind, cachegrindया massif। बहुत से लोग Valgrind को केवल डिफ़ॉल्ट टूल ( memcheck) के साथ जोड़ते हैं । एक इम्यूलेशन-आधारित (व्यवधान-आधारित) प्रोफाइलिंग प्रणाली के बजाय, आपको लंबे समय तक चलने की आवश्यकता नहीं होनी चाहिए।
जेड ब्राउन

@ एरन एंड जेड: सुझावों के लिए धन्यवाद, मैंने प्रश्न संपादित किया है। :)
टेमरिक

जवाबों:


11

Q1: कोड प्रोफाइलिंग (प्रोफाइलिंग, बेंचमार्किंग नहीं) के लिए आप कौन से टूल का उपयोग कर रहे हैं?

Q2: कब तक आप कोड को चलाने दें (आंकड़े: कितने समय के कदम)?

Q3: कितने बड़े मामले हैं (यदि मामला कैश में फिट बैठता है, तो सॉल्वर तेजी से परिमाण के आदेश है, लेकिन फिर मैं स्मृति संबंधित प्रक्रियाओं को याद करूंगा)?

यहाँ एक उदाहरण है कि मैं इसे कैसे करता हूँ।

मैं बेंचमार्किंग (यह देखते हुए कि इसमें कितना समय लगता है) को अलग करना (पहचान करना कि इसे कैसे तेज किया जाए)। यह महत्वपूर्ण नहीं है कि प्रोफाइलर तेज हो। यह महत्वपूर्ण है कि यह आपको बताए कि क्या ठीक करना है।

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

मेरे द्वारा उपयोग की जाने वाली विधि यादृच्छिक ठहराव है, और यहां एक पूरा मामला अध्ययन और स्लाइड शो है । प्रोफाइलर-टोंटी दुनिया के दृश्य का हिस्सा यह है कि अगर आपको कुछ नहीं मिलता है, तो कुछ भी नहीं मिल रहा है, और यदि आप कुछ पाते हैं और एक निश्चित प्रतिशत गति प्राप्त करते हैं, तो आप जीत की घोषणा करते हैं और छोड़ देते हैं। प्रोफाइलर प्रशंसक लगभग कभी नहीं कहते हैं कि उन्हें कितना स्पीडअप मिलता है, और विज्ञापन केवल कृत्रिम रूप से होने वाली समस्याओं को दिखाते हैं जिन्हें खोजने में आसान होना चाहिए। बेतरतीब ठहराव समस्याओं को ढूँढता है चाहे वे आसान हों या कठोर। फिर एक समस्या को ठीक करना दूसरों को उजागर करता है, इसलिए जटिल गति को प्राप्त करने के लिए प्रक्रिया को दोहराया जा सकता है।

कई उदाहरणों से मेरे अनुभव में, यहां बताया गया है: मैं एक समस्या (यादृच्छिक ठहराव द्वारा) पा सकता हूं और इसे ठीक कर सकता हूं, कुछ प्रतिशत का स्पीडअप प्राप्त कर सकता हूं, 30% या 1.3x कह सकता हूं। फिर मैं इसे फिर से कर सकता हूं, एक और समस्या ढूंढ सकता हूं और इसे ठीक कर सकता हूं, एक और स्पीडअप प्राप्त कर सकता हूं, शायद 30% से कम, शायद अधिक। तब मैं इसे फिर से कर सकता हूं, कई बार जब तक मैं वास्तव में ठीक करने के लिए और कुछ नहीं पा सकता हूं। अंतिम स्पीडअप कारक व्यक्तिगत कारकों का चलने वाला उत्पाद है, और यह आश्चर्यजनक रूप से बड़ा हो सकता है - कुछ मामलों में परिमाण के आदेश।

सम्मिलित: इस अंतिम बिंदु को स्पष्ट करने के लिए। स्लाइड शो और सभी फाइलों के साथ यहां एक विस्तृत उदाहरण है , जिसमें दिखाया गया है कि समस्या को हटाने की एक श्रृंखला में 730x का स्पीडअप कैसे प्राप्त किया गया था। पहले संस्करण में 2700 माइक्रोसेकंड प्रति यूनिट काम लिया गया। समस्या ए को हटा दिया गया था, समय को 1800 तक लाया गया, और शेष समस्याओं के प्रतिशत को 1.5x (2700/1800) तक बढ़ाया। तब B को हटा दिया गया था। यह प्रक्रिया छह पुनरावृत्तियों के माध्यम से जारी रही, जिसके परिणामस्वरूप परिमाण गति के लगभग 3 क्रम थे। लेकिन प्रोफाइलिंग तकनीक को वास्तव में प्रभावोत्पादक होना चाहिए, क्योंकि यदि उनमें से कोई भी समस्या नहीं पाई जाती है, अर्थात यदि आप एक ऐसे बिंदु पर पहुँच जाते हैं जहाँ आप गलत तरीके से सोचते हैं कि कुछ और नहीं किया जा सकता है, तो प्रक्रिया रुक जाती है।

बड़े स्पीडअप प्राप्त करने के लिए कई समस्याओं को दूर करने का विवरण

INSERTED: इसे दूसरे तरीके से रखने के लिए, यहाँ कुल स्पीड कारक का एक ग्राफ रखा गया है क्योंकि लगातार समस्याएं दूर की जाती हैं:

यहाँ छवि विवरण दर्ज करें

तो क्यू 1 के लिए, एक साधारण टाइमर प्रत्यय बेंचमार्किंग के लिए। "प्रोफाइलिंग" के लिए मैं यादृच्छिक ठहराव का उपयोग करता हूं।

Q2: मैं इसे पर्याप्त कार्यभार देता हूं (या बस इसके चारों ओर एक लूप डाल देता हूं) इसलिए यह ठहराव के लिए काफी लंबा चलता है।

Q3: सभी तरीकों से, इसे वास्तविक रूप से बड़े कार्यभार दें ताकि आप कैश की समस्याओं को याद न करें। मेमोरी कोड कर रहे कोड में नमूने के रूप में दिखाई देंगे।


माइक, क्या आपके पास एक दृश्य आईडीई की अनुपस्थिति में यादृच्छिक ठहराव करने के लिए एक प्राथमिकता है? क्या इस प्रक्रिया को किसी तरह से स्वचालित किया जा सकता है?
मैथ्यू एम्मेट

@ मैथ्यू: मैं समझता हूं कि जैसे उपकरण हैं pstackऔर lsstack, लेकिन मैं वास्तव में डिबगिंग के साथ इस प्रक्रिया को अधिक सामान्य मानता हूं। यहां तक ​​कि अगर सबसे अच्छा डिबगर मैं सहन कर सकता हूं gdb, तो यह काम हो जाता है। डीबगर के साथ आप डेटा की जांच कर सकते हैं, और इससे फर्क पड़ सकता है जब स्टैक अकेले आपको पर्याप्त नहीं बताता है।
माइक डनलवेई

9

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

मैंने कण भौतिकी के विश्लेषणों में मामूली सफलता के साथ काम किया है (यानी मैंने प्रदर्शित किया कि कोड में कोई भयानक गर्म स्थान नहीं था और अनुकूलन को एक बेहतर एल्गोरिथ्म की आवश्यकता थी)।


1
+ सबूतों का अभाव अनुपस्थिति का सबूत नहीं है :) गरीब आदमी के प्रोफाइलर को जो करना चाहिए वह कम निशान लेता है और उन्हें ध्वस्त नहीं करता है, लेकिन आपको उन्हें देखना चाहिए। मानव आंख सरल कार्य समय अनुमानों की तुलना में उपयोगी पैटर्न का पता लगाने में बहुत बेहतर है, और यदि आप कुछ देखते हैं तो आप 2 नमूनों में से कुछ पर सुधार कर सकते हैं, यह काफी मदद करेगा। अंश X इसे बचाएगा मोड 2 / N के साथ एक बीटा वितरण है, जहां N की जांच की गई है कि कितने निशान हैं, और स्पीडअप कारक 1 / (1-X) होगा, जो बड़ा हो सकता है।
माइक डनलैवी

2

उपलब्ध महान उत्तरों में जोड़ने के लिए, चावल में एक उपकरण विकसित किया गया है जो स्टैक नमूने को स्वचालित करता है और इसलिए बहुत कम ओवरहेड होता है:

http://hpctoolkit.org/


यह अच्छा लग रहा है, हालांकि (क्षमा करें) मैंने अपनी लौ टोपी पर डाल दी है। मैं संकलक-अनुकूलित कोड पर धुन नहीं करता हूं क्योंकि यह देखना मुश्किल है कि मंगली कोड में क्या हो रहा है। जिन चीज़ों की मैं प्रूनिंग कर रहा हूँ, वे ऐसी चीज़ें नहीं हैं जो आशावादी के साथ व्यवहार कर सकती हैं - जैसे कॉलिंग expऔर logबार-बार एक ही तर्क के साथ, या मैट्रिक्स ऑपरेशन अपने सभी समय को डिकोडिंग विकल्पों में खर्च करते हैं। मैं जहां तक ​​कर सकता हूं, मैं धुन देता हूं, तब -O3 चालू करें।
माइक डनलैवी

उपकरण उपकरण हैं, और केवल तभी उपयोगी होते हैं जब उपयोगकर्ता अपनी सीमाओं को जानता और समझता है। मुझे नहीं लगता है कि कभी भी एक "संपूर्ण प्रोफाइलर" होगा जो उपयोगकर्ता को इसके आउटपुट को समझने और जानकारी का उपयोग करने के तरीके जानने के संबंध में समीकरण से पूरी तरह हटा देगा।
रीड.टेकसन 16

1

Allinea MAP एक व्यावसायिक रूप से विकसित और समर्थित नमूना प्रोफाइलर है और इसलिए - जैसे कि एचपीसी टूलकिट ने पहले उत्तर में सुझाव दिया है - यदि आप चाहें तो उत्पादन आकार की नौकरियों पर चल सकते हैं।

इस तरह के टूल सीपीयू की अड़चनों या खराब एमपीआई संचार की ओर इशारा करते हैं, लेकिन साथ ही पूरी नौकरी की रूपरेखा का पूरा निरीक्षण आश्चर्यचकित मुद्दों को खोजने में अनमोल हो सकता है।

अक्सर कम लटकने वाले प्रदर्शन फल होते हैं जो एक CFD कोड के मुख्य कर्नेल के बाहर होते हैं, उन क्षेत्रों में जो अपेक्षित नहीं थे। रेंडमाइज्ड स्टैक सैंपलिंग है - चाहे मैन्युअल रूप से GDB के साथ किया गया हो, या HPC टूलकिट और एलिनिया एमएपी जैसे टूल के साथ - उन्हें खोजने का सबसे अच्छा तरीका है। यदि प्रदर्शन के लिए कुछ महत्वपूर्ण है तो यह दिखाई देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.