(कैसे) तेजी से चलने वाले सिमुलेशन लिखें?


16

मैंने CFD में अपने सभी कार्य करने के लिए प्रोग्रामिंग भाषा के रूप में अजगर का उपयोग करना शुरू कर दिया है। मुझे प्रोग्रामिंग में बहुत कम अनुभव है। मैं मैकेनिकल इंजीनियरिंग पृष्ठभूमि से हूं और एयरोस्पेस इंजीनियरिंग में उच्च शिक्षा हासिल कर रहा हूं।

कभी-कभी सीएफडी के कंप्यूटिंग पहलू समीकरणों में हेरफेर करने या गणित करने की तुलना में अधिक थकाऊ हो जाते हैं।

सामान्य दिशानिर्देश क्या हैं जो हमारे कार्यक्रम को तेजी से चलाते हैं? चीजों को समान रूप से करने के गुर क्या हैं? तेजी से चलने वाले कोड कैसे लिखें?

मुझे कहां से संसाधन मिलते हैं (मेरे जैसे एक लेपर्स के लिए समझने में आसान) जो सवालों के ऊपर जवाब देता है?



@ दान, मुझे ऐसा नहीं लगता। मैं 'किसी' संभावित संसाधन के लिए कह रहा हूं जो एक नवागंतुक प्रोग्रामिंग रणनीति को समझने में मदद करेगा। मेरी कोई विशिष्ट आवश्यकताएं या शर्तें नहीं हैं। अधिक विशेष रूप से मैं उन संसाधनों के लिए पूछ रहा हूं जो कोड को अधिक सुरुचिपूर्ण बनाने में मदद करेंगे।
सुबोध

क्या आप अजगर पर नियत हैं या आप C ++ पर विचार करेंगे? इस मामले में मैं दो चीजों का सुझाव दूंगा: C ++ सीखें, एक ओपन सोर्स लाइब्रेरी खोजें (मेरे मामले में OpenFOAM), स्क्रैच से चीजों को विकसित न करें, लेकिन सीखें, एक उन्नत कोड के माध्यम से खुदाई करें, इसके पहलू, परिवर्तन के बारे में जानें और प्रयोग, सभी एक विशिष्ट उद्देश्य के साथ संचालित: आपके मामले में, उदाहरण के लिए वायुगतिकीय सिमुलेशन।
टेमरिक

@ टॉमिस्लाव-मैरिक, बहुत बहुत धन्यवाद। मैं सख्त 'पायथोनियन' नहीं हूं। वास्तव में, क्षेत्र के लिए एक नए चेहरे होने के नाते, मुझे लगता है कि मेरे सामने मेरे पास बहुत सारे विकल्प उपलब्ध हैं। मैं OpenFOAM भी सीख रहा हूं। इसलिए मैं आपके विचारों से सहमत हूं कि किसी परियोजना पर काम करना शुरू करना चाहिए और उसके माध्यम से सीखना चाहिए (या संक्षेप में हाथ गंदे होना चाहिए), जो कि ठीक है कि मुझे क्या करना चाहिए! धन्यवाद
सुबोध

@smj btw, मैं एक मैकेनिकल इंजीनियरिंग स्नातक के रूप में अच्छी तरह से आता हूँ और मैं अब कम्प्यूटेशनल विज्ञान में स्नातक छात्र हूँ (mech। Engineering ने मुझे इसके लिए तैयार नहीं किया) ... यदि आप OF के साथ काम कर रहे हैं, तो C ++ पुस्तक खोजें। स्टैक ओवरफ्लो पर सूची, और सीखना शुरू करें। आपको 3 चीजें चाहिए: C ++, OpenFOAM और कम्प्यूटेशनल साइंस से ज्ञान। OpenFOAM और कम्प्यूटेशनल विज्ञान, आप एक डेंड्रिटिक तरीके से सीख सकते हैं: एक असाइनमेंट ढूंढें और इसे पूरा करें, जो आपको चाहिए उसके साथ सीखना। कुछ खत्म होने के बाद आपको प्रेरित करेगा। C ++ के लिए: C ++ प्राइमर से शुरू करें और इसे सीखें। सौभाग्य! :)
टेमरिक

जवाबों:


19

मैं आपके प्रश्न का उत्तर देने का प्रयास करूंगा कि आप विशेष रूप से अजगर के लिए पूछ रहे हैं। मैं एक सिमुलेशन समस्या से निपटने के अपने तरीके का वर्णन करूंगा। इस विवरण में तेज सिमुलेशन की रणनीतियाँ दी गई हैं।

सबसे पहले, मैंने पायथन में नए सिमुलेशन का प्रोटोटाइप बनाया। बेशक, मैं जितना संभव हो उतना NumPy और SciPy का उपयोग करने की कोशिश करता हूं। जहाँ NumPy संख्यात्मक सिमुलेशन के लिए एक उपयुक्त सरणी डेटा प्रकार प्रदान करता है, SciPy NumPy सरणियों के साथ काम करने के लिए एक विस्तृत संख्यात्मक दिनचर्या प्रदान करता है।

एक बार जब प्रोटोटाइप अधिक या कम काम करता है, तो मैं यह जानने की कोशिश करता हूं कि कार्यक्रम या स्क्रिप्ट के कौन से हिस्से अड़चन हैं। उसके लिए विशिष्ट उम्मीदवार हैं:

  • अजगर में लूप्स धीमे होते हैं। बहुत धीमी गति से।
  • जैसा कि पायथन डक टाइपिंग का उपयोग करता है , कॉलिंग फ़ंक्शन धीमा हो सकता है।

मैं यह जानने के लिए एक सरल रूपरेखा रणनीति का उपयोग करता हूं कि सभी रन समय कहां खर्च होता है। IPython शेल का उपयोग करना (जो मैं पर्याप्त अनुशंसा नहीं कर सकता), मैं अपनी स्क्रिप्ट चलाता हूं

%timeit script.py

यह "मैजिक कमांड" आपके लिए प्रोफाइलिंग ( समयसीमा का उपयोग ) करेगा और आपकी स्क्रिप्ट समाप्त होने के बाद आपको कई बार एक सूची पेश करेगा। यह पता लगाने के लिए कि आपका कोड बहुत धीमा है, इस सूची का उपयोग करें।

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

सबसे पहले, साइथन भाषा है। साइथन एक प्रोग्रामिंग लैंग्वेज है जो पायथन के समान है (वास्तव में, पायथन कोड अक्सर मान्य पायथन कोड है, भी); हालाँकि, Cython संकलक Cython फ़ाइलों को C कोड में बदल देता है, जिसे बाद में Python से उपयोग किए जा सकने वाले मॉड्यूल में संकलित किया जा सकता है। सिथॉन न्यूमपी सरणियों को समझता है। साइथॉन का उपयोग करने के दो तरीके हैं जो आपकी मदद कर सकते हैं: पहला, आप डेटा प्रकार पेश कर सकते हैं। यह फ़ंक्शन कॉल को गति देगा। इसके अलावा, यदि आप सरणियों पर पुनरावृत्ति करते हैं, तो आपका लूप तेजी से चलेगा (वास्तव में, यदि आप डमी चर और सरणी दोनों टाइप करते हैं, तो आपको एक सादा लूप मिलता है!)। दूसरे, मेरे प्रयोगों में भी अनकही स्क्रिप्ट इस तथ्य के कारण थोड़ी तेज चलती हैं कि वे व्याख्या के बजाय संकलित हैं।

अन्य संकलित भाषा जो आपके लिए उपयोगी होगी, वह फोरट्रान है। वहाँ अजगर (साथ फोरट्रान उपयोग करने के लिए विभिन्न तरीके हैं f2py , fortwrap , Cython )। जैसा कि मुझे व्यक्तिगत रूप से f2py सबसे आसान तरीका लगता है, मैं जल्दी से इसका वर्णन करता हूं कि यह क्या करता है। f2py फ़ोर्टन कोड को पायथन मॉड्यूल के लिए संकलित कर सकता है। यह आपको पायथन स्पेस से इनपुट और आउटपुट वेरिएबल के रूप में NumPy सरणियों का उपयोग करने की अनुमति देगा। फोरट्रान अंतरिक्ष में, ये साधारण फोरट्रान सरणियाँ होंगी। आप उन पर पूर्ण फोरट्रान गति से काम कर सकते हैं।

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

फोरट्रान पर अतिरिक्त ध्यान देने पर: आधुनिक फोरट्रान न्यूमपी के समान ही पढ़ता और लिखता है - वाक्य रचना बहुत करीब है। इससे NumPy कोड को Fortran कोड में बदलना आसान हो जाता है।

ध्यान दें कि साइथॉन और f2py दोनों किसी तरह समानतावाद का समर्थन करते हैं। साइथन के लिए, आपको यहां मदद मिलेगी , जबकि फोरट्रान के लिए, ओपनएमपी या एमपीआई जैसी मानक तकनीकें हैं । इसके अलावा, MPI के लिए P ython रैपर भी हैं। व्यक्तिगत रूप से, मैं Python स्तर पर और साथ ही Fortran में OpenMP पर mpi4py का उपयोग करता हूं।

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

यदि आपके पास अधिक विशिष्ट प्रश्न हैं, तो हम मदद करने में प्रसन्न हैं!


1
पायथन प्रोफाइलरों के अवलोकन के लिए कोड को अनुकूलित करने पर भी अस्पष्ट-व्याख्यान देखें ।
डेनिस

7

सीएफडी + पायथन के लिए एक समाधान है: http://pythonflu.wikidot.com/ ये OpenFOAM के शीर्ष पर पायथन-बाइंडिंग हैं (जो पहले से ही प्रश्नों के लिए टिप्पणी में उल्लिखित था)। ये बाइंडिंग "सॉल्वर स्तर" पर प्रोग्रामिंग की अनुमति देते हैं (ऐसे उदाहरण हैं जहां मूल ओपनफ़ैम-सॉल्वर को पायथन में दोहराया जाता है और वे मूल से धीमी नहीं होते हैं - दूसरे उत्तर में वर्णित धीमी छोरों को यहां कोई समस्या नहीं है क्योंकि "इनर लूप्स" होते हैं। C ++ में - OpenFOAM का कोड)।

इन बाइंडिंग का लाभ यह भी है कि ओपनफ़ैम में सभी समांतरिकरण सॉल्वर-स्तर के नीचे होता है, इसलिए आपको इसके साथ परेशान नहीं करना होगा (साथ ही साथ अन्य सामान जो ओपनफ़ैम-कोर का ध्यान रखता है: इनपुट / आउटपुट) लीनियर सॉल्वर, ऑपरेटर विवेक)

इसलिए यदि आप सिर्फ एक नया सॉल्वर लिखना चाहते हैं और ओएफ-कोर (बाउंड्री कंडीशन, लीनियर सॉल्वर इत्यादि) में नई सुविधाएँ नहीं जोड़ना चाहते हैं, तो PythonFlu आपके लिए पर्याप्त हो सकता है और आप C ++ से बच सकते हैं (जिसकी तुलना में बहुत अधिक सीखने की क्षमता है) अजगर)

पुनश्च: मूल रूप से मूल प्रश्न की चर्चा के लिए एक टिप्पणी के रूप में इसे जोड़ना चाहता था, लेकिन मेरी प्रतिष्ठा मुझे इसकी अनुमति नहीं देती है


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