performance - language - फोरट्रान फुल फॉर्म इन कंप्यूटर




फोरट्रान कोड के प्रदर्शन में सुधार के लिए युक्तियां और चालें (2)

क्षमा करें, लेकिन आपके द्वारा उल्लिखित सभी युक्तियां बस ... हास्यास्पद हैं अधिक वास्तव में, वे व्यवहार में कोई मतलब नहीं है। उदाहरण के लिए:

  • 0.5 के बजाय आधे (0.5 = 0.5) का उपयोग करने का क्या फायदा हो सकता है?
  • a**4 या a*a*a*a कंप्यूटिंग के लिए आईडीई (a*a)** 2 भी एक और संभावना होगी मेरा व्यक्तिगत स्वाद एक ** 4 है क्योंकि एक अच्छा संकलक जो सबसे अच्छा तरीका चुनता है।

** , एकमात्र बिंदु जो बात कर सकता है वह a ** 4 और a ** 4. बीच का अंतर है, बाद में ज्यादा सीपीयू का समय लगता है। लेकिन वास्तविक बिंदु पर माप के बिना भी इस बिंदु का कोई अर्थ नहीं है।

वास्तव में, आपका दृष्टिकोण गलत है अपने कोड को यथासंभव विकास करना इसके बाद, अपने कोड के विभिन्न भागों की निष्पक्ष लागत को मापें। पहले को मापने के बिना अनुकूलन केवल गैर अर्थ है

यदि कोई हिस्सा सीपीयू का एक उच्च प्रतिशत दर्शाता है, उदाहरण के लिए 50%, यह मत भूलना कि उस भाग को अनुकूलित करने से केवल दो से अधिक कारक द्वारा समग्र कोड की लागत को विभाजित नहीं किया जा सकता है। किसी भी तरह, सबसे महंगा भाग (बोतल गर्दन) द्वारा अनुकूलन कार्य शुरू करें।

यह भी मत भूलिए कि मुख्य सुधार आम तौर पर बेहतर एल्गोरिदम से आ रहे हैं।

मेरी पीएचडी के भाग के रूप में अनुसंधान, मैं वायुमंडल और सागर के संचलन के संख्यात्मक मॉडल के विकास पर काम कर रहा हूं। इनमें ~ 10 ^ 6 ग्रिड अंक के आदेश पर ~ 10 ^ 4 से अधिक समय के चरणों में संख्यात्मक रूप से पीडीई के सिस्टम को हल करना शामिल है। इस प्रकार, एक विशिष्ट मॉडल सिमुलेशन को कुछ दिनों तक पूरा करने के लिए घंटे लगते हैं जब दर्जनों सीपीयू पर एमपीआई में चलते हैं। स्वाभाविक रूप से, जितना संभव हो उतना संभव मॉडल दक्षता में सुधार करना ज़रूरी है, जबकि सुनिश्चित करने के परिणाम बाइट-टू-बाइट समान हैं।

हालांकि मैं अपने फोरट्रान प्रोग्रामिंग के साथ काफी सहज महसूस करता हूं, और कोड को अधिक कुशल बनाने के लिए काफी कुछ गुर के बारे में जानता हूं, मुझे लगता है कि अभी भी सुधार करने के लिए जगह है, और मुझे पता नहीं है कि चालें।

वर्तमान में, मुझे यकीन है कि मैं संभव के रूप में कुछ डिवीजनों के रूप में उपयोग करता हूं, और शाब्दिक स्थिरांकों का उपयोग न करने का प्रयास करें (मुझे बहुत जल्दी से ऐसा करने के लिए सिखाया गया था, उदाहरण के तौर पर वास्तविक कंप्यूटेशन में 0.5 के बजाय आधे 0.5 =), कुछ ट्रान्सेंडैंटल फंक्शंस संभव आदि के रूप में

क्या अन्य प्रदर्शन संवेदनशील कारक हैं? फिलहाल, मैं कुछ के बारे में सोच रहा हूं:

1) क्या गणितीय संचालन के क्रम में काम करता है? उदाहरण के लिए यदि मेरे पास है:

a=1E-7 ; b=2E4 ; c=3E13
d=a*b*c

गुणा के आदेश के आधार पर अलग-अलग दक्षता के साथ मूल्यांकन होगा? आजकल, यह संकलक विशिष्ट होना चाहिए, लेकिन क्या इसका कोई सीधा उत्तर है? मुझे ऑर्डर (सटीक सीमा) के आधार पर अलग-अलग मान मिलने की सूचना है, लेकिन क्या इस पर प्रभाव पड़ता है या नहीं?

2) सर्रायटीन के भीतर एक मॉड्यूल से इन सरणियों तक पहुँचने के विरुद्ध उपस्ट्रैटेन के तर्कों के रूप में बहुत सारे (उदाहरण के दर्जनों) एरेज़ पास करना?

3) फोरट्रान 95 निर्माण (बनाम और कहीं) बनाम डीओ और IF? मुझे पता है कि ये 90 के दशक में जब कोड वेक्टरिंग एक बड़ी चीज थी, लेकिन अब ये कोई अंतर है, जो अब आधुनिक कंपाइलर्स को डीओ लूप को सचेत करने में सक्षम हैं? (मैं अपने काम में पीजीआई, इंटेल, और आईबीएम कंपाइलर्स का उपयोग कर रहा हूं)

4) गुणांक बनाम एक पूर्णांक शक्ति के लिए एक संख्या को ऊपर उठाना? उदाहरण के लिए:

b=a**4

या

b=a*a*a*a

मुझे हमेशा उस स्थान का उपयोग करने के लिए सिखाया गया है जहां संभव हो क्या यह दक्षता और / या सटीकता को प्रभावित करता है? (संभवत: कंपलर निर्भर भी)

फोरट्रान कोड दक्षता को सुधारने के बारे में आप कोई भी युक्तियां और युक्तियां चर्चा करें और / या जोड़ दें उसके अलावा और क्या है वहाँ? यदि आप इस प्रश्न से संबंधित प्रत्येक ऊपर दिए गए कम्पाइलर्स के लिए कुछ खास जानते हैं, तो कृपया उस के रूप में भी शामिल करें

जोड़ा गया: ध्यान दें कि मेरे पास कोई बाधा या प्रदर्शन समस्याएं नहीं हैं I मैं पूछ रहा हूं कि आपरेशनों के मामले में कोड अनुकूलित करने के लिए कोई सामान्य नियम हैं या नहीं।

धन्यवाद!


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

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

जब आप ऐसा करते हैं तो ऑप्टिमाइज़ेशन झंडे बंद करना शुरू करना सबसे अच्छा है, इसलिए कोड सभी तले हुए नहीं है बाद में आप उन्हें चालू कर सकते हैं और कंपाइलर को इसकी बात करते हैं।

इसे डीबगर के नीचे चलने के लिए पर्याप्त कार्यभार प्राप्त करें ताकि यह उचित समय के लिए चला सके। यह चल रहा है, मैन्युअल रूप से इसे बाधित, और यह क्या कर रहा है और क्यों पर एक अच्छी कड़ी मेहनत ले ऐसा कई बार करो, जैसे 10, तो आप उस समय के बारे में गलत निष्कर्ष नहीं उठाते हैं जो समय पर खर्च कर रहे हैं

यहां आपको मिलती-जुलती चीजों के उदाहरण दिए गए हैं:

  • यह गणित पुस्तकालय कार्यों को समय के बड़े अंश के रूप में खर्च कर सकता है क्योंकि कुछ अभिव्यक्तियों को कोडित किया गया था, या पूर्व कॉल के रूप में समान तर्क मानों के कारण।
  • यह कुछ फाइल I / O, या एक फाइल को खोलने / बंद करने के समय का एक बड़ा अंश खर्च कर सकता है, कुछ दिनचर्या के अंदर गहरा है जो कॉल करने के लिए हानिकारक नज़र आ रहा था।
  • यह ऊपरी फ़ंक्शन पर तर्क के झंडे की जाँच के उद्देश्य के लिए, एक सामान्य प्रयोजन पुस्तकालय फ़ंक्शन में, एक अधीनस्थ उपनेमका कॉल कर सकता है। ऐसे मामले में, उस समय के एक विशेष उद्देश्य फ़ंक्शन को लिखकर और उसके बदले बुलाया जा सकता है

यदि आप इस पूरे ऑपरेशन को दो या तीन बार करते हैं, तो आप उस बेवकूफ सामान को निकाल देंगे जो पहली बार लिखे जाने पर किसी भी सॉफ़्टवेयर में अपना रास्ता खोज लेते हैं। उसके बाद, आप ऑप्टिमाइज़ेशन, समानतावाद या जो भी हो सकते हैं, और आश्वस्त रहें कि मूर्खतापूर्ण सामग्री पर कोई समय व्यतीत नहीं किया जा रहा है।





hpc