विधानसभा के साथ अनुकूलन करना सीखना [बंद]


21

मैं कंप्यूटर गेम्स टेक्नोलॉजी का द्वितीय वर्ष का छात्र हूं। मैंने हाल ही में अपने "पाथफाइंडर" के अपने पाथफाइंडर का पहला प्रोटोटाइप तैयार किया (जो कि ज्यामितीय दृष्टिकोण / पैटर्न मान्यता के बजाय A * का उपयोग नहीं करता है, पाथफाइंडर को केवल उस इलाके के बारे में ज्ञान की आवश्यकता है जो निर्णय लेने के लिए उसके विचार में है, क्योंकि मैं एक एआई चाहता था जो वास्तव में पता लगा सके, अगर इलाके को पहले से ही पता है, तो यह सबसे छोटा रास्ता आसानी से चलाएगा, क्योंकि पाथफाइंडर में नोड्स की एक मेमोरी है)।

वैसे भी मेरा प्रश्न अधिक सामान्य है: मैं एल्गोरिदम / छोरों / for_each / etc का अनुकूलन कैसे शुरू करूँ। असेंबली का उपयोग करना, हालांकि सामान्य सुझावों का स्वागत है। मैं विशेष रूप से अच्छी पुस्तकों की तलाश में हूं, क्योंकि इस विषय पर अच्छी पुस्तकों को खोजना वास्तव में कठिन है। वहाँ की तरह वहाँ कुछ छोटे लेख हैं इस एक , लेकिन अभी भी एक एल्गोरिथ्म / खेल का अनुकूलन करने के लिए पर्याप्त ज्ञान नहीं है ...

मुझे आशा है कि वहाँ एक आधुनिक अच्छी किताब है, जो मुझे अभी तक नहीं मिली ...


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

जवाबों:


21

मैं यहां अनाज के खिलाफ जा रहा हूं और कहूंगा, आशावाद के बारे में सीखना बहुत जल्दी नहीं है , विशेष रूप से विधानसभा अनुकूलन और अधिक महत्वपूर्ण बात, विधानसभा में डिबगिंग। मुझे विश्वास है कि यदि आप एक छात्र हैं (क्योंकि तब आपके पास खोने का बहुत कम समय है [अर्थात समय / धन वार]) और सब कुछ हासिल करने के लिए आप इसका अधिकतम लाभ प्राप्त करेंगे।

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

उत्तर

यह एक सबसे अच्छा संसाधन है जो मैंने अनुकूलन के बारे में सीखने के लिए पाया है।

http://www.agner.org/optimize/

शेख़ीवाला

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

हालांकि एक चेतावनी है। आप किसी चीज़ को अनुकूलित करने में समय व्यतीत कर सकते हैं और बाद में महसूस करते हैं कि समय बर्बाद हो गया है। लेकिन आपने क्या सीखा? आपने ऐसी ही परिस्थिति में उस गलती को दोहराना नहीं सीखा।

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

क्या होगा अगर कोई ऐसा करने से प्यार करता है, जो अभी तक पूरी तरह से महसूस नहीं किया है, यहाँ सवाल पूछते हैं और कई उत्तरों द्वारा दूर / बंद कर दिया जाता है, जो आपसे बेहतर जानता है! और कभी भी उन अत्यधिक भुगतान किए गए प्रोग्रामरों में से एक नहीं बन जाता है?

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

  1. जब तक आप वास्तव में पोस्ट-इन्क्रीमेंट नहीं चाहते तब तक पूर्व-वृद्धि
  2. लूप के भीतर कंटेनर पर कॉलिंग आकार () के बजाय एक निरंतर स्थानीय आकार चर का उपयोग करते हुए कंटेनरों के लिए लूप लिखना।

EDIT: उद्योग में 8 और वर्षों के बाद अपडेट। विधानसभा जानें। जानें कि कैसे ऑप्टिमाइज़र काम करते हैं और जो विधानसभा वे उत्पन्न करते हैं (CompilerExplorer उसके लिए एक महान उपकरण है)। मैं टेस्ट बिल्ड्स (आंतरिक परीक्षण के लिए अनुकूलित बिल्ड) में अनगिनत क्रैश पर चला गया हूं, जहां आप डीबग प्रतीकों के साथ भी डिबगर पर भरोसा नहीं कर सकते। कंपाइलर ने बहुत सी चीजों को अनुकूलित किया है और क्रैश डंप से बग को खोजने के लिए असेंबली आपके बहुमूल्य जानकारी का एकमात्र स्रोत है। यदि आप भाग्यशाली हैं और पहली बार बिल्ड कतार में हैं तो प्रत्येक बिल्ड में 30-40 मिनट लगते हैं - इसलिए आप बग को अलग करने के लिए कुछ पारंपरिक तकनीकों पर भरोसा नहीं कर सकते। मल्टीप्लेयर चीजों को बदतर बनाता है। असेंबली को जानना और ऑप्टिमाइज़्ड असेंबली को कैसे पढ़ना है, यह आपको बेहतर और अंततः टीम के लिए अधिक मूल्यवान बना देगा।


1
संकलक के अनुकूलन के बारे में अच्छी बात। वे महान हैं, लेकिन वे एकदम सही हैं, और कुछ लोगों का मानना ​​है कि इसके विपरीत, आमतौर पर एक साधारण अनुकूलन खोजना मुश्किल नहीं है जो एक संकलक ने नहीं बनाया।
आआआआआआआआआआआ आआआआआआ

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

1
इसके अलावा, "मैंने अभी-अभी कंपाइलर लिखने का तरीका सीखा है" नहीं, आपने नहीं किया। आपने देखा कि एक विशिष्ट सीपीयू के लिए एक विशिष्ट दिनचर्या कैसे संकलित की गई थी। सीखने को अनुकूलित विधानसभा दिनचर्या को कैसे लागू किया जाए, यह देखने की आवश्यकता है कि संकलक ने एक दिनचर्या को कैसे संकलित किया है। आपको यह समझना होगा कि संकलक ने उस विशिष्ट सी ++ कोड को पुन: उत्पन्न करने के लिए उन ऑपकोड को क्यों चुना। और इसके लिए सीपीयू, इंस्ट्रक्शन शेड्यूलिंग, और इसके बाद के अंतरंग ज्ञान की आवश्यकता होती है। इसे सामान्य करने के लिए वर्षों का अनुभव चाहिए ; तुम बस दिनचर्या के एक जोड़े को डिकोड करके नहीं मिलेगा।
निकोल बोलस

7
तो, ए के लिए -1: वास्तव में विधानसभा-अनुकूलित दिनचर्या लिखने के बारे में सवाल का जवाब नहीं। बी: गलत तरीके से प्रस्तुत करना यह सीखना आसान है कि असेंबली-अनुकूलित दिनचर्या लिखने में कंपाइलर को कैसे हराया जाए। और सी: एल्गोरिदम-स्तर के अनुकूलन से पहले असेंबली-स्तरीय अनुकूलन को देखने के लिए एक प्रोग्रामर को प्रोत्साहित करना । यहां तक ​​कि उन उच्च भुगतान वाले "उद्योग में विशेषज्ञ" आपको बताएंगे कि वह गाड़ी को घोड़े से पहले डाल रहा है।
निकोल बोलस

2
@ समसौरा: किसी ने नहीं कहा कि लोगों को "नासमझी को समझना और कोड का अनुकूलन कैसे करना चाहिए।" यह कोई धार्मिक बहस नहीं है; यह साधारण बात है। लोगों ने केवल कुछ दिनचर्या के लिए मैन-सेंचुरी हैंड-ऑप्टिमाइज़िंग खर्च किया है ताकि यह पता लगाया जा सके कि इसका मतलब समग्र प्रदर्शन के लिए कुछ भी नहीं है। एल्गोरिदम का अनुकूलन करना सीखना एक अत्यधिक मूल्यवान कौशल है। असेंबली पढ़ना सीखना एक अर्ध-मूल्यवान कौशल है। असेंबली रूटीन लिखना सीखना एक ऐसा कौशल है जो केवल शायद ही कभी उपयोग किया जाता है। और इन दिनों, सबसे अच्छा अनुकूलन बेहतर कैश उपयोग से आते हैं, न कि हाथ विधानसभा।
निकोल बोलस

22

आपको जो पहला टिप मिलेगा वह यह है - नहीं।

आधुनिक संकलक वास्तव में अनुकूलन कोड में वास्तव में बहुत अच्छे हैं, और आपके द्वारा लिखी गई किसी भी आत्म-लुढ़काया विधानसभा भाषा की तुलना में इसका बेहतर काम करने की अधिक संभावना होगी।

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

इस मामले में भी आप नहीं चाहते होंगे। आपको यह निश्चित करने की आवश्यकता है कि आपके लिए कोई निरंतर रखरखाव ओवरहेड नहीं होने वाला है। आप 6 महीने के समय में इस कोड में वापस आ सकते हैं और इसके भाग को संशोधित कर सकते हैं, या आपको एक अत्यंत सूक्ष्म बग मिल सकता है जो असेंबली भाषा संस्करण में ठीक करने के लिए अधिक कठिन हो सकता है। यहां तक ​​कि अगर आपको लगता है कि आपने सभी बग्स पर काम किया है, तो एक बार जब आपका कार्यक्रम सार्वजनिक बग पर चला जाता है, तो आपने कभी सोचा भी नहीं था कि यह आपके लिए एक वास्तविकता बन जाएगा। यह काफी एक आंख खोलने वाला (और एक विनम्र अनुभव) है।

और यहां तक ​​कि अगर आप इसे स्वीकार करने में खुश हैं, तो आप अभी भी पा सकते हैं कि कोई भी औसत दर्जे का प्रदर्शन सुधार नहीं है क्योंकि आपका मुख्य अड़चन आपके कार्यक्रम में पूरी तरह से अलग हो सकता है। तो यह मुझे फिर से नंबर 1 पर लाता है। मत करो।


15

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

यह कहने के बाद, मैं हाल ही में इस पर हुआ , जो विशेष रूप से गेम डेवलपर्स के लिए x86 ASM सीखने की दिशा में एक अच्छा मार्ग हो सकता है।


परिशिष्ट

मेरे सिर के ऊपर से दो स्रोत:

इसके अतिरिक्त, शोध पत्र पढ़ना बुद्धिमानों की विचार प्रक्रियाओं का पालन करने का एक शानदार तरीका है क्योंकि वे बेहतर प्रदर्शन के लिए एल्गोरिदम का अनुकूलन करते हैं। सबसे अधिक बार, लाभ द्वारा देखा जाता है:

  • सबसे महंगे ऑपरेशन (div, SQRT, ट्रिगर ऑप्स, और सशर्त, मुख्य रूप से) के उपयोग को कम करना;
  • अधिक कुशल डेटा संरचनाओं, मेमोरी संरेखण और कम सशर्तियों के उपयोग के माध्यम से कैश प्रदर्शन में सुधार;
  • बेहतर प्रदर्शन के लिए स्वीकार्य क्षेत्रों में उत्पादन की गुणवत्ता को कम करना;
  • वेक्टराइजेशन (SIMD);
  • समानांतरकरण (थ्रेडिंग, GPU में शिफ्टिंग कार्यों को शामिल करता है);
  • और निश्चित रूप से (तेजी से शायद ही कभी) हाथ से कोडित विधानसभा। सी / सी ++ असेंबली का निरीक्षण करने के लिए पहले देखें कि संकलक गैर-इष्टतम विकल्प कहां बना रहा है, बिल्कुल। यह आपको पुराने कागजात में 80 और 90 के दशक के आईएमई से अधिक मिलेगा।

उद्योग में नीचे फ़िल्टर करने के लिए उस ज्ञान की प्रतीक्षा करने के बजाय, पढ़ना अनुसंधान आपको अपने क्षेत्र के किनारे पर रखता है।


आप एल्गोरिथ्म ऑप्टिमाइज़ेशन के बारे में बात करते हैं, लेकिन आप इस पर कोई जानकारी नहीं देते हैं, अगर हम आपकी सलाह मानें और उस पर गौर करें तो क्या आप कुछ दिशा दे सकते हैं?
स्कीथ

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

@NickWiggill शोध पत्रों का आपका सामान्य स्रोत क्या है?
kizzx2

3

मुझे लगता है कि यह बहुत जल्दी हो सकता है।

वैसे भी, यह समझना महत्वपूर्ण है कि कंपाइलर स्वयं असेंबली समतुल्य की तुलना में धीमे कोड का उत्पादन नहीं करता है, आपको केवल उसी असेंबली कोड को लिखने से कोई प्रदर्शन नहीं मिलता है जैसा कि कंपाइलर करेगा।

शुरुआत के लिए कम से कम विधानसभा-मुक्त अनुकूलन पर ध्यान केंद्रित करें। इगोर ओस्त्रोव्स्की के कुछ अच्छे लेख हैं जो कुछ मूल बातें प्रदर्शित करते हैं: http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/

कृपया ध्यान दें कि शाखा के मिसप्रिंट और कैश मिसेज़ हैं, जिन्हें आपको मुख्य रूप से अनुकूलित करना चाहिए, भले ही आपको कुछ अतिरिक्त अंकगणितीय ऑपरेशन करके भुगतान करना पड़े, यह आमतौर पर एक अप्रत्याशित शाखा से बचने या बहुत अधिक मेमोरी से यादृच्छिक रूप से पढ़ने के लिए इसके लायक है।

और हां, सबसे महत्वपूर्ण बात, पहले अपने एल्गोरिथ्म का अनुकूलन करें। एक तेज़ एल्गोरिथम का धीमी कार्यान्वयन लगभग हमेशा तेज़ एल्गोरिथम के तेज़ कार्यान्वयन से अधिक तेज़ होगा।


2

यह पुस्तक पाठ्य पुस्तक के लिए असाधारण रूप से अच्छी है। लेकिन यह विशेष रूप से अनुकूलन की दिशा में सक्षम नहीं है। असेंबली भाषा x86 प्रोसेसर, 6 वें संस्करण के लिए

यह MASM का उपयोग करके असेंबली के मूल सिद्धांतों को पढ़ाने के बारे में अधिक है। फिर पुस्तक के अंत की ओर यह सी ++ के साथ इनलाइन असेंबली में कैसे हो जाता है और इसे बड़े कार्यक्रमों में एकीकृत किया जाता है।

मैंने इसे यहां रखा क्योंकि यह इससे पहले कि आप इसके साथ कार्यक्रमों का अनुकूलन करना सीखें, विधानसभा की बुनियादी बातों को सीखना समझ में आता है।

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


1
"यह समझ में आता है कि इससे पहले कि आप इसके साथ कार्यक्रमों का अनुकूलन कैसे सीखें, विधानसभा की बुनियादी बातों को सीखें" - अच्छी सलाह।
मैक्सिमस मिनिमस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.