वैज्ञानिक सॉफ्टवेयर अन्य सॉफ्टवेयर से उतना अलग नहीं है, जितना कि यह जानने के लिए कि ट्यूनिंग की आवश्यकता क्या है।
मेरे द्वारा उपयोग की जाने वाली विधि यादृच्छिक ठहराव है । यहाँ कुछ स्पीडअप के बारे में बताया गया है:
यदि समय का एक बड़ा हिस्सा जैसे कार्यों में खर्च किया जाता है log
और exp
, मैं देख सकता हूं कि उन कार्यों के तर्क क्या हैं, उन बिंदुओं के एक समारोह के रूप में, जिनसे उन्हें बुलाया जा रहा है। अक्सर उन्हें एक ही तर्क के साथ बार-बार बुलाया जा रहा है। यदि हां, तो याद रखना एक बड़े पैमाने पर स्पीडअप कारक पैदा करता है।
अगर मैं BLAS या LAPACK फ़ंक्शंस का उपयोग कर रहा हूं, तो मुझे पता चल सकता है कि सरणियों की प्रतिलिपि बनाने के लिए रूटीन का एक बड़ा हिस्सा खर्च किया जाता है, मैट्रिस, चोल्स्की ट्रांसफॉर्म आदि को गुणा किया जाता है।
सरणियों की प्रतिलिपि बनाने की दिनचर्या गति के लिए नहीं है, यह सुविधा के लिए है। आप पा सकते हैं कि यह करने के लिए एक कम सुविधाजनक, लेकिन तेज़ तरीका है।
मेट्रिसेस को गुणा या उल्टा करने के लिए रूटीन लें या चोल्स्की ट्रांसफ़ॉर्म लें, ऊपरी या निचले त्रिकोण के लिए 'यू' या 'एल' जैसे विकल्प निर्दिष्ट करने वाले वर्ण तर्क हैं। फिर, सुविधा के लिए वहाँ हैं। मुझे जो मिला था, चूंकि मेरे मैट्रिस बहुत बड़े नहीं थे, इसलिए रूटीन आधे से अधिक समय बिता रहे थे और पात्रों की तुलना करने के लिए सबरूटिन को कॉल करने के लिए सिर्फ विकल्पों को समझने के लिए। सबसे महंगी गणित दिनचर्या के विशेष उद्देश्य के संस्करणों को लिखने से बड़े पैमाने पर स्पीडअप का उत्पादन हुआ।
अगर मैं बाद में विस्तार कर सकता हूं: मैट्रिक्स-मल्टीप्ल रूटीन डीजीईएमएम अपने चरित्र तर्कों को डिकोड करने के लिए एलएसएएमई कहता है। समावेशी प्रतिशत समय (केवल देखने योग्य) को "अच्छे" के रूप में माना जाने वाला प्रोफाइलर कुल मिलाकर, कुल प्रतिशत के कुछ प्रतिशत का उपयोग करके DGEMM दिखा सकता है, जैसे कि 80%, और LSAME कुल समय के कुछ प्रतिशत का उपयोग करके, 50% की तरह। पूर्व को देखते हुए, आपको यह कहने के लिए लुभाया जाएगा कि "अच्छी तरह से इसे भारी रूप से अनुकूलित किया जाना चाहिए, इसलिए मैं इस बारे में बहुत कुछ नहीं कर सकता"। उत्तरार्द्ध को देखते हुए, आपको यह कहने के लिए लुभाया जाएगा "हुह? यह सब क्या है? यह सिर्फ एक छोटी सी दिनचर्या है। यह प्रोफाइलर गलत होना चाहिए!"
यह गलत नहीं है, यह आपको वह नहीं बता रहा है जो आपको जानना चाहिए। क्या यादृच्छिक रोक आपको दिखाता है कि DGEMM स्टैक नमूनों के 80% पर है, और LSAME 50% पर है। (आपको पता लगाने के लिए बहुत सारे नमूनों की आवश्यकता नहीं है। 10 आमतौर पर बहुत सारे हैं।) उन नमूनों में से कई पर अधिक क्या है, DGEMM कोड के कुछ अलग लाइनों से LSAME को कॉल करने की प्रक्रिया में है ।
तो अब आप जानते हैं कि दोनों दिनचर्या इतना समावेशी समय क्यों ले रही हैं। आप यह भी जानते हैं कि आपके कोड में उन्हें यह सब खर्च करने के लिए कहां से बुलाया जा रहा है। यही कारण है कि मैं यादृच्छिक रोक का उपयोग करता हूं और प्रोफाइलरों का एक पीलिया वाला दृश्य लेता हूं, चाहे वे कितनी भी अच्छी तरह से बने हों। वे आपको यह बताने में रुचि रखते हैं कि क्या हो रहा है।
यह मानना आसान है कि गणित लाइब्रेरी रूटीन को एनटीएच डिग्री के लिए अनुकूलित किया गया है, लेकिन वास्तव में वे उद्देश्यों की एक विस्तृत श्रृंखला के लिए उपयोग करने योग्य हैं। आपको यह देखने की ज़रूरत है कि वास्तव में क्या चल रहा है, न कि यह मान लेना आसान है।
जोड़ा: तो अपने पिछले दो सवालों के जवाब देने के लिए:
पहले प्रयास करने के लिए सबसे महत्वपूर्ण चीजें क्या हैं?
10-20 स्टैक नमूने लें, और उन्हें केवल संक्षेप में न बताएं, समझें कि प्रत्येक आपको क्या बता रहा है। इसे पहले, अंतिम और बीच में करें। (कोई "कोशिश" नहीं है, युवा स्काईवॉकर।)
मुझे कैसे पता चलेगा कि मुझे कितना प्रदर्शन मिल सकता है?
स्टैक के नमूने आपको किस अंश का बहुत मोटा अनुमान देंगे xβ(s+1,(n−s)+1)sn1/(1−x)n=10s=5x
xx
जैसा कि मैंने आपको पहले बताया है, आप पूरी प्रक्रिया दोहरा सकते हैं जब तक कि आप किसी भी अधिक नहीं कर सकते, और मिश्रित गति अनुपात काफी बड़ा हो सकता है।
(s+1)/(n+2)=3/22=13.6%।) निम्नलिखित ग्राफ में निम्न वक्र इसका वितरण है:
विचार करें कि क्या हमने 40 से अधिक नमूने लिए हैं (एक समय में मेरे पास जितना अधिक है) और केवल उनमें से दो पर एक समस्या देखी गई। उस समस्या की अनुमानित लागत (मोड) 5% है, जैसा कि लम्बे वक्र पर दिखाया गया है।
एक "झूठी सकारात्मक" क्या है? यह है कि यदि आप एक समस्या को ठीक करते हैं तो आपको उम्मीद की तुलना में इस तरह के एक छोटे से लाभ का एहसास होता है, कि आपको इसे ठीक करने का अफसोस है। घटता दिखाते हैं (यदि समस्या "छोटी" है) कि, जबकि लाभ यह दिखाने वाले नमूनों के अंश से कम हो सकता है, औसतन यह बड़ा होगा।
एक अधिक गंभीर जोखिम है - एक "गलत नकारात्मक"। वह तब है जब कोई समस्या है, लेकिन यह नहीं मिली है। (इसमें योगदान "पुष्टिकरण पूर्वाग्रह" है, जहां साक्ष्य के अभाव को अनुपस्थिति के साक्ष्य के रूप में माना जाता है।)
आपको एक प्रोफाइलर (एक अच्छा) के साथ क्या मिलता है क्या आपको अधिक सटीक माप प्राप्त होती है (इस प्रकार गलत सकारात्मकता की संभावना कम है), वास्तव में समस्या क्या है (इस प्रकार इसे खोजने और प्राप्त करने की कम संभावना कोई भी लाभ)। यह समग्र गति को सीमित करता है जिसे प्राप्त किया जा सकता है।
मैं प्रोफाइलरों के उपयोगकर्ताओं को वास्तव में व्यवहार में आने वाले स्पीडअप कारकों की रिपोर्ट करने के लिए प्रोत्साहित करूंगा।
फिर से बनाए जाने का एक और बिंदु है। झूठी सकारात्मकता के बारे में पेड्रो का सवाल।
उन्होंने कहा कि अत्यधिक अनुकूलित कोड में छोटी समस्याओं के लिए नीचे उतरने में कठिनाई हो सकती है। (मेरे लिए, एक छोटी समस्या वह है जो कुल समय का 5% या उससे कम है।)
चूंकि 5% को छोड़कर पूरी तरह से इष्टतम होने वाले कार्यक्रम का निर्माण पूरी तरह से संभव है, इस बिंदु को केवल अनुभवजन्य रूप से संबोधित किया जा सकता है, जैसा कि इस उत्तर में है । अनुभवजन्य अनुभव से सामान्यीकरण करने के लिए, यह इस प्रकार है:
एक कार्यक्रम, जैसा कि लिखा गया है, आमतौर पर अनुकूलन के लिए कई अवसर होते हैं। (हम उन्हें "समस्याएं" कह सकते हैं, लेकिन वे अक्सर पूरी तरह से अच्छे कोड होते हैं, बस काफी सुधार करने में सक्षम होते हैं।) यह आरेख एक कृत्रिम कार्यक्रम दिखाता है जिसमें कुछ समय (100s, कहते हैं), और इसमें समस्याएं A, B, C शामिल हैं। ... कि, जब पाया और तय किया, तो मूल 100 के 30%, 21% आदि को बचाएं।
ध्यान दें कि समस्या एफ मूल समय का 5% है, इसलिए यह "छोटा" है, और 40 या अधिक नमूनों के बिना खोजना मुश्किल है।
हालांकि, पहले 10 नमूने आसानी से समस्या ए पाते हैं। ** जब यह तय हो जाता है, तो 100/70 = 1.43x के स्पीडअप के लिए कार्यक्रम केवल 70s लेता है। यह न केवल कार्यक्रम को तेज बनाता है, यह उस अनुपात से, शेष समस्याओं द्वारा लिया गया प्रतिशत बढ़ाता है। उदाहरण के लिए, समस्या B ने मूल रूप से 21s लिया जो कुल का 21% था, लेकिन A को हटाने के बाद, B 70 में से 21 या 30% लेता है, इसलिए यह पता लगाना आसान है कि पूरी प्रक्रिया कब दोहराई जाती है।
एक बार प्रक्रिया को पांच बार दोहराया जाता है, अब निष्पादन का समय 16.8 है, जिसमें से समस्या एफ 30% है, 5% नहीं, इसलिए 10 नमूने आसानी से मिल जाते हैं।
तो बात यही है। जाहिर है, कार्यक्रमों में आकारों के वितरण की समस्याओं की एक श्रृंखला होती है, और किसी भी समस्या को पाया और तय किया जाता है जो शेष लोगों को ढूंढना आसान बनाता है। इसे पूरा करने के लिए, किसी भी समस्या को समाप्त नहीं किया जा सकता है, क्योंकि यदि वे हैं, तो वे समय लेते हैं, कुल गति को सीमित करते हैं, और शेष समस्याओं को बढ़ाने में विफल रहते हैं।
इसीलिए जो समस्याएं छिप रही हैं, उनका पता लगाना बहुत जरूरी है ।
यदि एफ के माध्यम से समस्याएं आती हैं और तय की जाती हैं, तो स्पीडअप 100 / 11.8 = 8.5x है। यदि उनमें से एक छूट गया है, उदाहरण के लिए डी, तो स्पीडअप केवल 100 / (11.8 + 10.3) = 4.5x है।
यह झूठी नकारात्मक के लिए भुगतान की गई कीमत है।
इसलिए, जब प्रोफाइलर कहता है कि "यहां कोई महत्वपूर्ण समस्या नहीं है" (यानी अच्छा कोडर, यह व्यावहारिक रूप से इष्टतम कोड है), शायद यह सही है, और शायद यह नहीं है। (एक झूठी नकारात्मक ।) आप निश्चित रूप से नहीं जानते हैं कि उच्च गति के लिए तय करने के लिए और अधिक समस्याएं हैं, जब तक कि आप किसी अन्य प्रोफाइलिंग विधि की कोशिश न करें और यह पता लगाएं कि क्या हैं। मेरे अनुभव में, प्रोफाइलिंग विधि को बड़ी संख्या में नमूनों की आवश्यकता नहीं है, संक्षेप में, लेकिन नमूनों की एक छोटी संख्या, जहां अनुकूलन के किसी भी अवसर को पहचानने के लिए प्रत्येक नमूने को अच्छी तरह से समझा जाता है।
2/0.3=6.671 - pbinom(1, numberOfSamples, sizeOfProblem)
1 - pbinom(1, 20, 0.3) = 0.9923627
xβ(s+1,(n−s)+1)nsy1/(1−x)xyy−1BetaPrime वितरण। मैंने इसे व्यवहार में लाते हुए 2 मिलियन नमूनों के साथ अनुकरण किया:
distribution of speedup
ratio y
s, n 5%-ile 95%-ile mean
2, 2 1.58 59.30 32.36
2, 3 1.33 10.25 4.00
2, 4 1.23 5.28 2.50
2, 5 1.18 3.69 2.00
2,10 1.09 1.89 1.37
2,20 1.04 1.37 1.17
2,40 1.02 1.17 1.08
3, 3 1.90 78.34 42.94
3, 4 1.52 13.10 5.00
3, 5 1.37 6.53 3.00
3,10 1.16 2.29 1.57
3,20 1.07 1.49 1.24
3,40 1.04 1.22 1.11
4, 4 2.22 98.02 52.36
4, 5 1.72 15.95 6.00
4,10 1.25 2.86 1.83
4,20 1.11 1.62 1.31
4,40 1.05 1.26 1.14
5, 5 2.54 117.27 64.29
5,10 1.37 3.69 2.20
5,20 1.15 1.78 1.40
5,40 1.07 1.31 1.17
(n+1)/(n−s)s=ny
यह स्पीडअप कारकों के वितरण की एक साजिश है, और उनके साधन, 5, 4, 3 और 2 नमूनों में से 2 हिट के लिए। उदाहरण के लिए, यदि 3 नमूने लिए गए हैं, और उनमें से 2 एक समस्या पर हिट हैं, और उस समस्या को हटाया जा सकता है, औसत स्पीडअप कारक 4x होगा। यदि 2 हिट केवल 2 नमूनों में देखे जाते हैं, तो औसत स्पीड अप अपरिभाषित है - वैचारिक रूप से क्योंकि अनंत छोरों वाले कार्यक्रम गैर-शून्य संभावना के साथ मौजूद हैं!