वैज्ञानिक सॉफ्टवेयर को कितना अनुकूलित किया जाना चाहिए?


13

महत्वपूर्ण कम्प्यूटेशनल संसाधनों की आवश्यकता वाले अनुप्रयोगों के लिए, उच्च प्रदर्शन एक महत्वपूर्ण कारक हो सकता है जब यह उचित समय में वैज्ञानिक परिणाम देने या "ब्रेक-थ्रू" प्राप्त करने के लिए आता है।

सॉफ़्टवेयर डेवलपर्स को किसी एप्लिकेशन को अनुकूलित करने में कितना समय और प्रयास करना चाहिए? मुख्य मापदंड क्या उपयोग किए जाते हैं?


प्रोग्राम जो वैज्ञानिक लिखते हैं, वे बहुत लंबे समय तक चलते हैं (उदाहरण सिमुलेशन)। प्रोग्रामर का समय और कंप्यूटर चलाने का समय तुलनीय हो सकता है। यह आज के "सामान्य" प्रोग्रामर काम से बहुत अलग है। कंप्यूटिंग के शुरुआती दिनों की तरह, यह अक्सर सिमुलेशन को तेज बनाने और अधिक तेज़ी से खत्म करने के लिए कुछ प्रयास (और प्रोग्रामर समय) का निवेश करने के लायक होता है, और काम तेजी से पूरा करता है।
स्ज़बोलक्स

जवाबों:


15

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

हमेशा संचालन के लिए एक प्रदर्शन मॉडल स्केच करें जो आपको लगता है कि महत्वपूर्ण हैं (या जिसे आप खोजते हैं वह रूपरेखा द्वारा महत्वपूर्ण है)। तब आप प्रदर्शन मॉडल का उपयोग यह अनुमान लगाने के लिए कर सकते हैं कि अत्यधिक ट्यून किए गए कार्यान्वयन क्या वितरित कर सकते हैं। यदि आप तय करते हैं कि स्पीडअप इसके लायक है (आपके द्वारा की जा रही अन्य चीजों के सापेक्ष), तो अनुकूलन करें।

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


1
अभी हाल ही में मुझे हमारे विश्लेषण के एक सीमित चरण में 10,000 (हमारी सबसे बड़ी घटनाओं के लिए) सुधार का एक कारक मिला, बस एक एल्गोरिथ्म की जगह ले रहा था जो O (n ^ 2) था समय और स्थान में एक O (n log n) के साथ ) दोनों मे। ध्यान रखें कि इसका मतलब एक और निर्भरता और कुछ जोड़ा हुआ जटिलता है, लेकिन कभी-कभी यह इसके लायक है ...
dmckee --- पूर्व-मध्यस्थ ने बिल्ली का बच्चा

1
स्पीडअप कारक (जो किसी चीज़ के सापेक्ष हैं) आपकी तुलना में आपके लिए एक स्पष्ट संदर्भ के लायक नहीं हैं। यदि आप एक अनुचित एल्गोरिदम के आधार पर खराब कार्यान्वयन की तुलना करते हैं और फिर बदलते हैं, तो यह स्पष्ट रूप से बड़े सापेक्ष लाभ की उम्मीद करने के लिए अनुचित नहीं होगा।
एलन पी। इंग्सिग-करुप

1
@ एलन: यह एक एकल परिवर्तन से प्राप्त करने के लिए 10,000 का कारक था, तो जाहिर है कि यह एक बीमार चुना गया कार्यान्वयन था। पिछला कोड अनावश्यक जटिलता से उतना ही आहत हुआ जितना कि समय की जटिलता से: कैशिंग प्रदर्शन खराब था। लेकिन यह बात नहीं है?
dmckee --- पूर्व-संचालक बिल्ली का बच्चा

8

आप "अनुकूलन" को कैसे परिभाषित करेंगे? वहाँ बेहतर एल्गोरिदम या कम्प्यूटेशनल मॉडल के विकास से एक संपूर्ण स्पेक्ट्रम है हाथ से चलने वाले कोडांतरक का उपयोग करने के लिए।

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

  • यदि आप जानते हैं कि आपका आर्किटेक्चर SIMD का समर्थन करता है, तो गणना को फिर से संरचना करें जैसे कि आपके ऑपरेशन को लघु वैक्टर के संदर्भ में लिखा जा सकता है,
  • यदि आप जानते हैं कि आप आर्किटेक्चर एक मल्टी-कोर कंप्यूटर हैं, तो अपने कम्प्यूटेशनल कार्य को अलग-अलग उप-कार्यों में तोड़ने की कोशिश करें जो एक-दूसरे के साथ हस्तक्षेप नहीं करते हैं और उन्हें समानांतर में चलाते हैं (अपने उप-कार्यों के डीएजी के बारे में सोचें) ,
  • यदि आपके अंतर्निहित आर्किटेक्चर में GPU है, तो उन तरीकों के बारे में सोचें जिन्हें आप लॉक-स्टेप में डेटा के माध्यम से थ्रेडिंग के समूह के रूप में अपनी गणना को फिर से तैयार कर सकते हैं,
  • आदि...

उपरोक्त सभी सुविधाएँ, जैसे SIMD, समानांतरवाद और GPU, को बहुत कम स्तर के ज्ञान के बिना एक्सेस किया जा सकता है, लेकिन केवल उन एल्गोरिदम में एक लाभ प्रदान करता है जो आसानी से उनका शोषण कर सकते हैं।


4

मैं पहले से ही इस तरह अब तक सामने आए सभी जवाबों से सहमत हूं ... मैं कोड अनुकूलन के एक और अनदेखे पहलू को संबोधित करना चाहता हूं: गुणवत्ता की अपेक्षा।

कोड अनुकूलन का मुद्दा आमतौर पर तब उठता है जब उपयोगकर्ता बड़ी और बड़ी समस्याओं को हल करने की कोशिश करता है और उपयोगकर्ता की जरूरतों / अपेक्षाओं को पूरा करने के लिए कोड अपर्याप्त होता है। कोड अनुकूलन में निवेश करने के लिए समय की मात्रा इस अपेक्षा को पूरा करने की मांग पर निर्भर करती है। यह निश्चित रूप से महत्वपूर्ण समय के निवेश के लायक है अगर प्रतिस्पर्धी लाभ के लिए एक महत्वपूर्ण आवश्यकता है (जैसे दूसरों से पहले एक गर्म विषय पर अपने शोध को खत्म करना और प्रकाशित करना)।

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


4

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

अंगूठे का नियम, हमेशा की तरह, प्रसिद्ध 80/20 नियम है। कुछ समय के लिए यह बस चलाने के कुछ प्रतिशत (या कम) प्राप्त करने में अधिक से अधिक समय खर्च करने के लिए कोई और अधिक नहीं जोड़ता है। लेकिन आपको विश्लेषण करना होगा।

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

डोनाल्ड नथ को उद्धृत करने के लिए: "समय से पहले अनुकूलन सभी बुराई की जड़ है"। इसलिए अपने कोड को प्रोफाइल करें, लेकिन बहुत जल्द नहीं।


क्या आप पेरेटो सिद्धांत (80/20) नियम का उल्लेख कर रहे हैं? यदि हां, तो क्या आपका मतलब है कि हमें धीमे-धीमे 80% उत्पादन करने वाले कोड के 20% पर अनुकूलन प्रयासों पर ध्यान केंद्रित करना चाहिए? या क्या आपका मतलब है कि यदि आप केवल 20% स्पीडअप की उम्मीद कर सकते हैं, तो यह सिर्फ अनुकूलन के लायक नहीं है?
पॉल

नहीं, मैंने इसे केवल एक तरह के सिद्धांत के रूप में इस्तेमाल किया है, न कि 80/20 पर। कुछ समय में, आप केवल कुछ प्रतिशत हासिल करने के लिए इतना प्रयास करेंगे कि यह किसी भी अधिक प्रयास के लायक नहीं है।
17

3

कुछ अतिरिक्त सलाह:

  1. किसी कार्य कार्यक्रम के किसी भी अनुकूलन को करने से पहले, सुनिश्चित करें कि आपके पास परीक्षण मामलों का एक अच्छा सेट है जो कोड की अखंडता को बनाए रखने में मदद करते हैं। गलत परिणाम तेज़ होने का कोई मतलब नहीं है।
  2. यदि आपका अनुकूलन कोड को कम पठनीय बनाता है, तो मूल संस्करण को कम से कम, टिप्पणी के रूप में इधर-उधर रखें, लेकिन संकलन समय और रन समय में चयनित होने के लिए वैकल्पिक संस्करण के रूप में बेहतर है। आपकी समस्याओं और आपकी मशीनों के विकसित होते ही आपके अनुकूलन की आवश्यकता बदल सकती है, और मूल कोड उस अनुकूलन के लिए एक बेहतर प्रारंभिक बिंदु हो सकता है जिसे आप अभी से पाँच साल करेंगे।
  3. यदि आपका अनुकूलित संस्करण न्यूनतम प्रभाव से बाहर हो जाता है, लेकिन कोड को कम पठनीय, कम सार्वभौमिक, या कम स्थिर बनाता है, तो मूल संस्करण पर वापस जाएं। आप जितना हासिल करते हैं उससे कहीं अधिक खो देते हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.